5

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

4

3 回答 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 回答