Как прочитать сертификат со смарт-карты через 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.