2013-03-15 55 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