Symfoware

Symfowareについての考察blog

Python サイトのSSL証明書の有効期限を取得する

うっかりSSL証明書の更新を忘れそうになったので、
SSL証明書の有効期間をプログラムで取得できないか調べてみました。


sslライブラリ



参考になったのはこちら。
How can I retrieve the TLS/SSL peer certificate of a remote host using python?

sslをインポートして使えとのこと。

試行錯誤した結果のプログラムはこんな感じになりました。


  1. # -*- coding:utf-8 -*-
  2. import ssl
  3. import OpenSSL
  4. # 証明書を取得
  5. cert = ssl.get_server_certificate(('www.google.com', 443))
  6. # 人が読める形に変換
  7. x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, cert)
  8. # 有効期間開始
  9. print u'start:', x509.get_notBefore()
  10. # 有効期間終了
  11. print u'end:', x509.get_notAfter()
  12. # その他の情報
  13. components = x509.get_subject().get_components()
  14. for component in components:
  15.     print component




実行結果


$ python sample.py
start: 20151007111038Z
end: 20160105000000Z
('C', 'US')
('ST', 'California')
('L', 'Mountain View')
('O', 'Google Inc')
('CN', 'www.google.com')




これで証明書が2015/10/07から2016/01/05までの有効期間であることがわかります。





SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure



サイトによっては、こんなエラーが発生しました。


ssl.SSLError: [Errno 1] _ssl.c:510: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure




どうもssl 3を使用しているサイトだとエラーになる模様。
get_server_certificateに


ssl_version=ssl.PROTOCOL_SSLv23



と引数を追加することで、問題が解消出来ました。


  1. # 証明書を取得
  2. # ssl_versionの指定を追加
  3. cert = ssl.get_server_certificate(('www.google.com', 443), ssl_version=ssl.PROTOCOL_SSLv23)





これで、証明書の有効期間チェックが自動化できそうです。



【参考URL】

17.3. ssl — ソケットオブジェクトに対する TLS/SSL ラッパー

How can I retrieve the TLS/SSL peer certificate of a remote host using python?

Python OpenSSL Manual
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2015/10/15(木) 22:04:20|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<FreeBSD 10.1から10.2へのアップグレード手順 | ホーム | Python 正規表現でマッチした部分の文字列を取得する(finditer)>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1801-26be4e1f
この記事にトラックバックする(FC2ブログユーザー)