it-swarm-vi.com

Làm thế nào để có được khóa công khai của một trang web an toàn?

Làm cách nào tôi có thể lấy khóa chung của một trang web như verisign, v.v. bằng giao thức HTTPS?

28
shalki

Lệnh này sẽ hiển thị cho bạn chứng chỉ (sử dụng -showcerts như một tham số phụ nếu bạn muốn xem toàn chuỗi):

openssl s_client -connect the.Host.name:443

Điều này sẽ nhận được chứng chỉ và in ra khóa công khai:

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

Nếu bạn muốn tìm hiểu thêm, câu hỏi này có thể được quan tâm.

60
Bruno

Trong google chrome, truy cập trang web https (giả sử https://mail.google.com ), nhấp vào khóa bên cạnh URL, sau đó nhấp vào "thông tin chứng chỉ", nhấp vào Tab "Chi tiết" và sau đó tìm "Thông tin khóa công khai chủ đề", cho mail.google.com cho biết Thuật toán khóa công khai chủ đề: "Mã hóa RSA # 1 RSA" và Khóa công khai của chủ đề:

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

Điều này tương ứng với các số thập phân N=123045765072979014913511278179231402316770142733119510397469126703890433473616878571037576880489731114142173557070569117331013682110047985574967516701153320350820086344743718518661070276817382223900929884490765709232088941906671668904441902033030813416432622693650320785674286428555963210887699747381872357573

exponent=65537 được sử dụng trong RSA.

10
dr jimbob

Trong Python 3, SSLSocket.getpeercert có thể được sử dụng để lấy chứng chỉ ngang hàng, do đó có thể được phân tích cú pháp bởi bất kỳ trình phân tích chứng chỉ DER nào:

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)

Biến pubkey hiện là RSAPublicKey nếu kết nối sử dụng RSA. Bạn có thể có được mô-đun như thế này:

print(pubkey["modulus"].native)

Hoặc chuyển đổi nó thành khóa công khai PEM như thế này:

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