首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >信任链在哪里?[python] asn1crypto和pkcs11 Aladdin USB eToken

信任链在哪里?[python] asn1crypto和pkcs11 Aladdin USB eToken
EN

Stack Overflow用户
提问于 2018-05-19 01:01:55
回答 1查看 431关注 0票数 0

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

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2018-05-19 13:47:19

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

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

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

代码语言:javascript
复制
# 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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50416132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档