如何在不直接访问私钥的情况下创建 x X.509 证书?



使用 HSM 我可以下载RSA 4096 的公钥,并且可以使用 HSM 使用相应的私钥加密 blob,我无法下载该私钥。 我正在尝试查找有关如何使用 HSM API 的参考,以自己构建 X509 证书。我可以在python中找到下面的示例,包装openssl libs。 它基本上可以做所有的事情,但是

from OpenSSL import crypto, SSL
from socket import gethostname
from pprint import pprint
from time import gmtime, mktime
CERT_FILE = "selfsigned.crt"
KEY_FILE = "private.key"
def create_self_signed_cert():
# create a key pair
k = crypto.PKey()
k.generate_key(crypto.TYPE_RSA, 1024)
# create a self-signed cert
cert = crypto.X509()
cert.get_subject().C = "UK"
cert.get_subject().ST = "London"
cert.get_subject().L = "London"
cert.get_subject().O = "Dummy Company Ltd"
cert.get_subject().OU = "Dummy Company Ltd"
cert.get_subject().CN = gethostname()
cert.set_serial_number(1000)
cert.gmtime_adj_notBefore(0)
cert.gmtime_adj_notAfter(10*365*24*60*60)
cert.set_issuer(cert.get_subject())
cert.set_pubkey(k)
cert.sign(k, 'sha1')
open(CERT_FILE, "wt").write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert))
open(KEY_FILE, "wt").write(crypto.dump_privatekey(crypto.FILETYPE_PEM, k))
create_self_signed_cert()

大多数情况下,我期望可能的是更换生产线

cert.sign(k, 'sha1')

通过对我的 HSM 的 API 进行相应的调用,并"导出"证书"的结构。有可能吗?

因此,经过一天的研究,我在 向证书添加签名 .虽然似乎有一些Python示例如何使用pyasn1通过Python构建证书,但最健壮的似乎是使用boucycastle库的java示例。我还找到了一个强有力的答案,如何在此处将其与openssl合并 如果私钥在 HSM 中,如何生成证书?(主要是第 3 点和第 4 点(,但这种方法远远超出了我的能力。

当您希望其他人(如您的 HSM(为您签署证书时,标准方法是生成证书签名请求 (CSR( 并将 CSR 发送给签名者。CSR 可以包含您在制作证书时可以设置的所有字段,这些值将反映在生成的证书中。

虽然您可以使用正在使用的OpenSSL库执行此操作,但请参阅X509Req,他们的文档(我引用("强烈建议"您改用加密库。(它们由同一组人维护。

在加密库中,您可以使用 CertificateSigningRequestBuilder 创建 CSR。引用他们的文档:

>>> from cryptography import x509
>>> from cryptography.hazmat.primitives import hashes
>>> from cryptography.hazmat.primitives.asymmetric import rsa
>>> from cryptography.x509.oid import AttributeOID, NameOID
>>> private_key = rsa.generate_private_key(
...     public_exponent=65537,
...     key_size=2048,
... )
>>> builder = x509.CertificateSigningRequestBuilder()
>>> builder = builder.subject_name(x509.Name([
...     x509.NameAttribute(NameOID.COMMON_NAME, u'cryptography.io'),
... ]))
>>> builder = builder.add_extension(
...     x509.BasicConstraints(ca=False, path_length=None), critical=True,
... )
>>> builder = builder.add_attribute(
...     AttributeOID.CHALLENGE_PASSWORD, b"changeit"
... )
>>> request = builder.sign(
...     private_key, hashes.SHA256()
... )
>>> isinstance(request, x509.CertificateSigningRequest)
True

要以通常用于发送它们的格式呈现 CSR,请执行以下操作:

>>> from cryptography.hazmat.primitives import serialization
>>> request.public_bytes(serialization.Encoding.PEM)

相关内容

最新更新