2

WCF クライアント サービス コールに署名して暗号化するにはどうすればよいですか (仕様から: すべてのメッセージは、WS-Security X.509 トークン プロファイルに対応して署名および暗号化されます。仕様は、こちらで確認できます)。

SOAP 1.1 と WS-Security を使用する必要があります。このサービスはサード パーティによって提供されており、サード パーティが Java (IBM DataPower) を使用して記述したものであると確信しています (とにかく WCf ではありません)。

私は次のことを試しましたが、私が読んだことのほとんどは、クライアントが暗号化されているものを決定せず、これはサービス保護レベル (SignAndEncrypt) によって定義されていると述べているため、間違った質問をする場合だと思います。暗号化に使用する必要がある X509SecurityToken への参照も見ましたが、これは古い .net だと思います。

とにかく、これは私がこれまでに持っているものです:

' Create the binding.
Dim myBinding As New BasicHttpBinding() ' FOR SOAP 1.1
myBinding.Security.Mode = BasicHttpSecurityMode.TransportWithMessageCredential
myBinding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate
myBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate

' Create the endpoint address. 
Dim ea As New EndpointAddress("https://removed")

' Create the client. 
Dim starClientProxy As New wcfStarServiceProxy.starTransportPortTypesClient(myBinding, ea)

' Specify a certificate to use for authenticating the client.
starClientProxy.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, "removed")

'Cert used for encryption
starClientProxy.ClientCredentials.ServiceCertificate.SetDefaultCertificate(StoreLocation.CurrentUser, StoreName.AddressBook, X509FindType.FindBySubjectName, "removed")

だから今、それは自動的に暗号化する必要がありますか? 設定する必要があるものが見つかりません

'call the service    
Dim response As wcfStarServiceProxy.AcknowledgeRepairOrderPayload = starClientProxy.ProcessMessage(payload)

したがって、リクエストの署名には成功したと思いますが、本文は暗号化されていません。本文を暗号化するにはどうすればよいですか?

4

2 に答える 2

1

証明書とユーザー名とパスワードの 2 つのレベルのセキュリティを実装するカスタム バインディングを作成しました。私はこのようにしました(コードの抜粋):

        CustomBinding customBinding = new CustomBinding();
        // ...
        HttpsTransportBindingElement httpsBindingElement = new HttpsTransportBindingElement();
        httpsBindingElement.AllowCookies = false;
        httpsBindingElement.BypassProxyOnLocal = false;
        httpsBindingElement.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
        httpsBindingElement.MaxBufferPoolSize = 20480000;
        httpsBindingElement.MaxBufferSize = 20480000;
        httpsBindingElement.MaxReceivedMessageSize = 20480000;
        httpsBindingElement.RequireClientCertificate = true;
        httpsBindingElement.UseDefaultWebProxy = true;
        TransportSecurityBindingElement transportSecurityElement = new TransportSecurityBindingElement();
        transportSecurityElement.EndpointSupportingTokenParameters.SignedEncrypted.Add(new UserNameSecurityTokenParameters());
        transportSecurityElement.EndpointSupportingTokenParameters.SetKeyDerivation(false);
        // ...
        customBinding.Elements.Add(transportSecurityElement);
        customBinding.Elements.Add(httpsBindingElement);

このようにして、メッセージはユーザー名とパスワードを使用してクライアントによって署名および暗号化されますが、この例を変更して、必要なことを達成することができます。

于 2012-05-31T12:21:10.430 に答える
1

@Dejanは私に答えを導きました:

Private Function GetCustomBinding2() As Channels.Binding

    Dim httpsBindingElement As New HttpsTransportBindingElement()
    httpsBindingElement.AllowCookies = False
    httpsBindingElement.BypassProxyOnLocal = False
    httpsBindingElement.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard
    httpsBindingElement.MaxBufferPoolSize = 524288
    httpsBindingElement.MaxBufferSize = 65536
    httpsBindingElement.MaxReceivedMessageSize = 65536
    httpsBindingElement.RequireClientCertificate = True
    httpsBindingElement.UseDefaultWebProxy = True



    Dim asbe As New Channels.AsymmetricSecurityBindingElement
    asbe.MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11
    asbe.InitiatorTokenParameters = New ServiceModel.Security.Tokens.X509SecurityTokenParameters
    asbe.RecipientTokenParameters = New ServiceModel.Security.Tokens.X509SecurityTokenParameters
    asbe.SecurityHeaderLayout = SecurityHeaderLayout.Strict
    asbe.DefaultAlgorithmSuite = Security.SecurityAlgorithmSuite.Basic128Sha256
    asbe.IncludeTimestamp = True
    asbe.SetKeyDerivation(False)
    'asbe.OnlySignEntireHeadersAndBody = True

    'asbe.EndpointSupportingTokenParameters.SignedEncrypted.Add(New ServiceModel.Security.Tokens.X509SecurityTokenParameters)
    'asbe.EndpointSupportingTokenParameters.SetKeyDerivation(False)

    Dim myBinding As New CustomBinding

    myBinding.Elements.Add(asbe)

    myBinding.Elements.Add(New TextMessageEncodingBindingElement(MessageVersion.Soap11, System.Text.Encoding.UTF8))
    'myBinding3.Elements.Add(New HttpsTransportBindingElement())
    myBinding.Elements.Add(httpsBindingElement)



    Return myBinding
End Function
于 2012-05-31T15:07:59.560 に答える