SSLSocket.getpeercert()について、疑問点があり、質問させて貰いました。
こちらのサイトにアクセスをすると、アドレスバーの部分に「保護されていない通信」と表示されます。しかし、以下のコードの、der_cert = sslsock.getpeercert(False)
ここの部分では、証明書情報が、返ってきています。
#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) 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) else: print('ok') get_server_certificate('akudaikan-0.bbs.fc2.com')
以下は、der_cert = sslsock.getpeercert(False)
で、返ってきた証明書情報になります。
{'subject': ((('commonName', 'bbs.fc2.com'),),), 'issuer': ((('countryName', 'US'),), (('organizationName', "Let's Encrypt"),), (('commonName', "Let's Encrypt Authority X3"),)), 'version': 3, 'serialNumber': '03F8F16C9F0E261B84831ABB369301D130A6', 'notBefore': 'Apr 25 14:02:46 2020 GMT', 'notAfter': 'Jul 24 14:02:46 2020 GMT', 'subjectAltName': (('DNS', '*.bbs.fc2.com'), ('DNS', 'bbs.fc2.com')), 'OCSP': ('http://ocsp.int-x3.letsencrypt.org',), 'caIssuers': ('http://cert.int-x3.letsencrypt.org/',)}
さらには、ssl.match_hostname(der_cert,hostname)
ここの部分では例外も発生していない状況です。
該当サイトがhttps化されていないにも関わらず、証明書情報が返ってきているのは何故なのか、ご助言の程、頂けましたら幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/20 13:58 編集