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-----

SSLを使うためのApacheの設定

サーバの鍵ファイルと証明書ファイルが準備できたら、いよいよ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

スタート時に証明書作成時のパスフレーズを求められた。

起動できたような表示だが、実際は起動できてなかった。

続く。