Python 将客户端证书与urllib2一起使用

Python 将客户端证书与urllib2一起使用,python,ssl,certificate,urllib2,mutual-authentication,Python,Ssl,Certificate,Urllib2,Mutual Authentication,我需要在服务器和远程web服务之间创建一个安全通道。我将使用带有客户端证书的HTTPS。我还需要验证远程服务提供的证书 如何将自己的客户端证书用于urllib2 我需要在代码中做什么来确保远程证书是正确的 这是一个看起来相关的,并且有一个建议的补丁。检查因为alex的答案是一个链接,而该页面上的代码格式很差,我将把它放在这里供后代使用: import urllib2, httplib class HTTPSClientAuthHandler(urllib2.HTTPSHandler):

我需要在服务器和远程web服务之间创建一个安全通道。我将使用带有客户端证书的HTTPS。我还需要验证远程服务提供的证书

  • 如何将自己的客户端证书用于urllib2

  • 我需要在代码中做什么来确保远程证书是正确的


  • 这是一个看起来相关的,并且有一个建议的补丁。

    检查

    因为alex的答案是一个链接,而该页面上的代码格式很差,我将把它放在这里供后代使用:

    import urllib2, httplib
    
    class HTTPSClientAuthHandler(urllib2.HTTPSHandler):
        def __init__(self, key, cert):
            urllib2.HTTPSHandler.__init__(self)
            self.key = key
            self.cert = cert
    
        def https_open(self, req):
            # Rather than pass in a reference to a connection class, we pass in
            # a reference to a function which, for all intents and purposes,
            # will behave as a constructor
            return self.do_open(self.getConnection, req)
    
        def getConnection(self, host, timeout=300):
            return httplib.HTTPSConnection(host, key_file=self.key, cert_file=self.cert)
    
    opener = urllib2.build_opener(HTTPSClientAuthHandler('/path/to/file.pem', '/path/to/file.pem.') )
    response = opener.open("https://example.org")
    print response.read()
    

    根据Antoine Pitrou对Hank Gay答案中相关问题的回答,可以通过使用附带的
    ssl
    库(从2011年起)稍微简化:

    import ssl
    import urllib.request
    
    context = ssl.create_default_context()
    context.load_cert_chain('/path/to/file.pem', '/path/to/file.key')
    opener = urllib.request.build_opener(urllib.request.HTTPSHandler(context=context))
    response = opener.open('https://example.org')
    print(response.read())
    
    (Python3代码,但Python2中也提供了
    ssl
    库)


    load\u cert\u chain
    功能还接受一个可选的密码参数,允许对私钥进行加密。

    非常感谢!几天来,我一直在使用私有证书和证书颁发机构跟踪一个bug,以便使用python中的请求库连接到Apache服务器。我可以验证我的证书是否在浏览器中工作,但是每次出现“握手错误”时它都会失败。最后,我使用上面的类来证明客户端证书工作正常并进行了正确的身份验证。事实证明,我使用的1.2.3版本的请求库中有一个bug。希望这个评论能帮助其他遇到同样问题的人。我是Python新手,所以我想知道-这里什么时候调用https_open()函数?如果可能的话,请描述这段代码的执行流程是什么?因此,我遵循了这些说明,当我使用python 2.7.9或更高版本时,我得到了一个urlopen错误:“ssl证书验证失败”。我相信我需要添加一个带有我自己证书链的SSLContext,但我不是100%确定,您是否介意在您的示例中提供任何建议或提示。谢谢死链接,最后存档的内容,这正是@tghw向我们展示的内容,上面的
    create\u default\u context
    函数是在2.7.9中引入的,因此这在(公认的)非常旧的Python 2版本中不起作用。