我需要使用 pyOpenSSL 从 Python 生成 SSL 证书。有谁知道是否可以设置subjectAltName?从文档(https://pythonhosted.org/pyOpenSSL/api/crypto.html#x509-objects)看来并非如此。实际上,只提供了一个 set_subject 方法。有没有办法将它添加到证书中?
问问题
6609 次
3 回答
10
san_list = ["DNS:*.google.com", "DNS:google.ym"]
cert.add_extensions([
OpenSSL.crypto.X509Extension(
"subjectAltName", False, ", ".join(san_list)
)
])
于 2016-05-25T14:28:56.613 回答
3
我想我会扩展Vans S 的答案,因为我一直在疯狂地试图弄清楚为什么我的 csrgen 脚本不起作用并且我终于破解了它。可悲的是,这根本不明显(对我来说)。通常我不在乎,因为我的大多数证书都是每个证书一个名称,所以主题中的 CN 通常没问题。但是,既然Chrome 不会接受没有设置 SAN 的证书(假设 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())
])
于 2017-05-22T17:10:33.280 回答
2
我最终解决了它。我错过了 subjectAltName 被认为是标准扩展名。因此可以使用 pyOpenSSL 的方法 add_extensions 来添加它。
更多信息可以在 https://www.openssl.org/docs/apps/x509v3_config.html#STANDARD_EXTENSIONS找到
于 2014-06-30T08:37:18.670 回答