2016-12-15 168 views
0

我需要將服務器證書下載爲DER文件。我正在使用python。我可以使用此腳本連接到服務器,但我需要在本地硬盤中下載證書,以便在下一階段解析它。如何使用python下載x509證書

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) 

回答

0

可以保存DER文件一對夫婦中間的轉換:

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

你能澄清一些關於'開(「/ tmp目錄/ google.der」,「WB ')as f:f.write(der)'?我得到錯誤:FileNotFoundError:[Errno 2]沒有這樣的文件或目錄:'/tmp/google.der'',但是,我在項目文件夾內創建了tmp文件夾。我也試過'open('../ tmp/google.der','wb')'但是這並沒有解決問題。 – user2192774

+0

@ user2192774你可能會得到這個錯誤,因爲你的系統沒有'/ tmp'目錄。在這種情況下,只需執行'open('google.der','wb)'。 –

1

沒有必要明確地連接到服務器,因爲get_server_certificate爲你已經做到這一點。你需要的東西,你需要的僅僅是由get_server_certificate返回的PEM轉換爲DER你想有:

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))