Как прочитать сертификат со смарт-карты через python?

У меня есть смарт-карта (на самом деле USB-токен) с сертификатом и ключами. Теперь мне нужно получить этот сертификат с помощью Python на Windows. Как это может быть достигнуто?

Я посмотрел на pyscard пакет, но это кажется слишком низким уровнем и, вероятно, не самый простой способ сделать это. Но если вы знаете этот низкоуровневый ответ, то ваша помощь будет принята с благодарностью.
Похоже на CryptAcquireContext Функция из pywin32 (win32crypt) позволяет мне использовать закрытый ключ со смарт-карты в целях шифрования, но я не могу получить сам сертификат.

У вас есть какие-нибудь предложения?

0 ответов

Хотя сам нашел ответ. Надеюсь, это кому-то поможет:
обычно производители смарт-карт предоставляют библиотеку (.so или .dll) реализация стандарта PKCS#11.
Есть несколько решений, которые вы можете использовать для связи со своей смарт-картой через эту библиотеку. Например: pkcs11-tool (интерфейс CLI), PyKCS11 (оболочка python).

Вот пример того, как этого можно добиться с помощью PyKCS11:

from asn1crypto import x509
from PyKCS11 import *

pkcs11 = PyKCS11Lib()
pkcs11.load('<MANUFACTURER_LIBRARY_PATH>')
# get slot value via pkcs11.getSlotList(tokenPresent=False). Usually it's 0
session = pkcs11.openSession(slot, CKF_SERIAL_SESSION | CKF_RW_SESSION)
session.login('<SMART_CARD_PIN_CODE>')
result = []
certs = session.findObjects([(CKA_CLASS, CKO_CERTIFICATE)])
for cert in certs:
    cka_value, cka_id = session.getAttributeValue(cert, [CKA_VALUE, CKA_ID])
    cert_der = bytes(cka_value)
    cert = x509.Certificate.load(cert_der)
    result.append(cert)
print(result)

Таким образом я смог перечислить сертификаты на смарт-карте как в Linux, так и в Windows.

Другие вопросы по тегам