OPENSSLを使った証明機関(CA)の構築ならびに証明書発行

最終更新日:2007年9月2日

Linuxには、SSL用のツールとしてOpensslという代表的なSSLの実装が存在します。 以下ではこのOpensslを使った自己認証局(CA)の構築方法について述べていきます。
自己認証局を使うことで、社内(組織内)で利用であればベリサインなどの商用の認証局を使わずに、サーバ証明証書を作成することが可能になります。(外部公開用のサーバなどでは、運用上の制限や「証明の保証」という点で問題があるのでベリサインなどの商用認証局でサーバ証明書を証明してもらうようにすべきでしょう)

■CAの構築

Debianではドキュメントは/usr/share/doc/openssl以下にある。 以下では次のような条件でCAを構築するものとします。
設定内容 設定値
CA証明書の有効期限 7300日(約20年)
サーバ証明書の有効期限 3650(約10年)
CA関連のデータディレクトリ /etc/ssl/CA
CA用のプライベートキーファイル cakey.pem
CA証明書のファイル cacert.pem
サーバ署名要求ファイル csr.pem
サーバ証明書 server.pem
サーバプライベートキー server.key
カントリー名 JP
県(州)名 Chiba-ken
地域名 Chiba-shi
組織名 ROBATA
所属名 HOME
通称 sv.robata.org

1.CA構築用シェルファイルの編集

CAを簡単に構築する為のツールとして、 /usr/lib/ssl/misc ディレクトリに 「CA.sh」というシェルファイルがあるのでこれを編集します。

(/usr/lib/ssl/misc/CA.sh を変更)

# DAYS="-days 365"      # 1 year
# CADAYS="-days 1095"   # 3 years
DAYS="-days 3650"    # 10 year
CADAYS="-days 7300"  #  20 years
REQ="$OPENSSL req $SSLEAY_CONFIG"
CA="$OPENSSL ca $SSLEAY_CONFIG"
VERIFY="$OPENSSL verify"
X509="$OPENSSL x509"

# CATOP=./demoCA
# CAKEY=./cakey.pem
# CACERT=./cacert.pem
CATOP=/etc/ssl/CA
CAKEY=./cakey.pem
CAREQ=./careq.pem
CACERT=./cacert.pem
    

2.Openssl の設定ファイル編集

次に Openssl がデフォルトで利用するパラメータファイル(openssl.conf)も上記に合わせて設定しておきましょう。

(/etc/ssl/openssl.cnf を変更)

 ::
####################################################################
[ ca ]
default_ca      = CA_default            # The default ca section

####################################################################
[ CA_default ]

dir             = /etc/ssl/CA           # Where everything is kept
certs           = $dir/certs            # Where the issued certs are kept
crl_dir         = $dir/crl              # Where the issued crl are kept
database        = $dir/index.txt        # database index file.
#unique_subject = no                    # Set to 'no' to allow creation of
default_days=11000                      # several ctificates with same subject.

certificate     = $dir/cacert.pem
private_key     = $dir/private/cakey.pem
     ::
default_days    = 3650
     ::
[ policy_match ]
countryName             = match
# stateOrProvinceName     = match
stateOrProvinceName     = optional
organizationName        = match
     ::
[ req_distinguished_name ]
countryName                     = Country Name (2 letter code)
# countryName_default           = AU
countryName_default             = JP
countryName_min                 = 2
countryName_max                 = 2

stateOrProvinceName             = State or Province Name (full name)
# stateOrProvinceName_default   = Some-State
stateOrProvinceName_default     = Chiba-ken

# localityName                  = Locality Name (eg, city)
localityName                    = Chiba-shi

0.organizationName              = Organization Name (eg, company)
# 0.organizationName_default    = Internet Widgits Pty Ltd
0.organizationName_default      = ROBATA 
      
organizationalUnitName          = Organizational Unit Name (eg, section)
#organizationalUnitName_default =

commonName                      = Common Name (eg, YOUR name)
commonName_max                  = 64

emailAddress                    = Email Address
emailAddress_max                = 64     ::
[ usr_cert ]
# basicConstraints=CA:FALSE
basicConstraints=CA:TRUE

3.CAの構築

以下のコマンドを実行してCAを構築します。
# /usr/lib/ssl/misc/CA.sh -newca
以下のような画面が表示されるので、必要な箇所で入力を行います。
CA certificate filename (or enter to create)

Making CA certificate ...
Generating a 1024 bit RSA private key
...++++++
................++++++
writing new private key to '/etc/ssl/CA/private/./cakey.pem'
Enter PEM pass phrase: パスワード設定
Verifying - Enter PEM pass phrase: パスワード設定(確認)
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [JP]: 
State or Province Name (full name) [Chiba-ken]: 
Chiba-shi []:
Organization Name (eg, company) [ROBATA]:
Organizational Unit Name (eg, section) []:HOME
Common Name (eg, YOUR name) []:sv.robata.org
Email Address []:root@robata.org

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for /etc/ssl/CA/private/./cakey.pem: 先程設定したパスワードを入力 
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 0 (0x0)
Validity
Not Before: Sep 1 02:01:46 2007 GMT
Not After : Oct 13 02:01:46 2037 GMT
Subject:
countryName = JP
stateOrProvinceName = Chiba-ken
organizationName = ROBATA
organizationalUnitName = HOME
commonName = sv.robata.org
emailAddress = root@robata.org
X509v3 extensions:
X509v3 Basic Constraints:
CA:TRUE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
59:72:6B:E5:48:8E:7E:23:35:90:8E:E2:5C:8C:42:24:6C:E3:EE:89
X509v3 Authority Key Identifier:
keyid:59:72:6B:E5:48:8E:7E:23:35:90:8E:E2:5C:8C:42:24:6C:E3:EE:89

Certificate is to be certified until Oct 13 02:01:46 2037 GMT (11000 days)

Write out database with 1 new entries
Data Base Updated
#
これで/usr/local/CA/以下に必要なファイルが作成されCAの作成は終了です。 ここまでの作業で
が作成されています。

作成した証明書は以下のコマンドで内容の確認ができます。
openssl x509 -in cacert.pem -text

■サーバー証明書の作成

CAから証明を受けたいサーバ(例えばWWWサーバ)では、以下の手順で署名要求書(CSR)を作成し、それを認証局(CA)に何らかの方法で送り、CAにて証明書を作成してもらう必要があります。(CAだけを構築したい場合はこの章を読み飛ばしてください)
(サーバ証明書の入手手順: サーバ証明書が必要なサーバ側での作業になります)
  1. 秘密鍵(プライベートキー)を作成
    証明書が必要なサーバ側で以下の方法で秘密鍵を作成する。

    # cd /etc/ssl/private
    # openssl genrsa -des3 -out server.key 1024 ----(ここではキー長を1024バイトにしてますが、必要に応じて可変してください)
    Generating RSA private key, 512 bit long modulus
    .++++++++++++
    ...++++++++++++
    e is 65537 (0x10001)
    Enter pass phrase for robata_server.key: サーバ用プライベートキーファイルのパスフレーズ設定
    Verifying - Enter pass phrase for robata_server.key: サーバ用プライベートキーファイルのパスフレーズ設定(確認用)

    これで、プライベートキーの作成は完了です。 ただし、このキーは暗号化された状態で、このキーをサーバでそのまま利用するとサーバの起動時にパスフレーズを求めてきてしまいますので、暗号化を解除したキーも作成しておきます。

    # openssl rsa -in server.key -out nopass_server.key
  2. 署名要求書(CSR)を作成

    # cd /etc/ssl
    # openssl req -new -days 3650 -key private/server.key -out csr.pem

    Enter pass phrase for private/robata_server.key: 先ほどのサーバ用パスフレーズを入力
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [JP]:
    State or Province Name (full name) [Chiba-ken]:
    Chiba-shi []:
    Organization Name (eg, company) [ROBATA]:
    Organizational Unit Name (eg, section) []:HOME
    Common Name (eg, YOUR name) []:sv.robata.org
    Email Address []:root@robata.org

    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:
    #

    以上で署名要求書(csr.pem) が作成されましたので、これをCAへ送ってサーバ証明書を作ってもらってください。
    なおCSRを作成の際に入力する「Country Name」〜「Email Address」などは、CAが自己認証局の場合にはCAと同じ値を指定してください。

  3. サーバ証明書に必要に応じてプライベートキーをマージ
    CAからサーバ証明書が送り返されてきたなら、必要に応じてプライベートキーとマージしてしてください。
    (WebサーバやメールのTLS化では、プライベートキーとマージが必要です)
    このときマージするキーはパスフェーズを解除したキーを利用してください。

    ここでは、サーバ証明書がcertsディレクトリに「server.pem」として作成されたものとして説明します。(次章参照) 
    作成されたServer証明書に、サーバ署名要求の際に作成したサーバのプライベートキーファイルをマージします。

    # cat certs/server.pem private/nopass_server.key > server_cert.pem

    なお、証明書の確認を少しでも高速にしたい場合には、以下のようにCAの証明書も一緒にマージすると良いらしい。

    # cat certs/server.pem CA/cacert.pem private/nopass_server.key > server_cert.pem

    作成された証明書ファイル server_cert.pem がサーバ側での証明書となります。 これをWebサーバやメールサーバで利用していくことになります。

■CAによるサーバ署名要求への署名

CAが構成できていれば、以後は各サーバやクライアントからの署名要求書(CSR)に対してCAがそれを保証しサーバ証明書を発行する事が可能になります。(ただし自己認証局CAを第三者が信頼できるCAと認める事は余り無いので、自己認証局で公開用のWebサーバやメールサーバのサーバ証明書を作成しない方が良いでしょう。)

CAによるサーバ署名要求への署名手順

実際の署名の作業は次のようになります。
  1. openssl.conf を 署名用のものに作り替える。
# cd /etc/ssl/CA
# cp openssl.cnf openssl_server.cnf
openssl_server.conf は CA を作成するための設定となっているので、以下箇所を次のように変更しサーバ証明書を作成するための設定に直します。
( /etc/ssl/openssl_server.cnf )
 ::
 ::
[ usr_cert ]
# matsu_o basicConstraints=CA:FALSE
basicConstraints=CA:FALSE

nsCertType      = server
::
CSRを使ってサーバ証明書ファイルを作成します。
# cd /etc/ssl
# openssl ca -config openssl_server.cnf -in csr.pem -keyfile CA/private/cakey.pem -cert CA/cacert.pem -out certs/server.pem
-in       サーバの署名要求書(CSR)ファイル
-keyfile 認証機関の秘密鍵ファイル
-cert    認証機関の証明書ファイル
-out     作成するサーバ証明書ファイル
Using configuration from openssl_server.cnf
Enter pass phrase for CA/private/cakey.pem: CAのパスフェーズ入力 
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Sep  1 05:45:26 2007 GMT
            Not After : Aug 31 05:45:26 2017 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Chiba-ken
            organizationName          = ROBATA
            organizationalUnitName    = HOME
            commonName                = sv.robata.org
            emailAddress              = root@robata.org
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                5E:D3:5C:EA:6C:98:59:DE:4E:28:B9:9D:27:54:7A:24:61:E5:B7:4E
            X509v3 Authority Key Identifier:
                keyid:59:72:6B:E5:48:8E:7E:23:35:90:8E:E2:5C:8C:42:24:6C:E3:EE:89

Certificate is to be certified until Aug 31 05:45:26 2017 GMT (3650 days)
Sign the certificate? [y/n]:y 

1 out of 1 certificate requests certified, commit? [y/n] y
Write out database with 1 new entries
Data Base Updated
#
以上で、サーバ証明書がcertsディレクトリに「server.pem」として作成されます。 作成したserver.pemをCSR依頼元に送付してください。

■ルート証明書をWindows用に作成

自己認証局で作成されたサーバ証明書を使った場合、このサーバにアクセスしたクライアントPCでは証明書を発行したCAを「信頼のおける認証局」として認めていないために、サーバ証明書が信頼できないというメッセージを出してきます。
これを避けるには、この証明書を使ったサーバにアクセスするクライアント側で、自己認証局の証明書をルート証明書として設定すれば、以後、この自己認証局は信頼されるようになりメッセージが出てこないようになります。Windows用にルート証明書を作るには、自己認証局(CA)のサーバで以下の手順で DER形式の証明を作成します。
# cd /etc/ssl/CA
# openssl x509 -inform pem -in cacert.pem -outform der -out cacert.cer
作成されたDER形式の cacert.cer をWindowsマシンへ送り、これを証明書としてインポートします。インポートは、[コントロールパネル]−[インターネットオプション]−[コンテンツ]−[証明書]−[信頼されたルート証明書]タブを開き、[インポート]ボタンを選択します。インポートするファイルとして cacert.cer を指定します。
証明書を配置する場所を確認してくるので、「証明書をすべて次のストアに配置する」を選択して「信頼されたルート証明機関」を選びます。

以上で、クライアントPCに自己認証局のルート証明書が配置されます。

CA ならびにサーバ証明書をセットしたサーバやクライアント、かならずDNSによる名前解決ができるようにしておいてください。 名前解決ができない場合には証明書のチェックで確認できなくなります。
また、この証明書を利用するクライアント側では、サーバへのアクセスにはIPアドレスではなくかならず、FQDN(DNSに登録されている正式な名前)でアクセスするようにしてください。

Home

Mailwebmaster@robata.org

Copyright© 1998-2003 ROBATA.ORG