ApacheのSSL設定、認証機関の構築と証明書作成
http://www.atmarkit.co.jp/flinux/rensai/apache12/apache12b.html
独自に認証機関を構築して証明書を作成する。
認証機関は、OpenSSLの機能を利用して構築する。
opensslインストール。
# pkg_add -rv openssl
独自に認証機関を構築。OpenSSLのCA.shを使用する。
localhost# cp /usr/local/openssl/misc/CA.sh /usr/local/openssl/ localhost# /usr/local/openssl/CA.sh -h usage: CA -newcert|-newreq|-newca|-sign|-verify localhost# /usr/local/openssl/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 './demoCA/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) [AU]:JP State or Province Name (full name) [Some-State]:Kanagawa Locality Name (eg, city) []:Yokohama Organization Name (eg, company) [Internet Widgits Pty Ltd]:myhome Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:Yoshiaki Machi Email Address []:yoshiakimachi@gmail.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /etc/ssl/openssl.cnf Enter pass phrase for ./demoCA/private/./cakey.pem: 52915:error:28069065:lib(40):UI_set_result:result too small:/usr/src/secure/lib/libcrypto/../../../crypto/openssl/crypto/ui/ui_lib.c:849:You must type in 4 to 1023 characters Enter pass phrase for ./demoCA/private/./cakey.pem: Check that the request matches the signature Signature ok Certificate Details: Serial Number: 0 (0x0) Validity Not Before: Aug 12 21:22:54 2009 GMT Not After : Aug 11 21:22:54 2012 GMT Subject: countryName = JP stateOrProvinceName = Kanagawa organizationName = myhome commonName = Yoshiaki Machi emailAddress = yoshiakimachi@gmail.com X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 5C:69:04:8D:EB:D2:20:A4:CC:32:9E:A6:3D:D0:63:F8:44:B4:80:52 X509v3 Authority Key Identifier: keyid:5C:69:04:8D:EB:D2:20:A4:CC:32:9E:A6:3D:D0:63:F8:44:B4:80:52 Certificate is to be certified until Aug 11 21:22:54 2012 GMT (1095 days) Write out database with 1 new entries Data Base Updated localhost#
鍵ファイルの作成。OpenSSLを使用する。
localhost# touch ~/tmpfile localhost# /usr/local/bin/openssl genrsa -rand ~/tmpfile -des3 -out /usr/local/openssl/serverkey.pem 1024 0 semi-random bytes loaded Generating RSA private key, 1024 bit long modulus ...........++++++ ...................................................++++++ e is 65537 (0x10001) Enter pass phrase for /usr/local/openssl/serverkey.pem: Verifying - Enter pass phrase for /usr/local/openssl/serverkey.pem:
鍵ファイル serverkey.pem ができた。
コマンドを実行すると、認証機関構築のときと同様にパスフレーズの入力を求められる。
これは、鍵を参照するときの認証にも利用されるため、鍵を組み込んだ Apacheを起動するたびにパスフレーズが必要となる。
これでは不便というのであれば、鍵の生成後にパスフレーズを解除することもできる。ただし、パスフレーズによるセキュリティがなくなるので、鍵の内容を盗まれやすくなることに注意したい。
- randで指定するのは鍵の生成に用いるランダムなデータとして利用するファイル名。何でも構わない。
認証機関への申請書(CSR)の作成
サーバの鍵ファイルが作成できたら、その鍵を基に認証機関への申請書ファイルを作成する。
認証機関は、この申請書ファイルに基づいて署名付きの証明書を発行してくれる。もちろん、実際にはファイルのみでの審査ということはなく、必要書類の提出や契約も併せて行われる。
ファイルベースでの申請書の作成は、同じくOpenSSLを使って行う。申請書ファイルの作成は、独自に作成した認証機関を使う場合でも必要である。
# /usr/local/bin/openssl req -new -days 365 -key /usr/local/openssl/serverkey.pem -out /usr/local/openssl/csr.pem Unable to load config info from /usr/local/openssl/openssl.cnf # cd /usr/local/openssl/ # cp openssl.cnf.sample openssl.cnf # /usr/local/bin/openssl req -new -days 365 -key /usr/local/openssl/serverkey.pem -out /usr/local/openssl/csr.pem Enter pass phrase for /usr/local/openssl/serverkey.pem: 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) [AU]:JP State or Province Name (full name) [Some-State]:Kanagawa Locality Name (eg, city) []:Yokohama Organization Name (eg, company) [Internet Widgits Pty Ltd]:myhome Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:Yoshiaki Machi Email Address []:yoshiakimachi@gmail.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
- keyオプションには作成済みの鍵ファイルの名称を、-daysオプションには発行してもらう証明書の有効期限を指定する。
申請書 csr.pem ができた。
証明書の作成
申請書を作成したら、それを認証機関に送付して署名してもらう。実際に契約するのでなければ、独自に認証機関を構築するか、無料の試行サービスを利用するといいだろう。日本ベリサインなど。
今回は、先ほど作成した独自の認証機関を使って証明書を作成する。
localhost# /usr/local/bin/openssl ca -in /usr/local/openssl/csr.pem -keyfile /usr/local/openssl/demoCA/private/cakey.pem -cert /usr/local/openssl/demoCA/cacert.pem -out /usr/local/openssl/cert. localhost# /usr/local/bin/openssl ca -in /usr/local/openssl/csr.pem -keyfile /usr/local/openssl/demoCA/private/cakey.pem -cert /usr/local/openssl/demoCA/cacert.pem -out /usr/local/openssl/cert.pem Using configuration from /usr/local/openssl/openssl.cnf Enter pass phrase for /usr/local/openssl/demoCA/private/cakey.pem: Check that the request matches the signature Signature ok Certificate Details: Serial Number: 1 (0x1) Validity Not Before: Aug 12 21:41:45 2009 GMT Not After : Aug 12 21:41:45 2010 GMT Subject: countryName = JP stateOrProvinceName = Kanagawa organizationName = myhome commonName = Yoshiaki Machi emailAddress = yoshiakimachi@gmail.com X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: F6:14:40:89:C7:3E:81:3B:6C:8B:DC:24:E4:57:25:3D:E8:70:DE:C4 X509v3 Authority Key Identifier: keyid:5C:69:04:8D:EB:D2:20:A4:CC:32:9E:A6:3D:D0:63:F8:44:B4:80:52 Certificate is to be certified until Aug 12 21:41:45 2010 GMT (365 days) Sign the certificate? [y/n]:y failed to update database TXT_DB error number 2
コマンドを実行すると、鍵の作成時に指定したパスフレーズの入力を求められる。パスフレーズを入力すると、証明書に記載する情報(入力した国別コードや組織名称など)が表示され、本当に証明書を作成するかどうか確認される。そこで「y」を入力すれば、証明書が作成される。
はずだが、エラーがでた。
cert.pem の内容も空。
以下のページを参考。
http://www.kumachan.biz/pismo/blog/archives/2007/11/04_1552/
http://www.9203.net/pukiwiki/index.php?PKI%2FCA%2FOpenSSL#content_1_24
以前発行した証明書要求が失効されていない状態で証明書発行を行なうとこのエラーメッセージが出力される。らしい。
とりあえず作ったファイルを削除してもう一度やってみる。
# cd /usr/local/openssl/ # rm -r cert.pem csr.pem demoCA serverkey.pem
やっぱりまた同じエラーが出た。
データベースファイルであるindex.txtを直接編集して失効処理をしてみる。
# cat demoCA/index.txt V 120811215022Z 00 unknown /C=JP/ST=Kanagawa/O=myhome/CN=Yoshiaki Machi/emailAddress=yoshiakimachi@gmail.com # cp demoCA/index.txt demoCA/index.txt.ORG_20090814 # vim demoCA/index.txt(内容を全部削除)
再度、署名してみる。
# /usr/local/bin/openssl ca -in /usr/local/openssl/csr.pem -keyfile /usr/local/openssl/demoCA/private/cakey.pem -cert /usr/local/openssl/demoCA/cacert.pem -out /usr/local/openssl/cert.pem Using configuration from /usr/local/openssl/openssl.cnf Enter pass phrase for /usr/local/openssl/demoCA/private/cakey.pem: Check that the request matches the signature Signature ok Certificate Details: Serial Number: 1 (0x1) Validity Not Before: Aug 12 21:59:28 2009 GMT Not After : Aug 12 21:59:28 2010 GMT Subject: countryName = JP stateOrProvinceName = Kanagawa organizationName = myhome commonName = Yoshiaki Machi emailAddress = yoshiakimachi@gmail.com X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: CA:37:0A:D9:EF:F5:5F:49:62:04:D1:3C:82:23:15:24:99:0A:54:44 X509v3 Authority Key Identifier: keyid:7D:E6:AE:7F:FC:D6:97:41:AD:40:60:5D:04:02:96:C8:3C:AC:51:79 Certificate is to be certified until Aug 12 21:59:28 2010 GMT (365 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
今度は署名できた。
cert.pem の内容を見てみる。
# cat /usr/local/openssl/cert.pem Certificate: Data: Version: 3 (0x2) Serial Number: 1 (0x1) Signature Algorithm: sha1WithRSAEncryption Issuer: C=JP, ST=Kanagawa, O=myhome, CN=Yoshiaki Machi/emailAddress=yoshiakimachi@gmail.com Validity Not Before: Aug 12 21:59:28 2009 GMT Not After : Aug 12 21:59:28 2010 GMT Subject: C=JP, ST=Kanagawa, O=myhome, CN=Yoshiaki Machi/emailAddress=yoshiakimachi@gmail.com Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): 00:a8:c8:53:4d:53:db:5b:ae:46:28:30:c0:5c:d5: ec:d4:00:b0:98:7b:b0:b9:0a:5b:b6:eb:73:c3:37: fb:7d:ff:76:b6:f7:b3:b4:0b:78:b5:3a:ea:cb:56: d2:7f:c3:32:ae:28:25:3d:9c:13:9b:f9:82:e8:36: a1:95:b3:f6:f9:16:da:ea:1f:29:7d:2d:d1:7e:66: 79:b2:99:6b:29:2e:a6:37:d4:f8:bf:5c:8a:4c:3c: 85:15:4f:94:36:b5:cd:ab:70:c2:d1:1a:31:80:df: 13:7b:aa:39:50:a0:80:e3:eb:0e:0e:59:56:61:63: a0:31:24:99:4c:e5:ea:51:4f Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: CA:37:0A:D9:EF:F5:5F:49:62:04:D1:3C:82:23:15:24:99:0A:54:44 X509v3 Authority Key Identifier: keyid:7D:E6:AE:7F:FC:D6:97:41:AD:40:60:5D:04:02:96:C8:3C:AC:51:79 Signature Algorithm: sha1WithRSAEncryption 2a:30:d8:f0:f1:69:53:10:ce:b4:d0:44:84:6d:87:85:69:2a: df:ce:00:3c:97:85:7d:9a:3b:7c:1e:09:2a:98:29:57:6d:29: 54:3a:63:09:0f:37:6d:40:cb:c9:5b:2b:76:be:54:9b:78:e3: 02:95:de:5c:d9:23:a6:dc:64:b7:4f:67:47:31:00:bf:49:e3: 1b:84:1d:f7:95:a9:ab:60:e2:b3:4f:3c:32:25:22:07:f4:77: b8:54:ef:4f:51:85:63:37:e4:8d:90:8f:b4:f7:15:1c:d4:31: ad:cf:4a:0d:a6:2f:6d:a3:34:55:3e:fa:30:3e:1e:1c:50:39: 65:00 -----BEGIN CERTIFICATE----- MIIC1TCCAj6gAwIBAgIBATANBgkqhkiG9w0BAQUFADByMQswCQYDVQQGEwJKUDER MA8GA1UECBMIS2FuYWdhd2ExDzANBgNVBAoTBm15aG9tZTEXMBUGA1UEAxMOWW9z aGlha2kgTWFjaGkxJjAkBgkqhkiG9w0BCQEWF3lvc2hpYWtpbWFjaGlAZ21haWwu Y29tMB4XDTA5MDgxMjIxNTkyOFoXDTEwMDgxMjIxNTkyOFowcjELMAkGA1UEBhMC SlAxETAPBgNVBAgTCEthbmFnYXdhMQ8wDQYDVQQKEwZteWhvbWUxFzAVBgNVBAMT Dllvc2hpYWtpIE1hY2hpMSYwJAYJKoZIhvcNAQkBFhd5b3NoaWFraW1hY2hpQGdt YWlsLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAqMhTTVPbW65GKDDA XNXs1ACwmHuwuQpbtutzwzf7ff92tveztAt4tTrqy1bSf8MyriglPZwTm/mC6Dah lbP2+Rba6h8pfS3RfmZ5splrKS6mN9T4v1yKTDyFFU+UNrXNq3DC0RoxgN8Te6o5 UKCA4+sODllWYWOgMSSZTOXqUU8CAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgB hvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYE FMo3Ctnv9V9JYgTRPIIjFSSZClREMB8GA1UdIwQYMBaAFH3mrn/81pdBrUBgXQQC lsg8rFF5MA0GCSqGSIb3DQEBBQUAA4GBACow2PDxaVMQzrTQRIRth4VpKt/OADyX hX2aO3weCSqYKVdtKVQ6YwkPN21Ay8lbK3a+VJt44wKV3lzZI6bcZLdPZ0cxAL9J 4xuEHfeVqatg4rNPPDIlIgf0d7hU709RhWM35I2Qj7T3FRzUMa3PSg2mL22jNFU+ +jA+HhxQOWUA -----END CERTIFICATE-----
サーバの鍵ファイルと証明書ファイルが準備できたら、いよいよApacheの設定を行う。
# cp /usr/local/etc/apache/httpd.conf /usr/local/etc/apache/httpd.conf.ORG_20090814 # cp /usr/local/etc/apache/httpd.conf-dist /usr/local/etc/apache/httpd.conf # vim /usr/local/etc/apache/httpd.conf -- #ServerName www.example.com ServerName freebsd7.localhost SSLCertificateFile /usr/local/openssl/cert.pem #SSLCertificateFile /usr/local/etc/apache/ssl.crt/server.crt SSLCertificateKeyFile /usr/local/openssl/serverkey.pem #SSLCertificateKeyFile /usr/local/etc/apache/ssl.key/server.key -- # apachectl configtest Syntax OK # apachectl startssl Apache/1.3.41 mod_ssl/2.8.31 (Pass Phrase Dialog) Some of your private key files are encrypted for security reasons. In order to read them you have to provide us with the pass phrases. Server new.host.name:443 (RSA) Enter pass phrase: Ok: Pass Phrase Dialog successful. /usr/local/sbin/apachectl startssl: httpd started
スタート時に証明書作成時のパスフレーズを求められた。
起動できたような表示だが、実際は起動できてなかった。
続く。