我让这段代码工作得很好。我正在用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发布于 2018-05-19 13:47:19
您已经构造并签署了一个单独的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。
如果令牌上有多个证书,则可以包括其他搜索参数,包括证书类型、颁发者等。文档包含有关certificate objects参数的详细信息。PKCS#11规范仍然包含更多信息。
或者,如果您有其他形式的X.509证书,您可以简单地附加它。它不需要存储在HSM中。
https://stackoverflow.com/questions/50416132
复制相似问题