最終更新日:2007年9月2日
Linuxには、SSL用のツールとしてOpensslという代表的なSSLの実装が存在します。 以下ではこのOpensslを使った自己認証局(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
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
次に 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
以下のコマンドを実行して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の作成は終了です。 ここまでの作業で
が作成されています。
- private/cakey.pem : 認証機関(CA)の秘密鍵
- cacert.pem : 認証機関(CA)の証明書
作成した証明書は以下のコマンドで内容の確認ができます。
openssl x509 -in cacert.pem -text
CAから証明を受けたいサーバ(例えばWWWサーバ)では、以下の手順で署名要求書(CSR)を作成し、それを認証局(CA)に何らかの方法で送り、CAにて証明書を作成してもらう必要があります。(CAだけを構築したい場合はこの章を読み飛ばしてください)
(サーバ証明書の入手手順: サーバ証明書が必要なサーバ側での作業になります)
- サーバの秘密鍵(プライベートキー)を作成
- プライベートキーを使い署名要求書(CSR)を作成
- CSRをCAに送付してサーバ証明書を作成してもらいそれを送り返してもらう。
- サーバ証明書に必要に応じてプライベートキーをマージする。
# 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が構成できていれば、以後は各サーバやクライアントからの署名要求書(CSR)に対してCAがそれを保証しサーバ証明書を発行する事が可能になります。(ただし自己認証局CAを第三者が信頼できるCAと認める事は余り無いので、自己認証局で公開用のWebサーバやメールサーバのサーバ証明書を作成しない方が良いでしょう。)
実際の署名の作業は次のようになります。
# 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依頼元に送付してください。
自己認証局で作成されたサーバ証明書を使った場合、このサーバにアクセスしたクライアント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へ
Copyright© 1998-2003 ROBATA.ORG