HTTPSプロトコルを使用してベリサインなどのWebページの公開鍵を取得するにはどうすればよいですか?

コメント

  • 質問がすぐにわかった場合は、httpsプロトコルサインインchromeまたはfirefox(アドレスバーの左隅)をクリックすると、詳細を示すポップが表示されます。公開鍵を含む証明書。
  • @ Jor-el、I ' m openssl 質問がOpenSSLでこれを行うことに関するものであることをタグ付けします。おそらく、質問を明確にすることができます。
  • HTTPS ページには公開鍵がありません。回答で説明されているように、サーバーのみが公開鍵とその証明書を持っています。これは少なくとも1つのドメイン名であり、場合によっては複数のドメイン名です。クライアントがサーバーに何を通知する前にサーバーが証明書を提供する(そしてクライアントがそれを受け入れる)必要があるため、ページが異なれば ' t も異なるキー/証明書を持つことができます。ページが要求されます-もしあれば; HTTP [S]は、'どのページにもまったくアクセスしないリクエストを許可します。

回答

このコマンドは証明書を表示します(チェーン全体を表示する場合は、追加のパラメーターとして-showcertsを使用します):

openssl s_client -connect the.host.name:443 

これにより、証明書が取得され、公開鍵が出力されます。

openssl s_client -connect the.host.name:443 | openssl x509 -pubkey -noout 

さらに掘り下げたい場合は、 この質問は興味深いかもしれません。

コメント

  • これを実行する場合CentOS7とOpenSSL1.0.2kの場合、コマンドは'キーの印刷後に自動的に終了しません。

回答

google chromeで、https Webページに移動します(たとえば、 https://mail.google.com )、URLの横にあるロックをクリックし、[証明書情報]をクリックし、[詳細]タブをクリックして、[件名公開鍵情報]を見つけます。 、mail.google.comの場合、サブジェクト公開鍵アルゴリズム:「PKCS#1 RSA暗号化」およびサブジェクトの公開鍵:

Modulus (1024 bits): AF 39 15 98 68 E4 92 FE 4F 4F F1 BB FF 0D 2E B0 FE 25 AA BD 68 04 67 27 EA 6C 43 4C A7 6D CB C8 8F 7E 81 EE 87 26 25 10 12 54 33 9E AA 3D 9B 8F 8E 92 B3 4B 01 E3 F9 4A 29 C3 0F FD AC B7 D3 4C 97 29 3F 69 55 CF 70 83 04 AF 2E 04 6E 74 D6 0F 17 09 FE 9E 20 24 24 E3 C7 68 9C AC 11 BD 92 E4 B2 1B 09 F2 02 32 BB 55 1B 2D 16 5F 30 12 23 E2 4C 4A 8D C2 DA 3F E1 B8 BF F7 3A B1 86 BE F0 C5 Public Exponent (24 bits): 01 00 01 

これは、RSAで使用される10進数N=123045765072979014913511278179231402316770142733119510397469126703890433473616878571037576880489731114142173557070569117331013682110047985574967516701153320350820086344743718518661070276817382223900929884490765709232088941906671668904441902033030813416432622693650320785674286428555963210887699747381872357573

およびexponent=65537に対応します。

回答

Python 3では、 SSLSocket.getpeercert ピア証明書を取得するために使用できます。ピア証明書は、任意のDER証明書パーサーで解析できます。

import ssl, socket from asn1crypto import pem, x509 hostname = "www.sjoerdlangkemper.nl" ctx = ssl.create_default_context() s = ctx.wrap_socket(socket.socket(), server_hostname=hostname) s.connect((hostname, 443)) der = s.getpeercert(binary_form=True) cert = x509.Certificate.load(der) pubkey = cert.public_key.unwrap() print(pubkey) 

変数pubkeyRSAPublicKeyになりました。モジュラスは次のように取得できます:

print(pubkey["modulus"].native) 

または次のようにPEM公開鍵に変換します:

print(pem.armor("PUBLIC KEY", pubkey.contents).decode("ASCII")) 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です