信任链在哪里?[python]asn1crypto和pkcs11阿拉丁USB eToken

信任链在哪里?[python]asn1crypto和pkcs11阿拉丁USB eToken,python,cryptography,pkcs#11,asn1,Python,Cryptography,Pkcs#11,Asn1,我的代码运行良好。我正在用USB电子签名机签名。但是,在复制和粘贴该代码的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:

我的代码运行良好。我正在用USB电子签名机签名。但是,在复制和粘贴该代码的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

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

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

PKCS#11设备可以存储X.509证书,因此此证书的已签名X.509对象很有可能位于您的令牌上,您可以使用进行检索

这个例子来自

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


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

非常感谢!它就像一个符咒。eToken有3件。Rsa私钥和公钥,以及证书,即信任链,对吗?所以,我尝试创建一个file.pem,将创建的证书附加到来自令牌的证书中。因此,file.pem已变成如下内容:-开始证书----------结束证书-----开始证书-------END CERTIFICATE——我试图加入同一个BEGIN/END块。在这两种情况下,仅显示令牌证书中的属性。出于某种原因,我对此有点困惑,如果我将两个pem文件合并成一个文件,ASN.1解码器只读取第一个BEGIN END块。这很奇怪。嗨,danni,我做了一些测试,比较了letsencrypt fullchain证书和我的组合新证书+eToken导出证书。这两个是pem编码的文件。在这两种情况下,命令openssl-inform pem-In file.pem-text只输出第一个块BEGIN/END。所以,我认为我的组合PEM是好的。但是,我的主要问题是,为什么或者如何完整地显示这个文件?我试图将这个二进制文件转换为PEM,但没有成功。希望您能给我一个提示。X.509为单个证书定义了ASN.1结构,可以将其编码为DER格式,然后再编码到PEM中。您希望将各个PEM块分开。PEM是base64编码的DER。通过从各个证书中删除开始和结束块,base64解码器将看不到第二个证书,这看起来就像胡说八道)。每个证书都是它自己的ASN.1块。我不确定你那里有什么文件:它是ASN.1,但不是X.509证书。它可能是证书的TBS部分:
openssl x509-in 3JlKVSJ7-notify der-noout
Hi danni。让我们忘记cie.sopagomeia.com.br中的文件。它是由某个公司生成的,而不是我。因此,我已经了解到每个证书必须位于它自己的开始/结束块中。但正如我之前所说,我已经将letsencrypt中的fullchain.pem与我的file.pem进行了比较,其中生成的证书是asn1crypto+pkcs11证书。
# 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)