用Python创建自签名X509证书

用Python创建自签名X509证书,python,Python,我随后创建了一个X509证书。代码是: from OpenSSL import crypto, SSL from socket import gethostname from pprint import pprint from time import gmtime, mktime CERT_FILE = "selfsigned.crt" KEY_FILE = "private.key" def create_self_signed_cert(): # create a key pa

我随后创建了一个X509证书。代码是:

from OpenSSL import crypto, SSL
from socket import gethostname
from pprint import pprint
from time import gmtime, mktime

CERT_FILE = "selfsigned.crt"
KEY_FILE = "private.key"

def create_self_signed_cert():

    # create a key pair
    k = crypto.PKey()
    k.generate_key(crypto.TYPE_<wbr>RSA, 1024)

    # create a self-signed cert
    cert = crypto.X509()
    cert.get_subject().C = "UK"
    cert.get_subject().ST = "London"
    cert.get_subject().L = "London"
    cert.get_subject().O = "Dummy Company Ltd"
    cert.get_subject().OU = "Dummy Company Ltd"
    cert.get_subject().CN = gethostname()
    cert.set_serial_number(1000)
    cert.gmtime_adj_notBefore(0)
    cert.gmtime_adj_notAfter(10*<wbr>365*24*60*60)
    cert.set_issuer(cert.get_<wbr>subject())
    cert.set_pubkey(k)
    cert.sign(k, 'sha1')

    open(CERT_FILE, "wt").write(
        crypto.dump_certificate(<wbr>crypto.FILETYPE_PEM, cert))
    open(KEY_FILE, "wt").write(
        crypto.dump_privatekey(crypto.<wbr>FILETYPE_PEM, k))

create_self_signed_cert()
从OpenSSL导入加密,SSL
从套接字导入gethostname
从pprint导入pprint
从时间导入gmtime,mktime
CERT_FILE=“selfsigned.crt”
KEY\u FILE=“private.KEY”
def创建自签名证书():
#创建密钥对
k=crypto.PKey()
k、 生成密钥(crypto.TYPE\u RSA,1024)
#创建自签名证书
cert=crypto.X509()
证书get_subject().C=“UK”
证书get_subject().ST=“伦敦”
证书get_subject().L=“伦敦”
证书get_subject().O=“虚拟公司”
证书get_subject().OU=“虚拟公司”
证书get_subject().CN=gethostname()
证书设置序列号(1000)
cert.gmtime_adj_notBefore(0)
cert.gmtime_adj_notAfter(10*365*24*60*60)
证书设置颁发者(证书获取主体())
证书集_公钥(k)
证书标志(k,‘sha1’)
打开(证书文件“wt”)。写入(
crypto.dump_证书(crypto.FILETYPE_PEM,cert))
打开(密钥文件“wt”)。写入(
crypto.dump_privatekey(crypto.FILETYPE_PEM,k))
创建自签名证书()

但是当我运行它时,代码有点问题。有人能告诉我
的意思吗?
cert.gmtime\u adj\u notAfter(10*365*24*60*60)
中有一个
SyntaxError
。Thx.

只需删除
。我真傻。

这是一个非常有用的问题;由于引用链接现在已失效;这是搜索“python创建ssl证书”的第一个结果之一

不过,我还要补充一点,“open(xxx,wt”).write()”稍后会提出问题。通过不显式关闭该文件,您可能会发现,当您尝试实际使用该文件时,垃圾收集器没有运行,从而导致失败

最好使用:

with open(xxx, "w") as f:
    f.write()

这将确保完成后关闭文件。

一个与python3一起使用的版本

from OpenSSL import crypto, SSL

def cert_gen(
    emailAddress="emailAddress",
    commonName="commonName",
    countryName="NT",
    localityName="localityName",
    stateOrProvinceName="stateOrProvinceName",
    organizationName="organizationName",
    organizationUnitName="organizationUnitName",
    serialNumber=0,
    validityStartInSeconds=0,
    validityEndInSeconds=10*365*24*60*60,
    KEY_FILE = "private.key",
    CERT_FILE="selfsigned.crt"):
    #can look at generated file using openssl:
    #openssl x509 -inform pem -in selfsigned.crt -noout -text
    # create a key pair
    k = crypto.PKey()
    k.generate_key(crypto.TYPE_RSA, 4096)
    # create a self-signed cert
    cert = crypto.X509()
    cert.get_subject().C = countryName
    cert.get_subject().ST = stateOrProvinceName
    cert.get_subject().L = localityName
    cert.get_subject().O = organizationName
    cert.get_subject().OU = organizationUnitName
    cert.get_subject().CN = commonName
    cert.get_subject().emailAddress = emailAddress
    cert.set_serial_number(serialNumber)
    cert.gmtime_adj_notBefore(0)
    cert.gmtime_adj_notAfter(validityEndInSeconds)
    cert.set_issuer(cert.get_subject())
    cert.set_pubkey(k)
    cert.sign(k, 'sha512')
    with open(CERT_FILE, "wt") as f:
        f.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert).decode("utf-8"))
    with open(KEY_FILE, "wt") as f:
        f.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, k).decode("utf-8"))

cert_gen()

指南作者使用的是指示您必须修改才能自己使用代码的位置。您是对的。当我删除
时,一切都正常。thx
是HTML标记,表示此处允许分词。我认为最有可能的答案是这是某种意外,不知何故一些博客软件/CMS/etc在运行过程中出现了故障,并意外地插入了这些
HTML标记。我认为这比作者故意将
(为什么选择那个特定的字符串?)放在代码中这些相当随意的位置更有可能意味着什么。这是学习新东西时的常见现象。如果你放弃,错误只是失败……尤达,是吗?作为第一次使用它的人,我还必须运行
pip install pyOpenSSL
,以确保导入
OpenSSL
模块。我想我会添加它,因为所需的pip模块名称实际上与您需要在代码中引用的名称不同