Проверка подлинности сайта с использованием сертификата смарт-карты и открытого ключа c - PullRequest
0 голосов
/ 17 февраля 2020

Итак, у меня есть кредитная карта, похожая на смарт-карту с чипом. Эта карта регистрируется на веб-сайте после того, как карта вставлена ​​в устройство чтения карт.

Теперь мне нужно написать программу на python, которая может считывать карту и выполнять вход на этом веб-сайте. После исследования inte rnet я обнаружил, что мне нужно извлечь:

  1. Сертификат и
  2. Publi c ключ (так как закрытый ключ не может быть извлечен)

с карты и затем используйте эти две вещи для создания HTTP-соединения (пример здесь ). До сих пор я могу извлечь сертификат в формате pem. Но я не могу найти способ извлечь ключ в формате pem до сих пор. Я использовал PyKCS11, чтобы прочитать карту. Ниже мой код:

from asn1crypto import pem, x509
from PyKCS11 import *
import binascii

pkcs11 = PyKCS11Lib()
pkcs11.load(r'C:\Windows\System32\XXXX.dll')
print(pkcs11.getSlotList(tokenPresent=False))

slot = pkcs11.getSlotList(tokenPresent=False)[0]
print(pkcs11.getTokenInfo(slot))

session = pkcs11.openSession(0, CKF_SERIAL_SESSION | CKF_RW_SESSION)
session.login('123456')
result = []
result_pem = []



# find public key and print modulus
pubKey = session.findObjects([(CKA_CLASS, CKO_PUBLIC_KEY)])[0]
modulus = session.getAttributeValue(pubKey, [CKA_MODULUS])[0]
print("\nmodulus: {}".format(binascii.hexlify(bytearray(modulus))))

#find certificates
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)
    # Write out a PEM encoded value
    cert_pem = pem.armor('CERTIFICATE', cert_der)
    result.append(cert)
    result_pem.append(cert_pem)
    with open('cert.pem','wb') as f:
         f.write(cert_pem)
print(result)

Итак, вот мои вопросы: 1. Правильный ли мой подход?

Если да, то как извлечь ключ publi c в формате pem?

Как эта аутентификация с помощью смарт-карты действительно работает на стороне клиента и на стороне сервера?

1 Ответ

1 голос
/ 18 февраля 2020

Publi c извлечение ключа

Если вы уже экспортировали сертификат, вероятно, будет проще извлечь ключ publi c оттуда, а не из смарт-карты. Для этого вы можете использовать openssl:

openssl x509 -in cert.pem -pubkey -out pubkey.pem -noout

Аутентификация

То, чего вы пытаетесь добиться, - это открыть соединение TLS с взаимной аутентификацией с помощью клиента сертификат . Если вы сделаете это, закрытый ключ вашего клиентского сертификата подписывает части рукопожатия для аутентификации на сервере.

Извлечение сертификата и ключа publi c из смарт-карты вам здесь не поможет. Вам нужно найти библиотеку, которая позволит вам использовать свой закрытый ключ прямо с токена PKCS # 11.

...