HTTPS 프로토콜을 사용하여 verisign 등과 같은 웹 페이지의 공개 키를 얻으려면 어떻게해야하나요?
댓글
- 그때 질문을 이해하면 https 프로토콜 로그인 크롬 또는 파이어 폭스 (주소 표시 줄의 왼쪽 모서리에 있음)를 클릭하면 다음과 같은 세부 정보를 보여주는 팝업을 볼 수 있습니다. 공개 키를 포함한 인증서입니다.
- @ Jor-el, I ' m은 openssl <에서 가정합니다. / a> 태그는 OpenSSL로이 작업을 수행하는 것에 대한 질문입니다. 질문이 명확해질 수 있습니다.
- HTTPS 페이지 에는 공개 키가 없습니다. 답변에 설명 된대로 서버 에만 공개 키와 인증서가 있습니다. 이는 하나 이상의 도메인 이름이며 때로는 하나 이상입니다. 클라이언트가 서버에 무엇을 알리기 전에 서버가 인증서를 제공해야하고 클라이언트가이를 수락해야하므로 페이지마다 다른 키 / 인증서를 가질 수 없습니다 ' . 페이지가 요청됩니다. HTTP [S]는 어떤 페이지에도 액세스하지 않는 ' 요청을 허용합니다.
Answer
이 명령은 인증서를 표시합니다 (전체 체인을 보려면 -showcerts
를 추가 매개 변수로 사용) :
openssl s_client -connect the.host.name:443
이렇게하면 인증서를 받고 공개 키를 인쇄합니다.
openssl s_client -connect the.host.name:443 | openssl x509 -pubkey -noout
더 자세히 알아 보려면 이 질문 이 흥미로울 수 있습니다.
댓글
- 실행할 때 OpenSSL 1.0.2k를 사용하는 CentOS 7에서는 키를 인쇄 한 후 명령이 ' 자동으로 종료되지 않습니다.
답변
Google Chrome에서 https 웹 페이지로 이동합니다 (예 : 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에서 사용되는 십진수 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)
변수 pubkey
는 이제 RSAPublicKey
입니다. 다음과 같은 모듈러스를 얻을 수 있습니다.
print(pubkey["modulus"].native)
또는 다음과 같은 PEM 공개 키로 변환합니다.
print(pem.armor("PUBLIC KEY", pubkey.contents).decode("ASCII"))