2015-06-05 25 views
12

Mam witrynę z włączonymi zabezpieczeniami PKI. Każdy klient korzystał z czytnika kart, aby załadować swój certyfikat lub certyfikat został zainstalowany w magazynie certyfikatu IE na swoim pudełku.Użyj Pythona, aby uzyskać dostęp do strony z zabezpieczeniami PKI

Więc moje pytanie jest:

  1. W jaki sposób można użyć certyfikatu czytnika kart lub certyfikat zapisany w systemie weryfikacji systemu?
  2. Jak przekazać dane uwierzytelniające na stronie, aby powiedzieć, hej jestem ja i mogę uzyskać dostęp do usługi? Przykładem mogą być miękkie certyfikaty. Mogę wymyślić część czytnika kart później.

Szukałem w pobliżu i nie znalazłem nic, co mogłoby mi pomóc w tej sytuacji. Django ma kilka modułów, ale to nie jest opcja, ponieważ interesuję się tylko stroną klienta. Nie tworzę strony do hostowania usługi. Muszę po prostu uzyskać dostęp do tych usług.

Mam ten działający rodzaj kodu. Ja po prostu nie wiem, jak obsługiwać przekierowanie Dostaję:

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() 

Efektem tego wszystkiego jest:

<!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> 

Każda pomoc pod warunkiem, byłoby świetnie! specyfikacje

Program: Python 2.7.8, Windows 2012 R2

+0

Czy możesz podzielić się tym, co dotychczas wypróbowałeś? Rywalizacja na # 1 (uzyskanie certyfikatu) w tej chwili, zakładając, że "autoryzacja PKI" oznacza "uwierzytelnienie certyfikatu klienta", uważam, że # 2 jest wypiekany w bibliotekach, które zawijają https/ssl/tls. Np. W żądaniach używaj: 'requests.get (url, cert = ('path/to/cert', 'path/to/key'))' (przepraszam - nie chciałam pisać jako odpowiedź) – bimsapi

+0

It wygląda na to, że to, co nazywasz "PKI", to tak naprawdę "uwierzytelnianie certyfikatu klienta" (PKI jest szerszym polem niż to i zazwyczaj obejmuje weryfikację certyfikatów serwera). Czy wiesz, czy czytnik kart obsługuje sterowniki PKCS # 11, czy jest to tylko interfejs API systemu Windows? – Bruno

+0

Czy przy okazji zamierzasz używać dowolnych bibliotek w Pythonie? – Bruno

Odpowiedz

3

stworzyłem obsługi PKI do obsługi żądań, dzięki czemu można go używać pracować urllib2 bibliotekę.

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) 

Aby skorzystać z tej funkcji, musisz użyć cookiejar z obsługą.

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 .... 

Mam nadzieję, że to pomoże wszystkim!

1

wypróbować ten kod

#!/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() 
+0

dziękuję za tę odpowiedź. Czy httplib może obsługiwać przekierowania? –

Powiązane problemy