背景
- Nginx で HTTPS 通信するため、証明書関連の設定で時間を要した
 - まとまったドキュメントが見つからなかったので、ノウハウをまとめてみた。
 
設定項目
Nginx の SSL 証明書関連で大切なのは次の設定。
        ssl on;
        ssl_certificate /etc/ssl/certs/www.example.com.chained.cert;
        ssl_certificate_key /etc/ssl/certs/www.example.com.key;
Nginx から、指定したファイルがアクセス可能かどうか、権限を確認する。
また、ファイル名が誤っていないか、確認する。
作成した証明書の確認
特に下記のコマンドは有用
秘密鍵の確認
$ openssl rsa -in /etc/ssl/certs/www.example.com.key -check
RSA key ok
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
MIIEp ...
中略
-----END RSA PRIVATE KEY-----
公開鍵の確認
$ openssl x509 -in /etc/ssl/certs/www.example.com.cert -text -noout
Certificate:
    Data:
        Version
(略)
中間証明書の確認
GoDaddy の証明書を使っているので、サイトから中間証明書を事前にダウンロードしておく。
https://certs.godaddy.com/repository/
ダウンロードした中間証明書が正しいか確認する。
$ openssl x509 -in gd_bundle-g2-g1.crt  -text -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 7 (0x7)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com, Inc., CN=Go Daddy Root Certificate Authority - G2
        Validity
            Not Before: May  3 07:00:00 2011 GMT
            Not After : May  3 07:00:00 2031 GMT
        Subject: C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com, Inc., OU=http://certs.godaddy.com/repository/, CN=Go Daddy Secure Certificate Authority - G2
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
(略)
秘密鍵、公開鍵が対応しているかの確認
秘密鍵の modulus を表示
$ openssl rsa  -in /etc/ssl/certs/www.example.com.key  -modulus -noout
Modulus=D3DF880A(snip)
公開鍵の modulus を表示
$ openssl x509  -in /etc/ssl/certs/www.example.com.cert -noout -modulus
Modulus=D3DF880A(snip)
秘密鍵と公開鍵の modulus が同じことを確認する。
公開鍵と中間証明書が対応しているかの確認
$ openssl x509 -issuer_hash -noout -in /etc/ssl/certs/www.example.com.cert
85cf5865
$ openssl x509 -subject_hash -noout -in gd_bundle-g2-g1.crt  -text -noout
85cf5865
ハッシュ値が同じことを確認する。
鍵の生成
Nginx では中間証明書を含めて、1つのファイルにする必要がある。
$ cat www.example.com.cert gd_bundle-g2-g1.crt > www.example.com.chained.cert
Nginx が SSL 有効かを確認
$ nginx -V
下記の表示を確認する。
TLS SNI support enabled
(前略)--with-http_ssl_module (略)
SSL 通信の確認
Nginx の設定が正しいどうか、openssl コマンドで接続して、確認できる。
$ openssl s_client -connect www.example.com:443 -showcerts
(略)
    Verify return code: 21 (unable to verify the first certificate)
などと表示されれば、正しく設定できていない。
中間証明書などを確認する。
$ openssl s_client -connect www.example.com:443 -showcerts
(略)
  Verify return code: 0 (ok)
と表示されれば、成功である。
私の場合は、gd_bundle-g2-g1.crt だとうまくいったのだが、
それではないものをベースに最初試していたため、ハマってしまっていた。
CloudFront 経由(SNI)で正しく動作するかの確認
CloudFront を経由するときなど、SNI を利用するときは、 -servername オプション付きで実行する。
$ openssl s_client -connect xxxxxxxxxxx.cloudfront.net:443 -servername www.example.com -showcerts
(略)
    Verify return code: 0 (ok)
最後に     Verify return code: 0 (ok) が表示されれば成功である。