WCF SOAP 1.1 et WS-Security 1.0, certificat du client transport auth, service cert pour le corps du message la signature, de l'élément usernametoken, hachage de Mot de passe, Nonce
Résumé:
Je suis en train de travailler sur un .NET 4.0 WCF client de consommer un service web (DataPower, Java service à l'autre extrémité) à l'aide de SOAP 1.1 et WS-Security 1.0. La WCF client doit mettre en œuvre un certificat du client pour l'authentification mutuelle au niveau de la couche transport. Le corps du message doit être signé en utilisant un service distinct/certificat de signature. L'en-tête SOAP doit également contenir un nom d'utilisateur Jeton de hachage de Mot de passe et comprennent Nonce et Créé des balises.
Je suis en mesure de consommer ce service web à l'aide de WSE 3.0 avec BasicHTTPBinding. Mais je n'ai pas réussi jusqu'à présent dans la mise en œuvre de la même avec WCF en utilisant soit WSHttpBinding ou CustomBinding. J'ai essayé toutes de la sécurité des éléments de liaison et n'ont pas eu de chance jusqu'à présent.
Je suis aussi à l'aide de l'élément usernametoken de la bibliothèque à partir d'ici (http://blogs.msdn.com/b/aszego/archive/2010/06/24/usernametoken-profile-vs-wcf.aspx) afin que je puisse ajouter un mot de passe digest/nonce/créé dans l'élément usernametoken en-tête SOAP.
Je suis actuellement en utilisant SecurityBindingElement.CreateMutualCertificateBindingElement j'ai aussi essayé plusieurs autres tels que AsymmetricSecurityBindingElement, TransportSecurityBindingElement etc (en commentaire dans le code ci-dessous)
CERTS:
J'ai à la fois le certificat du client et le certificat du service chargé dans le magasin de certificats à l'aide de la console MMC (je suis sur Windows 7 btw.) Le client cert et le service cert ont les clés privées. J'ai chargé à la fois de la forme de fichiers PFX dans LocalMachine/Personnels, LocalMachine/Root et LocalMachine/TrustedPeople. J'ai également exécuter le FindPrivateKey/ICACLS de donner la permission de “Pool d'applications IIS/DefaultAppPool” compte. Bien que rien de tout cela devrait avoir de l'importance puisque je ne peux courir le WSE 3.0 code de ma machine et elle fonctionne sans cert questions.
D'exécution des commandes:
FindPrivateKey.exe My LocalMachine -t "thumbprint of client cert"
FindPrivateKey.exe My LocalMachine -t "thumbprint of service cert"
icacls C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\{privateKeyOfClientCert} /grant "IIS AppPool\DefaultAppPool":R <<Successfully processed 1 files; Failed processing 0 files>>
icacls C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\{privateKeyOfServiceCert} /grant "IIS AppPool\DefaultAppPool":R <<Successfully processed 1 files; Failed processing 0 files>>
WCF QUESTION:
Je reçois actuellement un “n'a pas Pu établir un canal sécurisé SSL/TLS avec autorité "x.x.com'” message de retour de la DataPower de la passerelle. Je me figure ce pourrait être parce que la passerelle est de prendre le service de certificat et de l'aide que pour le client de s'authentifier au lieu d'utiliser le certificat du client je vous envoie. Je dis cela parce que quand je ne précise pas les DNS d'Identité pour le point de terminaison, - je récupérer un message disant que la passerelle sattend à ce que le DNS identité “{nom de l'objet de service/certificat de signature}”.
Ici est le SAVON de demande généré par la WCF qui donne de l'erreur ci-dessus. La WCF requête SOAP est très similaire à la WSE une requête SOAP. L'erreur ci-dessus est probablement produit en raison de la cert question à la SSL/couche de Transport.
WCF requête SOAP:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<s:Header>
<o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<u:Timestamp u:Id="uuid-8533d9a5-865e-4a4b-a750-fadb7c1ce36c-1">
<u:Created>2013-02-06T20:53:04.679Z</u:Created>
<u:Expires>2013-02-06T20:58:04.679Z</u:Expires>
</u:Timestamp>
<o:BinarySecurityToken u:Id="uuid-0bab08ce-3e3b-4360-a44b-694b06a3dd67-2" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3">Removed Service Cert Encoded Value</o:BinarySecurityToken>
<wsse:UsernameToken wsu:Id="7843ab92-f69a-4d00-a5ba-117e32a74f49" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:Username>USER_Removed</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">XXX=</wsse:Password>
<wsse:Nonce>XXX==</wsse:Nonce>
<wsu:Created>2013-02-06T20:53:04Z</wsu:Created>
</wsse:UsernameToken>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></CanonicalizationMethod>
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></SignatureMethod>
<Reference URI="#_1">
<Transforms>
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></Transform>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod>
<DigestValue>XXX=</DigestValue>
</Reference>
<Reference URI="#uuid-8533d9a5-865e-4a4b-a750-fadb7c1ce36c-1">
<Transforms>
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></Transform>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod>
<DigestValue>XXX=</DigestValue>
</Reference>
<Reference URI="#7843ab92-f69a-4d00-a5ba-117e32a74f49">
<Transforms>
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></Transform>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod>
<DigestValue>XXX=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>XXXLongXXX=</SignatureValue>
<KeyInfo>
<o:SecurityTokenReference>
<o:Reference URI="#uuid-0bab08ce-3e3b-4360-a44b-694b06a3dd67-2"></o:Reference>
</o:SecurityTokenReference>
</KeyInfo>
</Signature>
</o:Security>
</s:Header>
<s:Body u:Id="_1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ping xmlns="https://x.x.com/xxx/v1">
<pingRequest xmlns="">hello</pingRequest>
</ping>
</s:Body>
WSE 3.0 requête SOAP (cela fonctionne):
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<soap:Header>
<wsa:Action wsu:Id="Id-4271fb72-464a-467d-ab1f-4d32542e20f0"/>
<wsa:MessageID wsu:Id="Id-11657f64-d856-47d8-b600-d5379fb91a0d">urn:uuid:ff8becb7-74c2-4844-ab46-8ae23f1355a7</wsa:MessageID>
<wsa:ReplyTo wsu:Id="Id-40b2e6e8-e67b-4a6c-a545-071ce0f0107a">
<wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>
</wsa:ReplyTo>
<wsa:To wsu:Id="Id-d5e0b488-6f8a-479c-940d-2b85833dbc66">https://x.x.com/xxx/v1</wsa:To>
<wsse:Security soap:mustUnderstand="1">
<wsu:Timestamp wsu:Id="Timestamp-68476551-5c58-4a47-967b-54ec18257b1b">
<wsu:Created>2013-02-06T19:38:39Z</wsu:Created>
<wsu:Expires>2013-02-06T19:43:39Z</wsu:Expires>
</wsu:Timestamp>
<wsse:UsernameToken wsu:Id="SecurityToken-e5f65166-a825-48cb-a939-8e515a637e01">
<wsse:Username>USER_Removed</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">XXX=</wsse:Password>
<wsse:Nonce>XXX==</wsse:Nonce>
<wsu:Created>2013-02-06T19:38:39Z</wsu:Created>
</wsse:UsernameToken>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<ds:CanonicalizationMethod xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<Reference URI="#Id-4271fb72-464a-467d-ab1f-4d32542e20f0">
<Transforms>
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>XXX=</DigestValue>
</Reference>
<Reference URI="#Id-11657f64-d856-47d8-b600-d5379fb91a0d">
<Transforms>
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>XXX=</DigestValue>
</Reference>
<Reference URI="#Id-40b2e6e8-e67b-4a6c-a545-071ce0f0107a">
<Transforms>
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>XXX=</DigestValue>
</Reference>
<Reference URI="#Id-d5e0b488-6f8a-479c-940d-2b85833dbc66">
<Transforms>
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>XXX=</DigestValue>
</Reference>
<Reference URI="#Timestamp-68476551-5c58-4a47-967b-54ec18257b1b">
<Transforms>
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>XXX=</DigestValue>
</Reference>
<Reference URI="#Id-6f76e50e-932c-4878-bbc0-3ef4c8a36990">
<Transforms>
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>XXX=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>XXXLongXXX=</SignatureValue>
<KeyInfo>
<wsse:SecurityTokenReference>
<wsse:KeyIdentifier ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509SubjectKeyIdentifier"
EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">XXX=</wsse:KeyIdentifier>
</wsse:SecurityTokenReference>
</KeyInfo>
</Signature>
</wsse:Security>
</soap:Header>
<soap:Body wsu:Id="Id-6f76e50e-932c-4878-bbc0-3ef4c8a36990">
<ping xmlns="https://x.x.com/xxx/v1">
<pingRequest xmlns="">hello</pingRequest>
</ping>
</soap:Body>
Ici tout est de la config, s'il vous plaît laissez-moi savoir ce que je fais de mal!
Web WCF.config: j'ai tout enlevé à partir du web.config comme je le fais tous les config dans le code.
WCF config dans le code:
var proxy = GetProxy();
pingResponseMessage resp = proxy.ping("hello");
lblStatus.Text = resp.status.ToString();
private XXXClient GetProxy()
{
System.Net.ServicePointManager.ServerCertificateValidationCallback += (se, cert, chain, sslerror) => { return true; };
XXXClient proxy = new XXXClient(GetCustomBinding(), new EndpointAddress(new Uri("https://xxx"), EndpointIdentity.CreateDnsIdentity("I am forced to put the signing cert subject here, nothing else works"), new AddressHeaderCollection()));
proxy.Endpoint.Behaviors.Remove(typeof(ClientCredentials));
proxy.Endpoint.Behaviors.Add(new UsernameClientCredentials(new UsernameInfo(@"USER_Removed", "X")));
proxy.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByThumbprint, "REMOVED");
proxy.ClientCredentials.ServiceCertificate.SetDefaultCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByThumbprint, "REMOVED");
proxy.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None;
return proxy;
}
private Binding GetCustomBinding()
{
//TransportSecurityBindingElement secBE = SecurityBindingElement.CreateCertificateOverTransportBindingElement(MessageSecurityVersion.WSSecurity10WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10);
//AsymmetricSecurityBindingElement secBE = (AsymmetricSecurityBindingElement)SecurityBindingElement.CreateMutualCertificateBindingElement(MessageSecurityVersion.WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10);
//secBE.InitiatorTokenParameters = new System.ServiceModel.Security.Tokens.X509SecurityTokenParameters { InclusionMode = SecurityTokenInclusionMode.AlwaysToRecipient, RequireDerivedKeys = false, X509ReferenceStyle = X509KeyIdentifierClauseType.SubjectKeyIdentifier };
//secBE.RecipientTokenParameters = new System.ServiceModel.Security.Tokens.X509SecurityTokenParameters { InclusionMode = SecurityTokenInclusionMode.AlwaysToInitiator, RequireDerivedKeys = false, X509ReferenceStyle = X509KeyIdentifierClauseType.SubjectKeyIdentifier };
//secBE.MessageProtectionOrder = System.ServiceModel.Security.MessageProtectionOrder.SignBeforeEncrypt;
//secBE.EndpointSupportingTokenParameters.Signed.Add(new UserNameSecurityTokenParameters() { InclusionMode = SecurityTokenInclusionMode.AlwaysToRecipient, RequireDerivedKeys = false });
//secBE.EndpointSupportingTokenParameters.Signed.Add(new X509SecurityTokenParameters(X509KeyIdentifierClauseType.SubjectKeyIdentifier, SecurityTokenInclusionMode.Never) { InclusionMode = SecurityTokenInclusionMode.Never, RequireDerivedKeys = false, X509ReferenceStyle = X509KeyIdentifierClauseType.SubjectKeyIdentifier });
//secBE.ProtectionTokenParameters = new System.ServiceModel.Security.Tokens.X509SecurityTokenParameters { InclusionMode = SecurityTokenInclusionMode.AlwaysToRecipient };
//secBE.DefaultAlgorithmSuite = new CustomSecurityAlgorithm();
SecurityBindingElement secBE = SecurityBindingElement.CreateMutualCertificateBindingElement(MessageSecurityVersion.WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10);
secBE.MessageSecurityVersion = MessageSecurityVersion.WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10;
secBE.EndpointSupportingTokenParameters.Signed.Add(new UsernameTokenParameters() { InclusionMode= SecurityTokenInclusionMode.AlwaysToRecipient, ReferenceStyle = SecurityTokenReferenceStyle.External, RequireDerivedKeys = false });
secBE.SecurityHeaderLayout = SecurityHeaderLayout.Strict;
//secBE.AllowInsecureTransport = false;
//secBE.AllowSerializedSigningTokenOnReply = false;
secBE.EnableUnsecuredResponse = true;
secBE.IncludeTimestamp = true;
secBE.SetKeyDerivation(false);
TextMessageEncodingBindingElement textEncBE = new TextMessageEncodingBindingElement(MessageVersion.Soap11, System.Text.Encoding.UTF8);
HttpsTransportBindingElement httpsBE = new HttpsTransportBindingElement();
httpsBE.RequireClientCertificate = true;
//httpsBindingElement.AllowCookies = false;
//httpsBindingElement.AuthenticationScheme = System.Net.AuthenticationSchemes.Basic;
httpsBE.BypassProxyOnLocal = false;
httpsBE.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
//httpsBindingElement.KeepAliveEnabled = false;
httpsBE.TransferMode = TransferMode.Buffered;
httpsBE.UseDefaultWebProxy = true;
CustomBinding myBinding = new CustomBinding();
myBinding.Elements.Add(secBE);
myBinding.Elements.Add(textEncBE);
myBinding.Elements.Add(httpsBE);
return myBinding;
}
J'ai ajouté ProtectionLevel.Signe sur l'ServiceContract et OperationContracts depuis que j'ai seulement besoin de signer le corps du message. Je n'ai pas obtenu jusqu'ici pour le vérifier pour le moment.
[System.ServiceModel.ServiceContractAttribute(Namespace = "https://x.x.com/xxx/v1", ConfigurationName = "x.x", ProtectionLevel = System.Net.Security.ProtectionLevel.Sign)]
public interface XXXService {
[System.ServiceModel.OperationContractAttribute(Action = "", ReplyAction = "*", ProtectionLevel = System.Net.Security.ProtectionLevel.Sign)]
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
[return: System.ServiceModel.MessageParameterAttribute(Name="return")]
XXX.pingResponse ping(XXX.ping request);
[System.ServiceModel.ServiceContractAttribute(Namespace = "https://x.x.com/xxx/v1", ProtectionLevel = System.Net.Security.ProtectionLevel.Sign)]
public partial class XXXClient : System.ServiceModel.ClientBase<XXXService> {
[System.ServiceModel.OperationContractAttribute(Action = "", ReplyAction = "*", ProtectionLevel = System.Net.Security.ProtectionLevel.Sign)]
public XXX.pingResponseMessage ping(string pingRequest) {
J'ai ajouté ce qui suit ci-dessous sur le web.config pour permettre la journalisation de l'ensemble du savon notamment des informations d'identification personnelle
(for pii, also added <machineSettings enableLoggingKnownPii="true" /> under <system.serviceModel> to C:\Windows\Microsoft.NET\Framework\vX\CONFIG\machine.config)
<system.serviceModel>
<diagnostics>
<messageLogging logKnownPii="true" logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" maxMessagesToLog="3000"/>
</diagnostics>
</system.serviceModel>
<system.diagnostics>
<sources>
<source name="System.ServiceModel.MessageLogging" logKnownPii="true">
<listeners>
<add initializeData="C:\trace.log" type="System.Diagnostics.XmlWriterTraceListener" name="messages"/>
</listeners>
</source>
</sources>
</system.diagnostics>
===============
WSE 3.0 (Travail config et code):
web.config:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="myBinding" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
<security mode="Transport">
<transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
<message clientCredentialType="UserName" algorithmSuite="Default"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://x.x.com/xxx/v1" binding="basicHttpBinding" bindingConfiguration="myBinding" contract="XXXService" name="XXX"/>
</client>
</system.serviceModel>
<appSettings>
<add key="XXXImplService" value="https://x.x.com/xxx/v1"/>
</appSettings>
... et WSE3 code:
var proxy = new XXXImplServiceWse();
UsernameToken usernameToken = new UsernameToken(@"USER_Removed", "X");
proxy.RequestSoapContext.Security.Tokens.Add(usernameToken);
X509Certificate2 mutualCert = LoadCertFromStore(StoreLocation.LocalMachine, StoreName.My, "Client Cert Subject Name");
proxy.ClientCertificates.Add(mutualCert);
X509Certificate2 signCert = LoadCertFromStore(StoreLocation.LocalMachine, StoreName.My, "Service Cert Subject Name");
X509SecurityToken signatureToken = new X509SecurityToken(signCert);
MessageSignature signature = new MessageSignature(signatureToken); //<!-- IS THIS SAME AS THIS STEP IN WCF: secBE.EndpointSupportingTokenParameters.Signed.Add(new UsernameTokenParameters()) -->
proxy.RequestSoapContext.Security.Elements.Add(signature);
==========
Alors, comment puis-je convertir ci-dessus WSE 3.0 code de la WCF?
Nous avons un client qui insiste pour nous fournir avec la WCF version depuis qu'ils disent WSE 3.0 est la "vieille technologie"... je ne pense pas que de questions, mais assurez-vous juste de conformité, nous allons en rester Soap11WSAddressing10
Je vais regarder ce problème pendant le week-end - je suis intéressé moi-même, mais être préparé qu'il y a peut être pas de solution pour la WCF (à l'exception de l'écriture manuelle de la sécurité) - WCF n'inclut pas toutes les options déjà disponibles dans WSE 3.0. Par curiosité: avez-vous des WS-SecurityPolicy (généralement partie de WSDL ou Java le déploiement de services) ou de l'échantillon de demande et de réponse pour le service (et non ceux générés par WSE mais client Java)?
Je suis passé par le WSDL et il ne spécifie pas les paramètres de sécurité. Depuis que je me connecte DataPower (viens de trouver, c'est IBM DataPower xi50 v3.8.1) - voici ce que l'on attend de vue de la sécurité: La porte s'attend au moins: • Un Certificat Client SSL • signé corps • wsse nom d'utilisateur et le Mot de passe en-têtes • Un nonce • Un timestamp
1. La passerelle s'attend à un client SSL cert à la couche de transport. Cert seulement est utilisée pour authentifier le client d'abord. 2. Il va alors vérifier si le corps de message est signé par le SAVON signature cert à la couche de message. 3. Il faudra ensuite vérifier le nom d'utilisateur jeton. 4. La passerelle, puis vérifier que le SAVON opération en cours est un permis d'opération pour le client authentifié. 5. Si tout ceci est vrai, il va mettre la route à l'extrémité arrière et envoyer la demande via les serveurs d'application.
OriginalL'auteur Jawad | 2013-02-06
Vous devez vous connecter pour publier un commentaire.
J'ai pu résoudre mon problème et de vous connecter à DataPower (IBM Xi50) du Service Web de la Passerelle à l'aide de la suite de la WCF CustomBinding (CertificateOverTransport) et CustomCredentials (élément usernametoken avec hachage de Mot de passe, le client cert pour le transport d'authentification et de service cert pour le corps du message la signature.) Je ne suis pas sûr de ce que exactement résolu le problème, mais c'est mon travail WCF code! J'espère que cela aide d'autres personnes qui sont dans une situation similaire à celle que j'étais.
Veuillez vérifier que le DataPower Xi50 passerelle est également configuré pour WCF. À partir d'IBM: "Lors de l'utilisation de BasicHttpBinding avec SSL: Vous pouvez utiliser désactiver ssl chiffrement-vérifier le paramètre pour désactiver le chiffrement vérifie pour tout TransportBinding affirmations. La Base en-Tête d'Authentification n'est pas pris en charge par défaut dans les services Web proxy. Une configuration personnalisée d'une erreur de règle pour injecter de l'-tête WWW-Authenticate est nécessaire pour inter-op avec WCF." Pour plus de détails, rendez-vous ici: https://publib.boulder.ibm.com/infocenter/ieduasst/v1r1m0/index.jsp?topic=/com.ibm.iea.wdatapower/wdatapower/1.0/xa35/380DataPowerWCFIntegration/player.html.
Assurez-vous que vous avez défini ProtectionLevel.Signer votre contrat de service, si vous voulez que votre corps du message signé (et non Chiffrées.)
Pour le DNS de l'Identité, que j'ai eu des problèmes avec la version antérieure, j'étais maintenant en mesure de mettre mon certificat du client nom de l'objet précédent, ceci ne fonctionnerait pas.
Je n'ai pas de configuration dans mon web.config.
Voici les Proxy à l'aide de CustomBinding:
Voici mon CustomCredentials classe que j'ai mis en place à partir de plusieurs sources, y compris mentionné ci-dessus l'élément usernametoken bibliothèque - jeux de certificat du client pour l' (mutuelle?) l'authentification au niveau de la couche transport, de service/certificat de signature pour signer le corps du message et de l'élément usernametoken avec hachage de Mot de passe dans l'en-tête SOAP:
Bonne chance!
OriginalL'auteur Jawad
Je suis allé par le biais de votre code et il semble correct. Il y a une petite différence dans WSE et WCF message soap, mais la différence est seulement dans la façon dont le certificat utilisé pour signer le message est référencé.
Je pense que le problème principal ici est faux l'utilisation de certificats. Vous utilisez à la fois le transport et le message de sécurité mutuelle. En théorie, cela nécessite quatre certificats. Vous avez besoin
Il semble que vous n'avez que deux certificats - un client et un serveur. Dans ce cas, ils devraient probablement être utilisé pour le transport et le message de sécurité. Mais voilà la question intéressante - votre "signature" certificat côté client dans WSE exemple est en fait le certificat du service. Si c'est vraiment le cas, cela signifie que le client doit avoir accès à un serveur de clé privée - qui ne devrait jamais arriver. Ce qui est la pire violation de l'infrastructure à clé publique. Infrastructure à clé publique est basé sur la confiance pour les autorités de certification et sur la sécurisation des clés privées où chaque participant a sa propre clé privée n'est pas accessible par n'importe qui d'autre. Le partage de clés privées réduit la sécurité. Dans le pire des cas il peut être égal à aucune sécurité n'est parce que toute personne ayant accès à la clé privée peut intercepter la communication ou de la fausse signature sur le message.
Si je suis de droite, vous devez utiliser WSE 3.0 et d'être heureux avec cela. Forcer la WCF à utiliser différents certificat du client pour HTTPS et le message de sécurité peut être assez difficile. Vous avez unique
ClientCertificate
de la propriété, mais vous avez besoin de charger le certificat HTTPS et le message de sécurité. Il nécessite la création d'un customClientCredentials
avec deux propriétés et de la coutumeSecurityTokenManager
de retour correct de fournisseur de certificat (par la mise en œuvre pour chaque type d'utilisation (c'est une théorie que je ne l'ai jamais essayé).Btw. votre problème avec
EndpointIdentity
est basée sur le fait que votre service est exposée sur certains DNS et si l'objet du certificat de service (qui est dans votre cas également de la signature de certificat) est différente, vous devez créer un nouveau DNS identité pour votre point de terminaison. Sinon, WCF va pas confiance à ce certificat. Serveur de certificat devrait être délivré avec l'objet correspondant nom DNS utilisé pour accéder au serveur.IBM: publib.boulder.ibm.com/infocenter/ieduasst/v1r1m0/... Lors de l'utilisation de BasicHttpBinding avec SSL: Vous pouvez utiliser désactiver ssl chiffrement-vérifier le paramètre pour désactiver le chiffrement vérifie pour tout TransportBinding affirmations. La Base en-Tête d'Authentification n'est pas pris en charge par défaut dans les services Web proxy. Une configuration personnalisée d'une erreur de règle pour injecter de l'-tête WWW-Authenticate est nécessaire pour inter-op avec WCF.
OriginalL'auteur Ladislav Mrnka