Есть ли в компонентах Indy какие-либо функциональные возможности для проверки учетных данных смарт-карты (CAC)? Я предполагаю, что это должно использоваться в сочетании с InitializeSecurityContext
,
Я использую его в Сиэтле C ++ Builder, но даже примеры Delphi приветствуются.
Вот что я понял до сих пор:
CertOpenSystemStore
) и позвольтеCryptUIDlgSelectCertificateFromStore
).AcquireCredentialsHandle
).TIdTCPClient
а также TIdSSLIOHandlerSocketOpenSSL
используя безопасный порт 443.InitializeSecurityContext
который возвращается SEC_I_CONTINUE_NEEDED.После этого я не уверен, что следует отправлять на сервер и что ожидать взамен. Также в какой момент система должна запросить у пользователя PIN-код?
Спасибо
Когда вы получаете SEC_I_CONTINUE_NEEDED
вы должны передать данные выходного токена на сервер, дождаться ответного токена и затем передать его обратно InitializeSecurityContext()
, Теперь то, как вы на самом деле передаете данные назад и вперед, зависит от конкретного протокола, который вы используете для связи с сервером.
Например, в TIdHTTP
Инди имеет TIdSSPINTLMAuthentication
класс для обработки аутентификации NTLM с использованием того же API, который вы используете. Он инициализирует пакет безопасности NTML, а затем использует InitializeSecurityContext()
для получения буфера байтов, содержащего данные токена NTLM, который затем кодируется в base64 и помещается в HTTP Authorization: NTML ...
заголовок запроса. Когда ответ возвращается, если у него есть HTTP WWW-Authenticate: NTLM ...
заголовок, предлагающий данные маркера ответа, данные декодируются в base64, и полученные байты возвращаются обратно в InitializeSecurityContext()
,
Итак, вам нужно выяснить, какой протокол связи вы используете для связи с вашим сервером, и как этот протокол ожидает, что вы будете передавать байты токена туда и обратно. Это выходит за рамки возможностей Инди. Он предоставляет вам средства для передачи и получения байтов, но вы должны предоставить и прочитать их по мере необходимости.
Других решений пока нет …