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中的通話一樣
任何人都對我失蹤的東西有所瞭解?
感謝
這可能是你提供給用戶安全的錯覺,當你問一個新的PIN。智能卡已經登錄你,顯然它不需要密碼進行交易。因此,任何訪問卡界面的人都可以使用它來驗證他/她自己的Web服務。如果運氣好的話,你可以告訴卡片爲每次交易或簽名生成使用PIN碼,並且希望.NET能夠挑選它。 – 2013-03-18 18:58:50
有同樣的問題,你記得你是如何解決它的? – Banshee 2017-04-19 12:55:22
對不起,我沒有真正解決它。我發現的唯一方法是關閉我的應用程序並打開另一個 – Sebange 2017-04-20 14:48:16