Python - 获取有关证书“颁发者”

发布时间:2021-03-02 15:17

当我访问一些可能属于我公司的 HTTPS 网页时(我说可能是因为它是一家非常大的公司,有时很难确定某些网站是否属于我们的网站。这就是我问这个问题的原因- 我想找到一种方法来解决这个问题)我可以在浏览器中看到不同的证书,这取决于我当前是否连接到公司 VPN。连接到 VPN 后,我可以看到某种“内部”发行者,这(我猜)证实了上述网站属于我们公司。

基于 How can i get Certificate issuer information in python? 我设法编写了一个 python 脚本来获取有关证书颁发者的信息。但即使运行脚本的服务器位于 Azure 中但连接到公司网络,它也会获得“外部”证书。

然后我尝试将代理连接包含到基于 Alternative for get_server_certificate() with Proxy configured 的进程中,并以:

import socket, base64
from OpenSSL import SSL
    
port = 443
proxy = ('proxy_address', proxy_port)
username= 'username'
password= 'password'
token= base64.encodestring(('%s:%s' % (username, password)).encode('utf-8')).decode('utf-8')
    
s = socket.socket()
s.connect(proxy)
    
CONNECT = "CONNECT %s:%s HTTP/1.0\r\nAuthorization: Basic %sConnection: close\r\n" % (domain, port, token)
    
s.send(CONNECT.encode('utf-8'))
ctx = SSL.Context(SSL.SSLv23_METHOD)
    
ss = SSL.Connection(ctx, s)
ss.set_connect_state()
ss.do_handshake()
cert = ss.get_peer_certificate()
    
subject = dict(x[0] for x in cert['subject'])
issued_to = subject['commonName']
issuer = dict(x[0] for x in cert['issuer'])
issued_by = issuer['commonName']

但不幸的是它抛出: OpenSSL.SSL.SysCallError: (-1, 'Unexpected EOF')ss.do_handshake()

我听说套接字被代理阻止的未经验证的信息 - 这可能是一个原因吗?如果是这样,是否还有其他方法可以通过 python 访问与连接到公司网络的浏览器中可见的证书信息相同的证书信息?

回答1