是否可以使用pyOpenSSL设置subjectAltName?

时间:2014-06-29 11:43:48

标签: python ssl openssl pyopenssl

我需要使用pyOpenSSL从Python生成SSL证书。有谁知道是否可以设置subjectAltName?从文档(https://pythonhosted.org/pyOpenSSL/api/crypto.html#x509-objects)来看,它似乎并非如此。 实际上,只提供了set_subject方法。 有没有办法将其添加到证书中?

3 个答案:

答案 0 :(得分:9)

san_list = ["DNS:*.google.com", "DNS:google.ym"]
cert.add_extensions([
    OpenSSL.crypto.X509Extension(
        "subjectAltName", False, ", ".join(san_list)
   )
])

答案 1 :(得分:2)

我以为我会扩展Vans S's answer,因为我一直在努力弄清楚为什么我的csrgen脚本无效,我终于破解了它。可悲的是,这对我来说并不明显(对我而言)。通常我不在乎,因为我的大多数证书都是每个证书的一个名称,因此主题中的CN通常很好。 然而现在Chrome won't accept certificates without the SANs set(并假设FF / IE即将推出,如果还没有),这就是现在的阻止。

我的Python 3看起来像这样(其中self是一个继承自crypto.X509Req)的类。

# Add base constraints
self.add_extensions([
    crypto.X509Extension(
        b"keyUsage", False,
        b"Digital Signature, Non Repudiation, Key Encipherment"),
    crypto.X509Extension(
        b"basicConstraints", False, b"CA:FALSE"),
    crypto.X509Extension(
        b'extendedKeyUsage', False, b'serverAuth, clientAuth'),
])

# If there are multiple names, add them all as SANs.
if self.sans:
    self.add_extensions([crypto.X509Extension(
        b"subjectAltName", False, self.sans.encode())])

对我来说,它看起来应该有效。它运行,不产生错误,不产生警告,并生成CSR和密钥对,但CSR 没有SAN扩展

解决方案? X509Req().add_extensions()只能运作一次!我第二次在这里打电话似乎什么也没做。以下是有效的。

# Add all extensions in one go as only the first call to 
# add_extensions actually does anything. Subsequent calls will fail 
# silently.
self.add_extensions([
    crypto.X509Extension(
        b"keyUsage", False,
        b"Digital Signature, Non Repudiation, Key Encipherment"),
    crypto.X509Extension(
        b"basicConstraints", False, b"CA:FALSE"),
    crypto.X509Extension(
        b'extendedKeyUsage', False, b'serverAuth, clientAuth'),
    crypto.X509Extension(
        b"subjectAltName", False, self.sans.encode())
])

答案 2 :(得分:1)

我最终解决了它。我错过了subjectAltName被认为是标准扩展。所以可以使用pyOpenSSL的add_extensions方法添加它。

可以在https://www.openssl.org/docs/apps/x509v3_config.html#STANDARD_EXTENSIONS

找到更多信息