2016-12-15 6 views
0

Ich muss Server-Zertifikate als DER-Datei herunterladen. Ich benutze Python. Ich könnte mit diesem Skript eine Verbindung zum Server herstellen, aber ich muss das Zertifikat lokal auf meiner Festplatte herunterladen, damit ich es in der nächsten Phase parsen kann.Wie x509-Zertifikat mit Python herunterladen

import socket, ssl 
import OpenSSL 

hostname='www.google.com' 
port=443 

context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
ssl_sock = context.wrap_socket(s, server_hostname=hostname) 
ssl_sock.connect((hostname, port)) 
ssl_sock.close() 
print("ssl connection Done") 

cert = ssl.get_server_certificate((hostname, port)) 

# OpenSSL 
x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, cert) 

Antwort

0

Sie können mit ein paar Zwischentransformationen die DER-Datei speichern:

cert = ssl.get_server_certificate((hostname, port)) 
x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, cert) 
der = OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_ASN1, x509) 
with open('/tmp/google.der', 'wb') as f: f.write(der) 
+0

Können Sie ein wenig über 'open (‚/ tmp/google.der‘,‚wb klären ') als f: f.write (der) '? Ich bekomme Fehler: FileNotFoundError: [Errno 2] Keine solche Datei oder Verzeichnis: '/ tmp/google.der' ', obwohl ich tmp-Ordner im Projektordner erstellt. Ich habe auch 'open ('../ tmp/google.der', 'wb') versucht, aber das hat das Problem nicht gelöst. – user2192774

+0

@ user2192774 Sie erhalten diesen Fehler wahrscheinlich, weil Ihr System kein '/ tmp'-Verzeichnis hat. In diesem Fall öffne stattdessen "google.der", "wb". –

1

Es besteht keine Notwendigkeit, explizit an den Server seit get_server_certificate verbinden wird dies bereits für Sie tun. Das einzige, was Sie brauchen, was Sie brauchen, ist die PEM von get_server_certificate in die DER Sie haben wollen zurück zu konvertieren:

import ssl 
hostname='www.google.com' 
port=443 

f = open('cert.der','wb') 
cert = ssl.get_server_certificate((hostname, port)) 
f.write(ssl.PEM_cert_to_DER_cert(cert))