2013-03-15 3 views
2

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 в вызове

У кого-нибудь есть представление о том, чего я не хватает?

Благодаря

+0

Это может быть, что вы предоставить пользователям ложное чувство безопасности, когда вы просите новый PIN-код. Смарт-карта уже зарегистрировала вас, и, по-видимому, для транзакций не требуется PIN-код. Поэтому любой, кто имеет доступ к интерфейсу карты, все равно может использовать его для аутентификации на вашем веб-сервере. С некоторой удачей вы можете сказать карточке использовать PIN-код для каждой транзакции или поколения подписи, и .NET, надеюсь, это подберет. –

+0

Имейте такую ​​же проблему, помните, как вы ее решили? – Banshee

+0

Извините, я не решил это действительно. единственный способ, которым я нашел, - закрыть приложение и открыть еще один. – Sebange

ответ

-1

Если вы используете веб-страницу, а не окно формы, может быть, вы можете остановить эту страницу из кэша с помощью заголовков страниц?

что-то вроде

Response.Cache.SetCacheability(HttpCacheability.NoCache) 
+1

Это оконная форма. Я также попытался использовать HttpRequestCacheLevel.NoCacheNoStore в HttpRequestCachePolicy моего запроса, но ничего не изменилось. – Sebange