Где находится цепочка доверия? [python] asn1crypto и pkcs11 Aladdin USB eToken
У меня этот код работает нормально. Я подписываюсь через USB eToken. Но после копирования и вставки вывода PEM этого кода в https://lapo.it/asn1js/ цепочка доверия не отображается. Этот eToken был предоставлен центром сертификации и, таким образом, имеет цепочку доверия подписи. В чем дело?
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
1 ответ
Вы создали и подписали один отдельный сертификат 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)
Этот пример из экспорта сертификатов.
Если у вас есть несколько сертификатов в вашем токене, вы можете включить дополнительные параметры поиска, включая тип сертификата, эмитента и т. Д. Документы содержат дополнительную информацию о параметрах для объектов сертификата. Спецификация PKCS#11 по-прежнему содержит дополнительную информацию.
В качестве альтернативы, если у вас есть сертификат X.509 в другой форме, вы можете просто добавить его. Его не нужно хранить в HSM.