def create_certificate(self, request, issuer_cert, issuer_key, serial, days=3650, digest='sha256', extensions=[], subject_alt_names='', version=2):
"""
Generate a certificate given the certificate request.
Arguments: request - Certificate request to sign
issuer_cert - The certificate of the issuer
issuer_key - The private key of the issuer
extensions - x509 extensions provided as a dictionary :name, :critical, :value
subject_alt_names - subject alt names e.g. IP:192.168.7.1 or DNS:my.domain
serial - The serial number to assign to the certificate
days - The number of days of validity (starting from now)
digest - The digest method for signing (by default sha256)
"""
certificate = crypto.X509()
# Handle x509 extensions
for extension in extensions:
# handle issuer and subjects that need to be self-referential (root certificate)
if 'subject' in extension.keys() and extension['subject'] == 'self':
extension['subject'] = certificate
if 'issuer' in extension.keys() and extension['issuer'] == 'self':
extension['issuer'] = certificate
elif 'issuer' in extension.keys() and extension['issuer'] != 'self':
extension['issuer'] = issuer_cert
# have to explicitly set 'critical' extension to a bool.
if 'critical' in extension.keys():
extension['critical'] = extension['critical'].lower() in ("yes", "true", "t", "1")
# add the extensions to the request
certificate.add_extensions([crypto.X509Extension(**extension)])
# Handle the subject alternative names (these are just X509 extensions)
if len(subject_alt_names) != 0:
certificate.add_extensions([crypto.X509Extension("subjectAltName", False, ", ".join(subject_alt_names))])
certificate.set_serial_number(serial)
certificate.set_version(version)
certificate.gmtime_adj_notBefore(0)
certificate.gmtime_adj_notAfter(days*86400)
certificate.set_subject(request.get_subject())
certificate.set_issuer(issuer_cert.get_subject())
certificate.set_pubkey(request.get_pubkey())
certificate.sign(issuer_key, digest)
return certificate
评论列表
文章目录