前提・実現したいこと
SSL認証がされているサイトであるかどうかを検出する関数を作成してみたのですが、処理の過程で、例外が発生してしまいました。その為、その原因を特定し、改善したいです。
発生している問題
「input_url」にはhttps化されていないサイトのURL名を代入しましたのですが、その結果、コンソールには、「接続が拒否されました」と表示されました。
該当の例外は、「OSError」であるかと思いますが、公式リファレンスを参照してみたものの、原因を突き止められませんでした。
該当のソースコード
python
1#SSL通信の検証 2def get_server_certificate(hostname): 3 context = ssl.create_default_context() 4 # print('contextは ', dir(context)) 5 # exit() 6 """ 7 address ((host, port) ペア) で listen しているTCPサービスに接続し、 8 ソケットオブジェクトを返す 9 """ 10 try: 11 with socket.create_connection((hostname, 443)) as sock: 12 """ 13 元のソケット通信の機能があるクラス(sock)を内包し、 14 SSLを利用して暗号化通信をソケットを通じて行う機能のクラス(ssl.SSLSocke) 15 がラッパークラス 16 """ 17 with context.wrap_socket(sock, server_hostname=hostname) as sslsock: 18 #証明書を取得(Falseの場合はdictで取得、Trueの場合はバイナリ形式で取得) 19 der_cert = sslsock.getpeercert(True) 20 sslsock.match_hostname(der_cert,hostname) 21 except OSError: 22 print('接続が拒否されました') 23 except ssl.CertificateError: 24 print('ホスト名とSSL証明書のコモンネームが一致しません') 25 except ssl.SSLCertVerificationError: 26 print('SSL証明書が有効ではありません。') 27 print('TLSサーバー証明書の検証に失敗しました。') 28 29 except socket.timeout: 30 print('接続タイムアウトエラー:SSL接続が確認出来ませんでした') 31
以下は呼び出す際のコードになります。
get_server_certificate(input_url)
試したこと
エラー内容の検索、公式リファレンスの参照を行いました。
どなたか、こちらの現象解決の為、ご助言頂けましたら幸いです。
※追記です
OSErrorの例外をキャッチしている部分を、以下の形にし、エラーの詳細を表示させてみました。
except OSError as e: print('接続が拒否されました',e)
結果の方は、コンソールにて、以下のように表示されました
nodename nor servname provided, or not known
追記2
以下は、修正したSSL検証の関数になります。
#SSL通信の検証 def get_server_certificate(hostname): # socket.gethostbyname('hostname') context = ssl.create_default_context() # print('contextは ', dir(context)) # exit() """ address ((host, port) ペア) で listen しているTCPサービスに接続し、 ソケットオブジェクトを返す """ try: with socket.create_connection((hostname, 443)) as sock: print('コネクション成功') """ 元のソケット通信の機能があるクラス(sock)を内包し、 SSLを利用して暗号化通信をソケットを通じて行う機能のクラス(ssl.SSLSocke) がラッパークラス """ with context.wrap_socket(sock, server_hostname=hostname) as sslsock: #証明書を取得(Falseの場合はdictで取得、Trueの場合はバイナリ形式で取得) der_cert = sslsock.getpeercert(False) print(der_cert) print(ssl.match_hostname(der_cert,hostname)) except ssl.CertificateError: print('ホスト名とSSL証明書のコモンネームが一致しません') except ssl.SSLCertVerificationError: print('SSL証明書が有効ではありません。') print('TLSサーバー証明書の検証に失敗しました。') except socket.timeout: print('接続タイムアウトエラー:SSL接続が確認出来ませんでした') except OSError as e: print('接続が拒否されました',e)
回答1件
あなたの回答
tips
プレビュー