3

.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を提供しなかった場合と同じです

誰かが私が欠けているものについての考えを持っていますか?

ありがとう

4

1 に答える 1

-1

WindowsフォームではなくWebページを使用している場合は、ページヘッダーを使用してページのキャッシュを停止できますか?

何かのようなもの

Response.Cache.SetCacheability(HttpCacheability.NoCache)
于 2013-03-16T13:54:27.157 に答える