Fix OpenSSL string/bytes python3 issues

OpenSSL works a bit differently in python3 which requires delicate
handling.
This commit is contained in:
Clint Byrum
2015-05-20 23:38:31 -07:00
parent 9c91638891
commit 153de08645
2 changed files with 18 additions and 7 deletions

View File

@@ -4,6 +4,7 @@ import base64
import datetime import datetime
import dateutil.parser import dateutil.parser
import pytz import pytz
import six
from OpenSSL import crypto from OpenSSL import crypto
from os.path import join from os.path import join
from os import remove from os import remove
@@ -154,10 +155,13 @@ class OpenSSLWrapper(object):
tmp_cert = crypto.dump_certificate(crypto.FILETYPE_PEM, cert) tmp_cert = crypto.dump_certificate(crypto.FILETYPE_PEM, cert)
tmp_key = None tmp_key = None
if cipher_passphrase is not None: if cipher_passphrase is not None:
passphrase = cipher_passphrase["passphrase"]
if isinstance(cipher_passphrase["passphrase"],
six.string_types):
passphrase = passphrase.encode('utf-8')
tmp_key = crypto.dump_privatekey(crypto.FILETYPE_PEM, k, tmp_key = crypto.dump_privatekey(crypto.FILETYPE_PEM, k,
cipher_passphrase["cipher"], cipher_passphrase["cipher"],
cipher_passphrase[ passphrase)
"passphrase"])
else: else:
tmp_key = crypto.dump_privatekey(crypto.FILETYPE_PEM, k) tmp_key = crypto.dump_privatekey(crypto.FILETYPE_PEM, k)
if write_to_file: if write_to_file:
@@ -190,7 +194,7 @@ class OpenSSLWrapper(object):
f.close() f.close()
def read_str_from_file(self, file, type="pem"): def read_str_from_file(self, file, type="pem"):
f = open(file) f = open(file, 'rt')
str_data = f.read() str_data = f.read()
f.close() f.close()
@@ -257,7 +261,10 @@ class OpenSSLWrapper(object):
cert.set_pubkey(req_cert.get_pubkey()) cert.set_pubkey(req_cert.get_pubkey())
cert.sign(ca_key, hash_alg) cert.sign(ca_key, hash_alg)
return crypto.dump_certificate(crypto.FILETYPE_PEM, cert) cert_dump = crypto.dump_certificate(crypto.FILETYPE_PEM, cert)
if isinstance(cert_dump, six.string_types):
return cert_dump
return cert_dump.decode('utf-8')
def verify_chain(self, cert_chain_str_list, cert_str): def verify_chain(self, cert_chain_str_list, cert_str):
""" """
@@ -327,6 +334,8 @@ class OpenSSLWrapper(object):
"signed certificate.") "signed certificate.")
cert_algorithm = cert.get_signature_algorithm() cert_algorithm = cert.get_signature_algorithm()
if six.PY3:
cert_algorithm = cert_algorithm.decode('ascii')
cert_asn1 = crypto.dump_certificate(crypto.FILETYPE_ASN1, cert) cert_asn1 = crypto.dump_certificate(crypto.FILETYPE_ASN1, cert)
@@ -342,7 +351,9 @@ class OpenSSLWrapper(object):
signature_payload = cert_signature_decoded.payload signature_payload = cert_signature_decoded.payload
if signature_payload[0] != '\x00': sig_pay0 = signature_payload[0]
if ((isinstance(sig_pay0, int) and sig_pay0 != 0) or
(isinstance(sig_pay0, str) and sig_pay0 != '\x00')):
return (False, return (False,
"The certificate should not contain any unused bits.") "The certificate should not contain any unused bits.")
@@ -355,4 +366,4 @@ class OpenSSLWrapper(object):
except crypto.Error as e: except crypto.Error as e:
return False, "Certificate is incorrectly signed." return False, "Certificate is incorrectly signed."
except Exception as e: except Exception as e:
return False, "Certificate is not valid for an unknown reason." return False, "Certificate is not valid for an unknown reason. %s" % str(e)

View File

@@ -174,7 +174,7 @@ class TestGenerateCertificates(unittest.TestCase):
request=True) request=True)
cert_str = osw.create_cert_signed_certificate(ca_cert_str, ca_key_str, cert_str = osw.create_cert_signed_certificate(ca_cert_str, ca_key_str,
req_cert_str, req_cert_str,
passphrase="qwerty") passphrase=b"qwerty")
valid = False valid = False
try: try: