0

我有这个代码工作正常。我正在使用 USB eToken 签名。但是,在https://lapo.it/asn1js/中复制并粘贴此代码的 PEM 输出后,未显示信任链。此 eToken 由 CA 提供,因此它具有签名的信任链。怎么了?

lib = pkcs11.lib('/usr/lib/libeToken.so.9')

for slot in lib.get_slots():
    try:
        token = slot.get_token()
        with token.open(user_pin='****') as session:
        priv = session.get_key(object_class=pkcs11.constants.ObjectClass.PRIVATE_KEY)
        pub = session.get_key(object_class=pkcs11.constants.ObjectClass.PUBLIC_KEY)

        tbs = TbsCertificate({
            'version': 'v1',
            'serial_number': 1,
            'issuer': Name.build({
                'common_name': 'Test Certificate',
            }),
            'subject': Name.build({
                'common_name': 'Test Certificate',
            }),
            'signature': {
                'algorithm': 'sha256_rsa',
                'parameters': None,
            },
            'validity': {
                'not_before': Time({
                    'utc_time': datetime.datetime(2017, 1, 1, 0, 0),
                }),
                'not_after': Time({
                    'utc_time': datetime.datetime(2038, 12, 31, 23, 59),
                }),
            },
            'subject_public_key_info': {
                'algorithm': {
                    'algorithm': 'rsa',
                    'parameters': None,
                },
                'public_key': RSAPublicKey.load(encode_rsa_public_key(pub)),
            }
        })

        # Sign the TBS Certificate
        value = priv.sign(tbs.dump(),
                          mechanism=Mechanism.SHA256_RSA_PKCS)

        cert = Certificate({
            'tbs_certificate': tbs,
            'signature_algorithm': {
                'algorithm': 'sha256_rsa',
                'parameters': None,
            },
            'signature_value': value,
        })
        print(pem.armor('CERTIFICATE', cert.dump()).decode())
except TokenNotPresent:
    pass
4

1 回答 1

0

您已经构建并签署了一份单独的 X.509 证书,然后以 PEM 格式输出。信任链是多个证书,通常作为从叶子开始的 PEM 编码证书列表提供。

因此,您还需要输出签名证书。在 X.509 中有两条信息:发行者签署的您的公共证书(包括公钥)和您在令牌上使用的私钥。

PKCS#11 设备可以存储 X.509 证书,因此该证书的签名 X.509 对象很有可能在您的令牌上,您可以使用Session.get_objects检索它。

# Retrieve first certificate object from the HSM
cert = next(session.get_objects({Attribute.CLASS: ObjectClass.CERTIFICATE}))
# Retrieve the DER-encoded value of the certificate
der_bytes = cert[Attribute.VALUE]
# Convert to PEM encoding
pem_bytes = pem.armor('CERTIFICATE', der_bytes)

此示例来自Exporting Certificates

如果您的令牌上有多个证书,则可以包含其他搜索参数,包括证书类型、颁发者等。文档包含有关证书对象参数的更多信息。PKCS#11 规范仍然包含更多信息。

或者,如果您有其他形式的 X.509 证书,您可以简单地附加它。它不需要存储在 HSM 中。

于 2018-05-19T05:47:19.030 回答