配置了代理的get_server_certificate()的替代方法

时间:2018-12-03 04:57:58

标签: ssl proxy ssl-certificate

我正在尝试通过ssl.get_server_certificate()调用来获取目标网站的证书。如果在我的服务器上配置了代理,则此请求超时(否则工作正常)。有没有办法将代理设置传递给ssl以获取目标服务器的证书?或者是否有其他选择来获得采用代理设置的目标网站的证书。

此外,目标网站不断变化,因此无法将其添加到防火墙规则中以避免超时。

self.host = 'target-website.com'
self.port = 443
PROXY = (''proxy_ip_addr', 3128)
current_cert = ssl.get_server_certificate((self.host, self.port),
                                              ssl_version=ssl.PROTOCOL_TLSv1)

1 个答案:

答案 0 :(得分:1)

get_server_certificate不支持代理。 但是使用一些代码,您可以使用HTTP CONNECT请求通过代理创建隧道,将隧道升级到SSL,然后获取证书:

import socket
import ssl

host  = ('target.example.com',443)
proxy = (proxy_ip,proxy_port)

# connect to proxy
s = socket.socket()
s.connect(proxy)

# create tunnel to target
s.send("CONNECT {}:{} HTTP/1.0\r\n\r\n".format(*host))
buf = s.recv(8192)
assert(buf[9:12] == '200') # HTTP/1.1 200 ...

# upgrade socket to ssl - ignore certifcate errors since we only want
# to get the certificate and don't transfer sensitive data
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
cert = ctx.wrap_socket(s, server_hostname = host[0]).getpeercert(True)
print(ssl.DER_cert_to_PEM_cert(cert))