Ssl 配置了代理的get_server_certificate()的备选方案

Ssl 配置了代理的get_server_certificate()的备选方案,ssl,proxy,ssl-certificate,Ssl,Proxy,Ssl Certificate,我正在尝试通过ssl.get\u server\u certificate()调用获取目标网站的证书。如果在我的服务器上配置了代理,此请求将超时(否则可以正常工作)。是否有方法将代理设置传递到ssl以获取目标服务器的证书?或者,是否有其他替代方案可以获得目标网站的证书,以接受代理设置 此外,目标网站不断更改,因此无法将其添加到防火墙规则中以避免超时 self.host = 'target-website.com' self.port = 443 PROXY = (''proxy_ip_addr'

我正在尝试通过ssl.get\u server\u 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)

get\u server\u证书
不支持代理。 但是,使用一些代码,您可以使用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))

我的代理服务器需要对connect进行身份验证。我添加了那段代码,得到了200条回复。但是,当我进行cert=ctx.wrap_socket(s,server_hostname=host[0]).getpeercert(True)调用时,我会在getpeercert self中得到文件“/usr/lib64/python2.7/ssl.py”,第678行。“usr/lib64/python2.7/ssl.py”,第638行,“usr/lib64/python2.7/socket.py”,第224行,在meth return getattr(self._sock,name)(*args)socket.error:[Errno 107]传输端点未连接抱歉,我得到的错误是:文件“/usr/lib64/python2.7/ssl.py”,第348行,在wrap_socket _context=self)文件“/usr/lib64/python2.7/ssl.py”,第609行,在init self.do\u handshake()文件“/usr/lib64/python2.7/ssl.py”中,第831行,在do_handshake self中。_sslobj.do_handshake()ssl.SSLEOFError:EOF发生违反协议(_ssl.c:579)“EOF发生违反协议”-可能是您的代理决定它不喜欢您的(可能是某些防火墙策略),或者端点与您的请求有问题(可能需要客户端证书?)。所示代码对我适用。我建议检查其他客户端是否可以通过代理连接到特定服务器。