能否通过pyOpenSSL设置subjectAltName?

6 投票
3 回答
8340 浏览
提问于 2025-04-18 11:29

我想用Python和pyOpenSSL生成SSL证书。有人知道是否可以设置subjectAltName(主题备用名称)吗?从文档来看,似乎不行,文档里只提供了一个set_subject的方法。有没有什么办法可以把这个添加到证书里呢?

3 个回答

5

我想进一步解释一下Vans S的回答,因为我一直在为我的csrgen脚本不工作而烦恼,终于找到了原因。可惜这对我来说一点也不明显。通常我不太在意,因为我的大多数证书都是一个名字对应一个证书,所以主题中的CN通常没问题。但是现在Chrome不接受没有设置SAN的证书(假设Firefox和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())
])
13

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,不知道该怎么解决。比如,有人可能在使用某个特定的函数时,发现它的表现和预期的不一样。这种情况很常见,尤其是对于刚开始学习编程的人来说。

通常,解决这些问题的方法是仔细检查代码,看看是否有拼写错误,或者参数传递是否正确。有时候,查阅相关的文档或者在网上搜索类似的问题,也能找到解决方案。

总之,遇到问题时不要慌张,慢慢分析,通常都能找到答案。

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

我最终解决了这个问题。我之前没注意到subjectAltName被认为是一个标准扩展。所以可以通过pyOpenSSL的方法add_extensions来添加它。

更多信息可以在这个链接找到: https://www.openssl.org/docs/apps/x509v3_config.html#STANDARD_EXTENSIONS

撰写回答