in .net Я делаю веб-запросы к веб-сервису на ssl. Для криптографии я должен использовать certicicate с устройства USB безопасной карты, защищенной PIN-кодомClear PIN Cache smartcard
Мой код делает веб-запрос ...
Dim lRequest As HttpWebRequest
lRequest = WebRequest.Create(lAddress)
lRequest.Method = "POST"
lRequest.KeepAlive = True
lRequest.ProtocolVersion = HttpVersion.Version11
lRequest.ContentType = "text/xml; charset=utf-8"
lRequest.ContentLength = lRequestContent.Length
lRequest.Headers.Add("SOAPAction", "")
lRequest.ClientCertificates.Add(gcert)
и с этим, прежде чем для того, чтобы сделать работу вызов ...
ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf ValidateServerCertificate)
Public Function ValidateServerCertificate(ByVal sender As Object, ByVal certificate As X509Certificate, ByVal chain As X509Chain, ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
Return True
End Function
и где gcert является сертификат из окна личного магазина ...
Public gcert As X509Certificate2
Dim store As New X509Store(StoreName.My, StoreLocation.CurrentUser)
store.Open(OpenFlags.ReadOnly Or OpenFlags.OpenExistingOnly)
...
Все это прекрасно работает: когда я отправляю свой webRequest, мне предлагается PIN-код, а затем я получаю ответ от веб-службы. И если я выполняю другие вызовы, я не буду снова запрашивать PIN-код, но все звонки работают отлично.
Но теперь моя проблема: Я хочу очистить кэш PIN-кода, чтобы снова запрашивать PIN-код при каждом вызове, или если я скажу, что моя программа делает это (например, кнопка «отключить» или Тайм-аут после 10mn, например) я не удается сбросить PIN-код для того, чтобы быть предложено снова при следующем вызове ...
после некоторого я попробовал исследовательский это:
<DllImport("schannel.dll", SetLastError:=True)> _
Private Function SslEmptyCache(ByVal pszTargetName As IntPtr, ByVal dwFlags As UInt32) As Boolean
End Function
Public Function SslEmptyCache() As Boolean
WriteTrace("> SslEmptyCache")
Try
Return SslEmptyCache(IntPtr.Zero, 0)
Catch ex As Exception
WriteTrace("Echec SslEmptyCache")
End Try
Return False
End Function
и это
ClearPINCache(gcert.PrivateKey)
Public Function ClearPINCache(ByVal key As RSACryptoServiceProvider) As Boolean
Const PP_KEYEXCHANGE_PIN As UInt32 = 32
Const PP_SIGNATURE_PIN As UInt32 = 33
Dim bretval As Boolean = False
Dim hProv As IntPtr = IntPtr.Zero
If (CryptAcquireContext(hProv, key.CspKeyContainerInfo.KeyContainerName, key.CspKeyContainerInfo.ProviderName, CUInt(key.CspKeyContainerInfo.ProviderType), 0)) Then
If ((CryptSetProvParam(hProv, PP_KEYEXCHANGE_PIN, Nothing, 0) = True) And (CryptSetProvParam(hProv, PP_SIGNATURE_PIN, Nothing, 0) = True)) Then
bretval = True
End If
End If
If (hProv <> IntPtr.Zero) Then
CryptReleaseContext(hProv, 0)
hProv = IntPtr.Zero
End If
Return bretval
End Function
Функция clearPINCahe не кажется, делает ничего
Функция SslEmptyCache очищает что-то, но после очередного звонка я не запрашивается снова для PIN-кода, но я получаю эту ошибку «Запрос была прекращена: не удалось создать SSL/TLS безопасный канал ". так же, как если бы я не предоставил clientCertificate в вызове
У кого-нибудь есть представление о том, чего я не хватает?
Благодаря
Это может быть, что вы предоставить пользователям ложное чувство безопасности, когда вы просите новый PIN-код. Смарт-карта уже зарегистрировала вас, и, по-видимому, для транзакций не требуется PIN-код. Поэтому любой, кто имеет доступ к интерфейсу карты, все равно может использовать его для аутентификации на вашем веб-сервере. С некоторой удачей вы можете сказать карточке использовать PIN-код для каждой транзакции или поколения подписи, и .NET, надеюсь, это подберет. –
Имейте такую же проблему, помните, как вы ее решили? – Banshee
Извините, я не решил это действительно. единственный способ, которым я нашел, - закрыть приложение и открыть еще один. – Sebange