【OpenSSL】SSL証明書の情報を取得するコマンド

多くのレンタルサーバーで、多くのサイトを運用すると、各サイト(各ドメイン)の SSL 証明書の「有効期限」を一括で管理した方が効率がよくなります。

SSL 証明書の期限が切れるとサイトにアクセスできなくなったり、期限切れの警告がでてアクセスが一気に減ってしまう危険性があります。

そのために常に SSL 証明書の有効期限を把握しておきたいところですが、人間なのでついつい忘れることもあります。

今回は、SSL 証明書の有効期限を取得するコマンドについて調べました。

 

サイトが1つでも2つでもコマンドで定期的に SSL 証明書の有効期限を取得すると運用がかなり楽になりますので、ぜひ取り入れてみてください。

 

 

OpenSSLコマンド

以下の openssl コマンドで SSL 証明書の有効期限を取得することができます。 

 

【例】Google の SSL 証明書の有効期限を確認するコマンド

[test@cent07 ~]$ openssl s_client -connect google.co.jp:443 < /dev/null 2> /dev/null | openssl x509 -text | grep Not
Not Before: Aug 15 16:20:21 2017 GMT
Not After : Nov 7 16:05:00 2017 GMT ← 「Not After」が有効期限です。2017年の11月7日16:05が有効期限です。

 

ちなみに、このコマンドは以下の参考サイトで紹介されていたコマンドです。

ありがとうございます。

 

参考サイト

http://qiita.com/moonphase/items/a3a0937f77494e62213c

 

以下がブラウザより確認した Google サイトの SSL 証明書の有効期限です。

 

あれ?と思いました。

「google.co.jp」の情報を取得しているのに、証明書の CN は「google.com」です。

 

 

一応 google.co.jp の SSL 証明証のチェックもしてみましたが特に問題はなさそうです。

 

 

コモンネーム(CN)とは?

コモンネーム(CN)とは、ブラウザでアクセスする際に入力する「http://」や「https://」の後ろの部分です。

そのため、SSLサーバ証明書の「コモンネーム」「サイトURL」は一致している必要があります。

例えば、Yahoo! の場合ですが、「https://www.yahoo.co.jp/」のコモンネームは「www.yahoo.co.jp」になります。

そう考えると、「https://google.co.jp」のコモンネームは「google.co.jp」になりそうですが。。

 

実際にベリサインやジオトラストで CSR を生成する際に設定し、もし間違っていたらサーバー証明書は効力がないと思うのですが、なぜなのか不明なのでもうちょっと調べてみます。

 

 

例えば「ワイルドカード証明書」があります。

これは「*.yahoo.co.jp」で証明書を取得すれば、「auto.yahoo.co.jp」も「book.yahoo.co.jp」でも利用できる証明書です。

しかし Google の証明書の CN は「*.google.com」になっている。。

 

更に言うと、申請したコモンネームが実際の URL と異なると以下のような警告が出ます。

「セキュリティ証明書の名前はサイト名と一致しません」

これは当然です。

その場合は CA に再度申請をする必要があります。

 

curl コマンドで確認してみると

しつこいですが(笑)、curl コマンドで「google.co.jp」を調べてみました。

すると、またまた、あれ?

test@cent07 ~]$ curl -v https://google.co.jp
* About to connect() to google.co.jp port 443 (#0)
* Trying 172.217.26.35...
* Connected to google.co.jp (172.217.26.35) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
* SSL connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate:
* subject: CN=*.google.co.jp,O=Google Inc,L=Mountain View,ST=California,C=US ← コモンネームは「google.co.jp」になっています。
* start date: 8月 15 16:04:00 2017 GMT
* expire date: 11月 07 16:04:00 2017 GMT
* common name: *.google.co.jp ← コモンネームは「google.co.jp」になっています。
* issuer: CN=Google Internet Authority G2,O=Google Inc,C=US
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: google.co.jp
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Location: https://www.google.co.jp/
< Content-Type: text/html; charset=UTF-8
< Date: Mon, 28 Aug 2017 13:43:54 GMT
< Expires: Wed, 27 Sep 2017 13:43:54 GMT
< Cache-Control: public, max-age=2592000
< Server: gws
< Content-Length: 222
< X-XSS-Protection: 1; mode=block
< X-Frame-Options: SAMEORIGIN
< Alt-Svc: quic=":443"; ma=2592000; v="39,38,37,35"
<
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="https://www.google.co.jp/">here</A>.
</BODY></HTML>
* Connection #0 to host google.co.jp left intact
[test@cent07 ~]$

 

ブラウザの証明書をチェックすると「google.com」になっていますが、curl コマンドだと正しく表示されているようです。

 

 

openssl コマンドの解説

かなり話が飛びましたが、openssl コマンドの解説です。

 

[test@cent07 ~]$ openssl s_client -connect google.co.jp:443 < /dev/null 2> /dev/null | openssl x509 -text | grep Not
Not Before: Aug 15 16:20:21 2017 GMT
Not After : Nov 7 16:05:00 2017 GMT 

 

 /dev/null

「/dev/null」は普通のファイルではありません。

「/dev/null」は、スペシャルファイルで、ここに書き込まれたデータはすべて消えます。(消滅します)

通常は、不要なログをリダイレクトして消したりするために利用します。

 

通常は、「>/dev/null」というように、不要なログを「/dev/null」に書き込んで消すために使いますが、このコマンドでは逆に「</dev/null」になっています。

つまりファイルの中身を空にするような使い方です。

 

更に細かく分解してみます。

 

「</dev/null」は何をしているのか?何をしたいのか?

最初見た時は「逆?」と思いました。

しかし「</dev/null」は何をしているのかと言いますと、「EOF」を書き出しています。

 

実は「openssl s_client -connect google.co.jp:443」コマンドだけを実行すると、出力が途中で止まってしまうのです。

 

[test@cent07 ~]$ openssl s_client -connect google.co.jp:443
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 = Google Inc, CN = Google Internet Authority G2
verify return:1
depth=0 C = US, ST = California, L = Mountain View, O = Google Inc, CN = google.com
verify return:1
---
Certificate chain
0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=google.com
i:/C=US/O=Google Inc/CN=Google Internet Authority G2
1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
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
---

 

~省略~

---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES128-GCM-SHA256
Session-ID: 4792E108F4CA4C6B4E0014E22AA5C714F363E607711EDB3B735541199053FBE2
Session-ID-ctx:
Master-Key: 1F34F50833EA745DE0ADCD9CF44422535E802149AABF60A120AA1453B700017B4694F1431B9E314853DFF9B562BFB121
Key-Arg : None
Krb5 Principal: None
PSK identity: None
PSK identity hint: None
TLS session ticket lifetime hint: 100800 (seconds)
TLS session ticket:
0000 - 00 5d 43 e4 f5 56 86 79-fa d2 e4 21 35 3d 0e 8f .]C..V.y...!5=..
0010 - 97 ef 37 9c 03 81 03 8f-e5 0a 6a 52 f6 67 04 3a ..7.......jR.g.:
0020 - 23 ac 4f 01 3c 60 18 4e-01 5b 54 ed f0 29 be 6e #.O.<`.N.[T..).n
0030 - 92 79 7f 2d af 7e 7d c8-4e a1 74 59 ee 30 bd 4d .y.-.~}.N.tY.0.M
0040 - 7e 06 68 d6 68 49 fd 38-74 6d ba 7d 79 62 10 87 ~.h.hI.8tm.}yb..
0050 - b4 11 87 3a 6c f1 06 3b-00 c3 28 b3 b8 25 f1 63 ...:l..;..(..%.c
0060 - 10 1b fa 8b c4 0b 32 8b-e0 ee d8 80 b8 09 3e 85 ......2.......>.
0070 - 10 b6 47 e6 b0 3f ee ce-fb 29 a5 df a6 b0 ee ee ..G..?...)......
0080 - bb 9c 88 7f 1d dd 21 5a-27 72 b6 74 0a 66 3e 3f ......!Z'r.t.f>?
0090 - a8 2d f6 27 30 dd 24 d6-4f 3d 69 a5 d3 d0 51 75 .-.'0.$.O=i...Qu
00a0 - 50 50 21 79 da eb f8 d3-2d 29 55 b7 77 e2 f8 f9 PP!y....-)U.w...
00b0 - c6 8b 5f f5 ca a3 32 b1-eb bc 28 69 a0 f7 1c 40 .._...2...(i...@
00c0 - 84 e3 3b 96 54 c3 0a ce-9a ff 49 39 52 20 b9 5e ..;.T.....I9R .^
00d0 - 60 91 55 14 2e `.U..

Start Time: 1503930916
Timeout : 300 (sec)
Verify return code: 0 (ok)
---

 

← ここでプロンプトが返ってこなくて止まったままの状態になります。

 

要するに上記の「openssl」コマンドを実行すると、プロンプトが返ってこないのです。

実は「openssl s_client -connect <サーバー>」で接続をすると、openssl コマンドは入力を待ち続けるのです。

実質的にコマンドが終わっているのに、終わっていない「待ち」の状態になります。

 

しかし「</dev/null」を入れることで「EOF」が入力されるのでプロンプトが返ってくるのです。

※ちなみに、上記のプロンプトが返ってこない状態の場合は「Ctrl+C」でコマンドを終了させることでプロンプトが返ってきます。

 

では「</dev/null」を入れて、ちゃんとプロンプトが返ってくるのかを確認してみましょう。

[test@cent07 ~]$ openssl s_client -connect google.co.jp:443 </dev/null
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

~ 省略 ~

 

Start Time: 1503931236
Timeout : 300 (sec)
Verify return code: 0 (ok)
---
DONE
[test@cent07 ~]$ ← プロンプトが返ってきました。

 

これで「</dev/null」の謎が分かりましたでしょうか?

プロンプトを返ってこさせる、というよりコマンドを終了させるために必要なものだったのです。

 

 

しかし、まだまだ謎は続きます。

 

「openssl s_client -connect google.co.jp:443 < /dev/null 2> /dev/null | openssl x509 -text | grep Not」の「2> /dev/null」の部分はなんでしょうか?

 

「2> /dev/null」とは?

「2」「標準エラー出力」を指します。

つまり「2>/dev/null」でエラー出力を消しているのです。

そして「標準出力」のみをパイプでつなげて「openssl x509 -text 」に読み込ませています。

 

 

openssl x509 -text とは?

まず「openssl s_client -connect google.co.jp:443」のコマンドで何の情報を取得しているのかと言いますと、サーバー(google.co.jp)に HTTPS で接続をして「何をどうやって接続したのか」という情報が返ってきます。

 

またまたちなみにですが、「telnet」コマンドでの接続確認と似ている、つまり telnet コマンドを使っても確認できるのでは?と思ったかもしれませんが、実は「SSL」の場合は telnet コマンドで接続確認ができないのです。

そのため「openssl s_client」コマンドを使っています。

 

そして、「openssl s_client -connect google.co.jp:443」のコマンドで「サーバー証明書」の情報が返ってきます。

 

それを「openssl x509 -text」でテキスト化して、その中から「SSL証明書の有効期限」をチェックしているといるのです。

 

Posted by 100%レンタルサーバーを使いこなすサイト管理人

コメントを残す

メールアドレスが公開されることはありません。