Нет подписи в сообщении WS-Security для настроенного актера / роли мыла ""!(от клиента) - PullRequest
0 голосов
/ 19 октября 2011

Я обязуюсь следующим образом

    //Get certificate in bytes[]
            X509Store store = new X509Store(StoreLocation.CurrentUser);
            store.Open(OpenFlags.ReadWrite);
            localCert = new X509Certificate2(cert.File, "mypassword");
            store.Add(localCert);
            certFriendlyName = localCert.FriendlyName;

            //set binding
            SecurityBindingElement security = new TransportSecurityBindingElement();
            X509SecurityTokenParameters item = new X509SecurityTokenParameters(X509KeyIdentifierClauseType.Any, SecurityTokenInclusionMode.AlwaysToRecipient);
            security.EndpointSupportingTokenParameters.SignedEncrypted.Add(item);
            security.IncludeTimestamp = false;
            security.MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10;
            TextMessageEncodingBindingElement encoding = new TextMessageEncodingBindingElement(MessageVersion.Soap11, Encoding.UTF8);
            HttpsTransportBindingElement transport = new HttpsTransportBindingElement();
            transport.RequireClientCertificate = true;
            System.ServiceModel.Channels.Binding currentBinding = new CustomBinding(security, encoding, transport);
             EndpointIdentity identity = EndpointIdentity.CreateDnsIdentity("mydns");
             EndpointAddress ea = new EndpointAddress(new Uri("MyURI"), identity);


            service.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My , X509FindType.FindBySubjectName, certFriendlyName);
             service.ClientCredentials.ServiceCertificate.SetDefaultCertificate(System.Security.Cryptography.X509Certificates.StoreLocation.CurrentUser,
                                                                                           System.Security.Cryptography.X509Certificates.StoreName.My,
                                                                                           System.Security.Cryptography.X509Certificates.X509FindType.FindBySubjectName,
                                                                                           certFriendlyName);

и ниже - политика безопасности из предоставленного WSDL

<wsp:Policy Name="GAPolicy" wsu:Id="policy.ga" xmlns:wsaws="http://www.w3.org/2005/08/addressing">
    <wsp:ExactlyOne>
        <wsp:All>
            <wsaws:UsingAddressing xmlns:wsaws="http://www.w3.org/2006/05/addressing/wsdl" />
        </wsp:All>
    </wsp:ExactlyOne>
</wsp:Policy>

<wsp:Policy Name="NPPIPolicy" wsu:Id="policy.nppi"
    xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
    <wsp:ExactlyOne>
        <wsp:All>
            <!-- Force the use of WS-Addressing -->
            <wsaws:UsingAddressing xmlns:wsaws="http://www.w3.org/2006/05/addressing/wsdl" />

            <!-- Require a signature on the body of the message -->
            <wsp:SignedParts>
                <wsp:Body />
            </wsp:SignedParts>

            <!-- X.509 Certs in header -->
            <wsp:AsymmetricBinding
                xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
                <wsp:Policy>
                    <sp:InitiatorSignatureToken>
                        <wsp:Policy>
                                <sp:X509Token
                                    sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200512/IncludeToken/AlwaysToRecipient" />
                        </wsp:Policy>
                    </sp:InitiatorSignatureToken>
                    <sp:RecipientToken>
                        <wsp:Policy>
                            <sp:X509Token
                                sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/Never" />
                        </wsp:Policy>
                    </sp:RecipientToken>
                    <!-- Supported encryption algorithms -->
                    <sp:AlgorithmSuite>
                        <wsp:Policy>
                            <wsp:ExactlyOne>
                                <sp:Basic256 />
                                <sp:TripleDes />
                                <sp:TripleDesSha256 />
                                <sp:TripleDesSha256Rsa15 />
                            </wsp:ExactlyOne>
                        </wsp:Policy>
                    </sp:AlgorithmSuite>
                    <!-- Do not impose an order of layout -->
                    <sp:Layout>
                        <wsp:Policy>
                            <sp:Lax />
                        </wsp:Policy>
                    </sp:Layout>
                </wsp:Policy>
            </wsp:AsymmetricBinding>
        </wsp:All>
    </wsp:ExactlyOne>
</wsp:Policy>

<wsp:Policy Name="PCIPolicy" wsu:Id="policy.pci"
    xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
    <wsp:ExactlyOne>
        <wsp:All>
            <!-- Force the use of WS-Addressing -->
            <wsaws:UsingAddressing xmlns:wsaws="http://www.w3.org/2006/05/addressing/wsdl" />

            <!-- Require a signature on the body of the message -->
            <wsp:SignedParts>
                <wsp:Body />
            </wsp:SignedParts>

            <!-- X.509 Certs in header -->
            <wsp:AsymmetricBinding
                xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
                <wsp:Policy>
                    <sp:InitiatorSignatureToken>
                        <wsp:Policy>
                                <sp:X509Token
                                    sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200512/IncludeToken/AlwaysToRecipient" />
                        </wsp:Policy>
                    </sp:InitiatorSignatureToken>
                    <sp:RecipientToken>
                        <wsp:Policy>
                            <sp:X509Token
                                sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/Never" />
                        </wsp:Policy>
                    </sp:RecipientToken>
                    <!-- Supported encryption algorithms -->
                    <sp:AlgorithmSuite>
                        <wsp:Policy>
                            <wsp:ExactlyOne>
                                <sp:Basic256 />
                                <sp:TripleDes />
                                <sp:TripleDesSha256 />
                                <sp:TripleDesSha256Rsa15 />
                            </wsp:ExactlyOne>
                        </wsp:Policy>
                    </sp:AlgorithmSuite>
                    <!-- Do not impose an order of layout -->
                    <sp:Layout>
                        <wsp:Policy>
                            <sp:Lax />
                        </wsp:Policy>
                    </sp:Layout>
                </wsp:Policy>
            </wsp:AsymmetricBinding>
        </wsp:All>
    </wsp:ExactlyOne>
</wsp:Policy>

Используя это, я сталкиваюсь с "System.ServiceModel.FaultException: в сообщении WS-Security нет подписи для настроенного актера / роли мыла" "! (Из клиента)"

1 Ответ

0 голосов
/ 19 октября 2011

Используйте CustomBinding напрямую. Внедряя WsHttpBinding и устанавливая его безопасность для ожидания сертификата клиента, вы настраиваете совершенно другой режим безопасности. Я написал статью об этой проблеме (в результате вопроса о MSDN, который вы уже нашли). Начните с привязки, описанной в статье, или измените ее в соответствии с вашими потребностями. В описываемой привязке используется взаимный HTTPS (сертификат клиента для HTTPS) с поддержкой сертификата в каждом сообщении запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...