Где находится цепочка доверия?[python] asn1crypto и pkcs11 Aladdin USB eToken - PullRequest
0 голосов
/ 18 мая 2018

У меня этот код работает нормально.Я подписываюсь через 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 Ответ

0 голосов
/ 19 мая 2018

Вы создали и подписали один отдельный сертификат 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.

...