OpenSSLコマンドで証明書のチェック

発行したSSLサーバ証明書と中間CA証明書を実際にApache等にインストールする前に、正しいかどうか検証したいことがある。
その場合は、OpenSSLのopensslコマンドで検証することができる。

openssl s_serverでサーバを起動

s_serverは、リモートのクライアントからのSSL/TLSの接続を受け入れる一般的なSSL/TLSサーバを実装している。

openssl s_server -cert <サーバ証明書ファイル> -key <秘密鍵ファイル> -CAfile <中間証明書ファイル>

実行例:

$ openssl s_server -cert server.crt -key server.key -CAfile intermediate.crt 
Using default temp DH parameters
Using default temp ECDH parameters
ACCEPT

openssl s_clientでチェック

起動したサーバに openssl s_client で接続して、証明書を検証する。
s_clientは、リモートのサーバに対するSSL/TLSの接続を確立する一般的なSSL/TLSクライアントを実装している。

openssl s_client -connect localhost:4433 -CAfile <CA証明書ファイル>

CA証明書ファイルの例:

  • Mac OS X
    /etc/openssl/cert.pem
    /opt/local/etc/openssl/cert.pem、/opt/local/share/curl/curl-ca-bundle.crt (MacPortsの場合)
  • Ubuntu (ca-certificates をインストールしておく)
    /etc/ssl/certs/ca-certificates.crt
  • CentOS
    /etc/pki/tls/certs/ca-bundle.crt にあるが、指定しなくても大丈夫。

実行例:

$ openssl s_client -connect localhost:4433 -CAfile /opt/local/share/curl/curl-ca-bundle.crt
CONNECTED(00000003)
depth=3 (略)
verify return:1
depth=2 (略)
verify return:1
depth=1 (略)
verify return:1
depth=0 (略)
verify return:1
---
Certificate chain
 0 s:(略)
   i:(略)
 1 s:(略)
   i:(略)
 2 s:(略)
   i:(略)
 3 s:(略)
   i:(略)
---
Server certificate
-----BEGIN CERTIFICATE-----
(略)
-----END CERTIFICATE-----
subject=(略)
issuer=(略)
---
No client certificate CA names sent
---
SSL handshake has read 4744 bytes and written 443 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: zlib compression
Expansion: zlib compression
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: (略)
    Session-ID-ctx: 
    Master-Key: (略)
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    (略)
    Compression: 1 (zlib compression)
    Start Time: 1421023132
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

実際にサーバにインストールしたら、s_clientで以下のように証明書をチェックする。
-servername は、SNI(Server Name Indication)のために必要。

実行例:

  • Mac OS X
    (CAfileはMacPortsの場合)
    $ openssl s_client -connect www.example.com:443 -servername www.example.com -showcerts -CAfile /opt/local/etc/openssl/cert.pem
    
  • CentOS
    $ openssl s_client -connect www.example.com:443 -servername www.example.com -showcerts
    
  • Ubuntu
    (ca-certificates をインストールしておく)
    $ openssl s_client -connect www.example.com:443 -servername www.example.com -showcerts -CAfile /etc/ssl/certs/ca-certificates.crt
    

証明書の有効期限をチェックしたい場合は、

$ echo | openssl s_client -connect www.example.com:443 -servername www.example.com -showcerts 2>/dev/null | openssl x509 -noout -dates