2013-03-15 52 views
2

in .net我正在做一個Web服務的SSL請求。對於加密,我不得不使用certicicate由PIN碼清除PIN緩存智能卡

我這樣做Web請求的代碼......

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) 

,並與該保護的USB安全卡設備之前,以撥打電話的工作...

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是從Windows個人存儲證書...

Public gcert As X509Certificate2 

Dim store As New X509Store(StoreName.My, StoreLocation.CurrentUser) 
store.Open(OpenFlags.ReadOnly Or OpenFlags.OpenExistingOnly) 
... 

所有這些工作正常:當我發送我的webRequest時,系統會提示輸入PIN碼,然後收到來自Web服務的響應。 如果我正在打其他電話,我不會再次提示輸入PIN碼,但所有電話都可以正常工作。

但現在我的問題是:我想清除PIN緩存,以便在每次調用時再次提示輸入PIN碼,或者如果我告訴我的程序執行此操作(例如「斷開連接」按鈕或超時1000萬爲例) 後,我能不能成功,爲了要在下一次呼叫提示再次重置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。智能卡已經登錄你,顯然它不需要密碼進行交易。因此,任何訪問卡界面的人都可以使用它來驗證他/她自己的Web服務。如果運氣好的話,你可以告訴卡片爲每次交易或簽名生成使用PIN碼,並且希望.NET能夠挑選它。 – 2013-03-18 18:58:50

+0

有同樣的問題,你記得你是如何解決它的? – Banshee 2017-04-19 12:55:22

+0

對不起,我沒有真正解決它。我發現的唯一方法是關閉我的應用程序並打開另一個 – Sebange 2017-04-20 14:48:16

回答

-1

如果您使用的網頁,而不是一個窗口的形式,也許你可以通過使用頁眉停止從緩存的頁面?

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

這是一個窗體。我也嘗試在我的請求的HttpRequestCachePolicy上使用HttpRequestCacheLevel.NoCacheNoStore,但沒有任何更改。 – Sebange 2013-03-18 07:55:37