openssl コマンドでお手軽にSSL証明書をチェックする方法

SSL証明書の確認のためにapacheに設定する前に、opensslの「s_server」コマンドを使うと簡単に確認できます。

コマンドの各オプションは以下の通りです。

-accept
待ち受けポート(デフォルトは 4433)

-cert filename
サーバ証明書のファイル名(デフォルトは server.pem)

-key filename
秘密鍵のファイル名(指定しない場合はサーバ証明書が用いられる)

-CAfile filename
中間証明書のファイル名

-WWW
単純な Web サーバをエミュレートする。
URL のパス部分をカレントディレクトリからの相対パスで解決して、対応するファイルを返す。

実行例

証明書の組み合わせがOKな場合は下記のようなメッセージが流れます。

$ openssl s_server -accept 10443 -cert cert.pem -key keynp.pem -CAfile rapidssl.pem -WWW
Using default temp DH parameters
Using default temp ECDH parameters
ACCEPT

こうなれば成功です。Webサーバーに鍵ペアを持って行ってもきっとちゃんと動いてくれる事でしょう。

この状態は、openssl がポート 10433 番ポートで接続待ちをしている状態です。

GUI でHTTPSの動きを見る

試しにブラウザから https://localhost:10443 に接続してみましょう。

ブラウザには何も表示されませんが、
s_server を起動したコンソールには下記のようなメッセージが流れているはず。

GET / HTTP/1.1
Host: localhost:10443
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja-jp
Connection: keep-alive
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/600.2.5 (KHTML, like Gecko) Version/8.0.2 Safari/600.2.5

これは、ブラウザからの HTTPS接続を openssl s_server が受け、
SSL handshake が成功して正常に暗号化通信ができている様子です。

応答を返していないのでブラウザに何もでませんが、
コンソールにHTTPレスポンスを流してあげれば、そのままブラウザに表示されるはず。

CUIでHTTPSの動きを見る

接続確認にブラウザを使うのも面倒だという方は、
別に立ち上げたコンソールで以下のコマンドを叩いてみてください。

openssl s_client -connect localhost:10433

実際に叩いてみました。

$ openssl s_client -connect localhost:10443
CONNECTED(00000003)
depth=3 C = US, O = Equifax, OU = Equifax Secure Certificate Authority
verify return:1
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify return:1
depth=1 C = US, O = GeoTrust Inc., CN = RapidSSL SHA256 CA - G3
verify return:1
depth=0 OU = GT89955212, OU = See www.rapidssl.com/resources/cps (c)15, OU = Domain Control Validated - RapidSSL(R), CN = bacchi.me
verify return:1
---
Certificate chain
 0 s:/OU=GT89955212/OU=See www.rapidssl.com/resources/cps (c)15/OU=Domain Control Validated - RapidSSL(R)/CN=bacchi.me
   i:/C=US/O=GeoTrust Inc./CN=RapidSSL SHA256 CA - G3
 1 s:/C=US/O=GeoTrust Inc./CN=RapidSSL SHA256 CA - G3
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIEmTCCA4GgAwIBAgIDAZlgMA0GCSqGSIb3DQEBCwUAMEcxCzAJBgNVBAYTAlVT
MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMSAwHgYDVQQDExdSYXBpZFNTTCBTSEEy
NTYgQ0EgLSBHMzAeFw0xNTAxMTEyMzQzMzBaFw0xNjAxMTQyMTQ4NDZaMIGNMRMw
EQYDVQQLEwpHVDg5OTU1MjEyMTEwLwYDVQQLEyhTZWUgd3d3LnJhcGlkc3NsLmNv
bS9yZXNvdXJjZXMvY3BzIChjKTE1MS8wLQYDVQQLEyZEb21haW4gQ29udHJvbCBW
YWxpZGF0ZWQgLSBSYXBpZFNTTChSKTESMBAGA1UEAxMJYmFjY2hpLm1lMIIBIjAN
BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxgD3gcgddtDpdffpu4t2Z3q/ZKQ6
5yvu7Xw6w5uxn6RloIJp6XplFJtp1Wzia/X3xqpwSIBTvRbRiooSdawtfTzMMAqf
/e/EB8qVRiIC2R8ZddFYnOJ/RjuaOm3B/yY49BQJT1sunHy64f1nMHBbOdCH3B2b
J4gjYMUR+oz4OoQ98D0PldbRVGinXxph2voWKnncvKwOlUQX1GWrJcmsvTM0Q7GW
/BGAUjPqeGW3ZqcnE3ksWyrXzH/mj4FHmY+z3N3tieMo9eDHPuIiAykyElGxQNrR
D1bIfIAa9NyZMy6Z27byjnm2Yz5TDFwq4PMj3fXKqlzUuH2DZSPgDW1RcQIDAQAB
o4IBRTCCAUEwHwYDVR0jBBgwFoAUw5zz/NNGCDS7zkZ/oHxb8+IIy1kwVwYIKwYB
BQUHAQEESzBJMB8GCCsGAQUFBzABhhNodHRwOi8vZ3Yuc3ltY2QuY29tMCYGCCsG
AQUFBzAChhpodHRwOi8vZ3Yuc3ltY2IuY29tL2d2LmNydDAOBgNVHQ8BAf8EBAMC
BaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBQGA1UdEQQNMAuCCWJh
Y2NoaS5tZTArBgNVHR8EJDAiMCCgHqAchhpodHRwOi8vZ3Yuc3ltY2IuY29tL2d2
LmNybDAMBgNVHRMBAf8EAjAAMEUGA1UdIAQ+MDwwOgYKYIZIAYb4RQEHNjAsMCoG
CCsGAQUFBwIBFh5odHRwczovL3d3dy5yYXBpZHNzbC5jb20vbGVnYWwwDQYJKoZI
hvcNAQELBQADggEBAGJ+ktWPbpNDy6gJ+pvVFZ7bVfsev/JVcOLOWOgowTezWihz
0vfB/MLChnhRcBT4T/tdi8HcmKGq5l2prSWR+7q0YFM2pQE2/Mi6NUwrCqhzx+YB
M/SzvJHTGTfttQRFOLfFTn/pkoEvDNg8LbTXsjQa6buAJrmxuaxFphQCI1fiN5g5
uuI5DXe6ytgqtAStFKgGyb/JGwlY+f3aQQSlatzR2Qyw9MbMV25Lts6819o+qUos
JdpywbL4o1XlPR8V9J316t8Bl+7Miml663+ayTpWe2E3HRmXG1cDFeaqDb56i/Su
0XzaFdnJ6L94EoKO5ocWyrAZ7b/iviD3zbeB7E4=
-----END CERTIFICATE-----
subject=/OU=GT89955212/OU=See www.rapidssl.com/resources/cps (c)15/OU=Domain Control Validated - RapidSSL(R)/CN=bacchi.me
issuer=/C=US/O=GeoTrust Inc./CN=RapidSSL SHA256 CA - G3
---
No client certificate CA names sent
Server Temp Key: ECDH, prime256v1, 256 bits
---
SSL handshake has read 3808 bytes and written 375 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: 3F3571BA0AEAFCB31287C39477E3700B9F890436082E68B385CBC2F144960D0E
    Session-ID-ctx:
    Master-Key: 3F2C1AD448D15CBAA9279A24C8EEA8B2BDE91FF3A87468F9EEB126F5215F1BADC25A71A6653AFB3246E03574365997D6
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - 88 52 0b 8a 31 3f 92 6b-2c 65 0d 52 58 58 17 2b   .R..1?.k,e.RXX.+
    0010 - 3e ce 40 fe 18 c7 80 06-ff c2 ae 74 a4 82 c9 a3   >.@........t....
    0020 - 78 5b 4e 05 cc b7 aa d0-2e 7a 3a 0d 99 b5 dc 7e   x[N......z:....~
    0030 - fb ec 34 17 3b dd d2 d3-37 ac 58 35 7c 0a 74 fe   ..4.;...7.X5|.t.
    0040 - 75 17 d3 20 75 33 7a 90-a4 aa c0 05 da d8 3d 53   u.. u3z.......=S
    0050 - 21 de 3d ac f9 45 15 ed-91 e0 32 9b c6 52 75 36   !.=..E....2..Ru6
    0060 - 92 22 07 10 6c 8a bd 46-e4 b2 22 53 d2 32 c3 fb   ."..l..F.."S.2..
    0070 - ba 63 8c 90 24 87 63 5f-ab f3 03 48 e3 02 f1 b1   .c..$.c_...H....
    0080 - ad f7 10 28 ae f4 5a 3c-42 0f 69 a8 a0 79 e9 64   ...(..Z

handshake の様子が流れていますね。

openssl の s_server を使えばSSL証明書の期限チェックとかが自動化できそうですね!