2016-12-15 167 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))