我想我会在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())
])