使用python访问具有PKI安全性的站点

时间:2015-06-05 12:10:56

标签: python python-2.7 ssl urllib2 pki

我有一个启用了PKI安全性的站点。每个客户端使用读卡器加载其证书,或者证书安装在其盒子上的IE证书存储中。

所以我的问题是:

  1. 如何使用读卡器证书或系统上存储的证书来验证系统?
  2. 如何将凭据传递到网站上说,嘿,我是我,我可以访问该服务吗?他们的例子可以使用软证书。我可以稍后找出读卡器部分。
  3. 我一直在四处寻找,在这种情况下我无法想出任何帮助我的事情。 Django有很多模块,但这不是一个选项,因为我只关心客户端的事情。我没有创建托管服务的网站。我只需要访问这些服务。

    我有这个代码的工作方式。我只是不知道如何处理我得到的重定向:

    import httplib
    KEYFILE = r"C:\cert\my.key"
    CERTFILE = r"c:\cert\my.pem"
    HOSTNAME = 'machine.com'
    
    conn = httplib.HTTPSConnection(
        HOSTNAME,
        key_file = KEYFILE,
        cert_file = CERTFILE
    )
    
    conn.putrequest('GET', '/arcgis/sharing/rest?f=json')
    conn.endheaders()
    response = conn.getresponse()
    print response.read()
    

    所有这一切的结果是:

    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>302 Found</title>
    </head><body>
    <h1>Found</h1>
    <p>The document has moved <a href="https://machine.com/pki?https://machine.com/arcgis/sharing/rest%3f&amp;f=json">here</a>.</p>
    </body></html>
    

    提供的任何帮助都会很棒!

    软件规格:python 2.7.8,Windows 2012 R2

2 个答案:

答案 0 :(得分:3)

我创建了一个PKI处理程序来处理请求,所以我可以使用它工作urllib2库。

import httplib, urllib2

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,
                                             timeout=timeout)

要使用此功能,您需要使用带有处理程序的cookiejar。

from cookielib import CookieJar
cookiejar = CookieJay()
handlers = []
handlers.append(HTTPSClientAuthHandler(somekey, somecert))
handlers.append(urllib2.HTTPCookieProcessor(cookiejar))
opener = urllib2.build_opener(*handlers)
... do other urllib2 calls ....

希望这有助于每个人!

答案 1 :(得分:1)

试试此代码

#!/usr/bin/env python

import httplib

CERTFILE = '/home/robr/mycert'
HOSTNAME = 'localhost'

conn = httplib.HTTPSConnection(
    HOSTNAME,
    key_file = CERTFILE,
    cert_file = CERTFILE
)
conn.putrequest('GET', '/ssltest/')
conn.endheaders()
response = conn.getresponse()
print response.read()