Como posso obter a chave pública de uma página da web, como verisign etc., usando o protocolo HTTPS?

Comentários

  • Se bem entendi sua pergunta, você pode clicar no protocolo https entrar em cromo ou firefox (no canto esquerdo da barra de endereço), lá você pode ver um pop mostrando detalhes sobre o certificado incluindo sua chave pública.
  • @ Jor-el, eu ' m assumindo do openssl marca que a questão é sobre como fazer isso com OpenSSL. Talvez a questão possa ser esclarecida.
  • Uma página HTTPS não tem uma chave pública; apenas um servidor tem uma chave pública e um certificado para ela, conforme explicado nas respostas. Isso é pelo menos um nome de domínio e às vezes mais de um. Páginas diferentes podem ' t ter chaves / certificados diferentes, porque o servidor deve fornecer seu certificado (e o cliente aceitá-lo) antes que o cliente informe ao servidor o que a página é solicitada – se houver; HTTP [S] permite solicitações que não ' acessam nenhuma página.

Resposta

Este comando mostrará o certificado (use -showcerts como um parâmetro extra se você quiser ver a cadeia completa):

openssl s_client -connect the.host.name:443 

Isso obterá o certificado e imprimirá a chave pública:

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

Se você quiser pesquisar mais, esta pergunta pode ser do seu interesse.

Comentários

  • Ao fazer isso no CentOS 7 com OpenSSL 1.0.2k, o comando não ' sai automaticamente após imprimir a chave.

Resposta

No google chrome, vá para a página da web https (diga https://mail.google.com ), clique no cadeado ao lado do URL, clique em “informações do certificado”, clique na guia “Detalhes” e localize “Informações da chave pública do assunto” , que para mail.google.com diz Algoritmo de chave pública do assunto: “PKCS # 1 RSA Encryption” e Chave pública do assunto:

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 

Isso corresponde aos números decimais N=123045765072979014913511278179231402316770142733119510397469126703890433473616878571037576880489731114142173557070569117331013682110047985574967516701153320350820086344743718518661070276817382223900929884490765709232088941906671668904441902033030813416432622693650320785674286428555963210887699747381872357573

e exponent=65537 usados no RSA.

Resposta

No Python 3, SSLSocket.getpeercert pode ser usado para obter o certificado de mesmo nível, que por sua vez pode ser analisado por qualquer analisador de certificado 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) 

A variável pubkey agora é um RSAPublicKey se a conexão usou RSA. Você pode obter o módulo como este:

print(pubkey["modulus"].native) 

Ou convertê-lo em uma chave pública PEM como este:

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

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *