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