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