2014年04月11日

Windowsで他のサイトのサーバ証明書の情報を取得・確認する方法 このエントリーをはてなブックマークに追加

ということでOpenSSLのHeartbleed脆弱性で世界中が祭り状態である。
[ビデオ]OpenSSLのバグ“Heartbleed”ってどんなの? | TechCrunch Japan

チェック方法まとめ:OpenSSLの「Heartbleed」脆弱性は2年前から存在、「最悪のケースを想定して対処を」と専門家 - @ITでもチェック方法がいろいろ書かれているようだな。

「SSLで経路暗号化しているから安心だね」ってのがちょいと根底から揺らいでいるよーな気もするが引き続きこのあたりは情報収集していこうかなーと思ってますな。

で、今回の件で、OpenSSLのHeartbleed機能が有効化されているかを調べるには
openssl s_client -connect www.example.jp:443 -tlsextdebug
って感じにすればよいらしいというのを教えてもらった。
あまりこのあたりよくわかってないので「外部の証明書に対してopensslのコマンドで調査できるのかー」ってのを初めて知った。
外部の証明書の詳しい情報を外から調べられるってのを知ったのでいろいろ試してみようとしたのだが丁度よいLinuxの環境がなかったのでWindowsにて調べることができないか試してみた。

OpenSSL: OpenSSL Binary Distributions経由でShining Light Productions - Win32 OpenSSLをインストールし、コマンドラインから
openssl s_client -connect www.google.com:443 -tlsextdebug
って感じでやってみたのだが、
Loading 'screen' into random state - done
connect: No such file or directory
connect:errno=0
となり接続できないようであった。いろいろ調べた結果デフォルトの状態でproxy経由でOpenSSLを使う方法はどうもよくわからなかった。(ソースを変更して再コンパイルしている人とかいたのだが私には無理でございましたw)

openSSLでは私のスキルではproxyを越えられないと結論付け、curlを使って証明書の取得を試みた。
まあ「Windowsで」とタイトルに付けたけど結局curlを使ってしまうのだ。すまん。
Windowsのcurlはいろいろあるようだが、私はGow - The lightweight alternative to Cygwinのcurlを使ってますな。curlでproxyを超えるにはこんな感じでWindowsのシステム環境変数にhttp_proxyとhttps_proxyを追加すればよさそうである。
http_proxy : http://proxy.example.co.jp:8080
https_proxy : http://proxy.example.co.jp:8080
curlはいろいろ情報があったのだが「curl 証明書」などで検索すると「curlコマンドでSSLのエラーを無視するには」といった類の結果が沢山でてきた。証明書の情報を無視するのではなく証明書の情報がほしいのでなかなかよさそーなサイトに辿りつけなかったのだが、対応しているSSL暗号化スイートを確認する - Dondari memoとかが参考になったかな。
まあ、結論としては
curl https://google.com -v -k
とかやればよさそうである。
しかし、上記の「-v -k」オプションでは情報が取得できないサイトが幾つかあった。更に調べたところ「 --ciphers ALL 」オプションを使えということが書かれていた。

つーことで、ちょいとこんなバッチファイルを作ってみたばい。(grep使ってるけどGowインストールしたから入ってるよね)
echo off
set TMP_SSL_FILENAME="check.txt"
set LOGFILE="cert.log"

curl %1 -v -k --ciphers ALL 1>%TMP_SSL_FILENAME% 2>&1

grep "SSL connection using" %TMP_SSL_FILENAME% >%LOGFILE%
grep "subject:" %TMP_SSL_FILENAME% >>%LOGFILE%
grep "start date" %TMP_SSL_FILENAME% >>%LOGFILE%
grep "expire date" %TMP_SSL_FILENAME% >>%LOGFILE%
grep "issuer:" %TMP_SSL_FILENAME% >>%LOGFILE%

type %LOGFILE%
でこれをchkcert.batとかって名前で保存して、コマンドラインから
chkcert https://google.com
とすると
* SSL connection using ECDHE-ECDSA-AES128-GCM-SHA256
* subject: C=US; ST=California; L=Mountain View; O=Google Inc; CN=*.google.com
* start date: 2014-03-12 10:03:06 GMT
* expire date: 2014-06-10 00:00:00 GMT
* issuer: C=US; O=Google Inc; CN=Google Internet Authority G2
という感じに結果が表示される。とりあえず表示される全情報については「check.txt」に残してその中から必要な情報だけgrepで拾ってきて「cert.log」に保存しているのだが、別にそんなことせずに「curl %1 -v -k --ciphers ALL」という1行だけでバッチファイルを作ってももちろんOKである。

Googleはstart dateとexpire dateの期間が3ヶ月くらいだな。結構短いなー。

ちなみにこの方法ではOpenSSLのHeartbleedに関する情報は取得できませんよ。Heartbleedのチェック方法についてはいろんなところに紹介されていると思うのでそちらを見てください。あとOpenSSLはこのあたりの記事をあとでよく読んでみたいと思います。
posted by りょーち | Comment(0) | TrackBack(0) | セキュリティ
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: