使用SAN创建CSR的Python函数

使用SAN创建CSR的Python函数,python,x509certificate,csr,pyopenssl,subject-alternative-name,Python,X509certificate,Csr,Pyopenssl,Subject Alternative Name,我找到了在该线程上创建CSR的函数: 但是没有提到如何将SAN(ValueCaltNoN名称)添加到CSR中,这对于浏览器来说是重要的,考虑使用CSR生成的证书是安全的。 然后,我在此线程中找到了一个单独的函数,用于将SAN添加到CSR: 问题是,无论出于何种原因,我无法将两者结合起来。每当我添加它时,似乎Microsoft Active Directory证书服务不喜欢它,并给我以下错误: 我做错了什么?提前谢谢你的帮助 以下是我的代码如何寻找参考: def create_csr(comm

我找到了在该线程上创建CSR的函数:

但是没有提到如何将SAN(ValueCaltNoN名称)添加到CSR中,这对于浏览器来说是重要的,考虑使用CSR生成的证书是安全的。 然后,我在此线程中找到了一个单独的函数,用于将SAN添加到CSR:

问题是,无论出于何种原因,我无法将两者结合起来。每当我添加它时,似乎Microsoft Active Directory证书服务不喜欢它,并给我以下错误:

我做错了什么?提前谢谢你的帮助

以下是我的代码如何寻找参考:

def create_csr(common_name, country=None, state=None, city=None,
       organization=None, organizational_unit=None,
       email_address=None):
"""
Args:
    common_name (str).
    country (str).
    state (str).
    city (str).
    organization (str).
    organizational_unit (str).
    email_address (str).
Returns:
    (str, str).  Tuple containing private key and certificate
    signing request (PEM).
"""
key = OpenSSL.crypto.PKey()
key.generate_key(OpenSSL.crypto.TYPE_RSA, 2048)

req = OpenSSL.crypto.X509Req()
req.get_subject().CN = common_name
if country:
    req.get_subject().C = country
if state:
    req.get_subject().ST = state
if city:
   req.get_subject().L = city
if organization:
    req.get_subject().O = organization
if organizational_unit:
req.get_subject().OU = organizational_unit
if email_address:
    req.get_subject().emailAddress = email_address

req.set_pubkey(key)
req.sign(key, 'sha256')


san_list = ["IP:" + common_name, "DNS:" + common_name]
req.add_extensions([
    OpenSSL.crypto.X509Extension(
        "subjectAltName".encode("utf-8"), False, (", ".join(san_list)).encode("utf-8")
    )
])

private_key = OpenSSL.crypto.dump_privatekey(
    OpenSSL.crypto.FILETYPE_PEM, key)

csr = OpenSSL.crypto.dump_certificate_request(
    OpenSSL.crypto.FILETYPE_PEM, req)

return private_key, csr

看起来您在完成创建请求之前签署了请求。在添加所有字段(包括所有扩展名)之前不要对其进行签名。因此,当我在req.sign之前向上移动一个字段时,代码运行正常,但当我尝试在我正在使用的moxa开关上上载输出证书时,它不喜欢它。当我删除整个SAN代码行时,生成的证书会被MOXA很好地接受。