SSL-соединение Delphi с использованием сертификата на смарт-карте

#delphi #ssl #smartcard #pki #pkcs#11

#delphi #ssl #смарт-карта #pki #pkcs #11

Вопрос:

Я пытаюсь получить доступ к определенному API, и мне была предоставлена смарт-карта, содержащая сертификат, который я должен использовать для установления SSL-соединения с указанным API. Я пытаюсь сделать это с помощью приложения Delphi.

Ниже приведена информация о сертификате:

Сертификат, используемый для установления безопасного соединения, хранится на смарт-карте, и к нему можно получить доступ из апплета PKI с помощью API PKSC # 11. Сертификат загружается в структуру слотов / токенов в апплете PKI. После извлечения сертификата из смарт-карты (в формате DER) его можно использовать в качестве стандартного сертификата X.509 для протоколов TLS / SSL и HTTPS.

Я могу извлечь сертификат (через инструмент pkcs11CertificateStorage из SecureBlackbox), но у меня возникают проблемы с его использованием для SSL-соединения с Delphi.

Вот упрощенная версия того, что я делаю, чтобы прикрепить сертификат к запросу (с использованием компонента ipWorks REST):

 var
CertStorage: TsbxCertificateStorage;
ipwREST1: TipwREST;
// ...
CertStorage.Open('pkcs11://user:'   Pin   '@/'   StorageFilename   '?slot=0'  RO);
ipwREST1.SSLCertEncodedB := CertStorage.Certificates[0].Bytes;
ipwREST1.Get('https://...');
 

Ошибка, которую я получаю от компонента REST:

273: Не удалось получить учетные данные безопасности: ошибка 0x8009030E

Что привело меня к объяснению ошибки разработчиком компонента:

При использовании сертификата для проверки подлинности клиента убедитесь, что закрытые ключи сертификата доступны. Сертификат в хранилище сертификатов Windows должен содержать соответствующие закрытые ключи и быть помечен как экспортируемый.

и я не уверен, как это интерпретировать.

Я пытался сохранить сертификат в файле, используя OpenSSL для преобразования в PEM и прикрепляя его другими способами, но безуспешно. Я чувствую, что мне чего-то не хватает в моем подходе. Любая помощь будет оценена, спасибо.

Комментарии:

1. Выполните пошаговый подход: если вы можете сохранить его в файле DER, может ли OpenSSL затем интерпретировать его, т.Е. openssl x509 -inform der -in CERTIFICATE.der -text -noout ? Посмотрите формат PEM и DER и определите, в какой момент происходит сбой. И: может существовать более одного слота для карт. Ваш пример кода бессмыслен без объявлений типов / переменных.

2. @AmigoJack спасибо. Вы правы насчет типов переменных, я это сейчас отредактировал. OpenSSL может интерпретировать его с помощью предоставленной вами команды, и я уже пытался преобразовать его в PEM, Включая всю цепочку сертификатов и т. Д., Но безрезультатно. Прямо сейчас все, на что я смотрел, указывает на что-то с закрытым ключом сертификата, но именно здесь мне не хватает знаний об этом, и я не могу найти много информации об этом в другом месте в Интернете.