Recent versions of
The key and cert came to me packaged in a PKCS#12 format file. The first thing I needed to do was unpack the key and the cert like so:
My (hackish) solution was to remove the encryption on the key before using it to connect. You can do this by re-exporting the key from the PKCS#12 file:
mechanize
support SSL connections and so, by extension, does twill
. Recently I have been trying to open an HTTPS connection to a site that requires both a certificate and a client key. To try this at home, you will need a version of openssl
.The key and cert came to me packaged in a PKCS#12 format file. The first thing I needed to do was unpack the key and the cert like so:
openssl pkcs12 -clcerts -nokeys -in cert.p12 -out cert.pemAfter doing this, I plugged in the filenames of the cert and key in my
openssl pkcs12 -nocerts -in cert.p12 -out key.pem
twill
code. Note that you need to access the underlying mechanize.Browser
object when setting the client certificate:import twillThe problem you run into when doing this is that the SSL libraries prompt the user to enter the password for encrypted keys at runtime. This makes automating the interaction tricky at best. I tried fumbling with the
from twill.commands import *
host = 'mysecurehost.com:443'
b = twill.get_browser()
b._browser.add_client_certificate(host, 'key.pem', 'cert.pem')
go('https://mysecurehost.com/secured_url.html')
show()
PyOpenSSL
library but it seems that setting a callback for the passphrase retrieval does not actually work. The set
method call returns but the callback is never called during key decryption.My (hackish) solution was to remove the encryption on the key before using it to connect. You can do this by re-exporting the key from the PKCS#12 file:
openssl pkcs12 -nodes -nocerts -in cert.p12 -out unencrypted_key.pemNow if you use
unencrypted_key.pem
in the twill
code above, you will be able to connect without providing a password for the key.