.netでは、SSL上のWebサービスへのWebリクエストを行っています。暗号化には、PINコードで保護されたUSBセキュアカードデバイスからの証明書を使用する必要があります
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)
そしてこれで前に電話を機能させるために..。
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の入力を再度求めるため、またはプログラムに実行するように指示した場合(たとえば、「切断」ボタンや10分後のタイムアウト)、PINキャッシュをクリアしたい。次の呼び出しで再度プロンプトを表示するために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を提供しなかった場合と同じです
誰かが私が欠けているものについての考えを持っていますか?
ありがとう