Signature des messages SOAP à l'aide de X. 509 certificat de service WCF webservice Java

C'est ma première question sur le web. Espérons qu'il va donner un sens.

J'ai vu plusieurs blogs à ce sujet sur le Web, et j'en ai essayé quelques unes des idées présentées en eux, sans succès. Voici ma situation:

J'ai une Application web d'appeler un service web WCF qui ensuite appeler un service web Java. Ils sont tous sur des serveurs différents. L'appel entre le service web WCF pour le service web java n'est pas sur le protocole https comme le certificat sera suffisant pour identifier l'appelant (Message de sécurité donc).

  • Service web Java (la boîte noire)

Le service web Java nécessite à reçu un message signé et fonctionne comme ci-dessous:

Avant chaque demande est traitée par un gestionnaire intercepte tous les messages entrants et effectue suivant les règles de validation:

1. Le message contient un en-tête de sécurité

2. Le message contient le bon en-tête de sécurité ID

3. Est le message qui a été signé correctement

4. Le message contient un KeyInfo x.509 certificat

5. Est le certificat émis par une autorité de certification de confiance – configuration de base

6. Est le certificat valide (pas expiré, révoqué)

7. Le certificat contient la bonne politique OID

Une fois que toutes ces étapes ont été confirmés ensuite, le message peut être traité, si l'une des étapes échoue, un message soap exception sera retourné.

Le SAVON de sécurité l'en-tête doit valider contre xxx...w3.org/TR/SOAP-dsig/signature numérique spécification.

La description la plus complète peut être trouvée ici xxx...ibm.com/developerworks/webservices/library/ws-security.html cette IBM article répertorie les détails de chaque WS-Security-tête, en outre, un échantillon signé SAVON message a été fourni.

Lors de la signature du message SOAP, vous devez également ajouter qu'ils x.509 certificat dans le message KeyInfo cela est nécessaire pour la validation du certificat.

Requête SOAP voudrais ceci:

<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<ds:Signature xmlns:ds="xxx...w3.org/2000/09/xmldsig#" Id="Signature001">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="xxx...w3.org/TR/2001/REC-xml-c14n-20010315"/>
<ds:SignatureMethod Algorithm="xxx...w3.org/2000/09/xmldsig#rsa-sha1"/>
<ds:Reference URI="">
<ds:Transforms>
<ds:Transform Algorithm="xxx...w3.org/2000/09/xmldsig#enveloped-signature"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="xxx...w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>soe1PnaGXVGrsauC61JSHD+uqGw=</ds:DigestValue>
</ds:Reference>
<ds:Reference URI="#KeyInfo001">
<ds:DigestMethod Algorithm="xxx...w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>Y9SRPQ9TcDu+GazO3LFwodEdhaA=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>jBX/8XkY2aCte7qgXEp1sbNWmQcK/90iVL58sAvwYAEcBABGzOk2agxR0HvWrNa6ixkocAQ205lggwOxnxZJvoVozVYAAjcLtayPBOUYrnSEBFrwKWP/vxgvUDRIdXeIuw5GLY87NrTQMm1Ehf/HvMX9hTBJn4Nm8RdDiUmPcIo=</ds:SignatureValue>
<ds:KeyInfo Id="KeyInfo001">
<ds:X509Data>
<ds:X509Certificate>MIIEbZCCA1WgAwIBAgIES1XpMjANBgkqhkiG9w0BAQUFADBYMRUwEwYKCZImiZPyLGQBGRYFbG9jYWwxFzAVBgoJkiaJk/IsZAEZFgdlbnRydXN0MRIwEAYDVQQDEwllbnRydXN0U00xEjAQBgNVBAMTCWVudHJ1c3RDQTAeFw0xMDA0MjIxMDQ4MDBaFw0xMzA0MjIxMTE4MDBaMGoxFTATBgoJkiaJk/IsZAEZFgVsb2NhbDEXMBUGCgmSJomT8ixkARkWB2VudHJ1c3QxEjAQBgNVBAMTCWVudHJ1c3RTTTESMBAGA1UEAxMJZW50cnVzdENBMRAwDgYDVQQDEwdSYnMgUmJzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMf88L2JjLPG1hNmTA/KBiC53WVwS2WU9Jh3lC1Rob6RMzOojomZ/dNrvSRB6nzWeXJpZXwik4XFrsAq24By2SZpLTO4p8Vcq71mTAfDu33cnO49Au2pwNvcMn5qIKBk1Xx+oVb4fzK9ncTRu7bW46HsIYth+qkGhbI2JEHwr/zwIDAQABo4IBrzCCAaswCwYDVR0PBAQDAgeAMCsGA1UdEAQkMCKADzIwMTAwNDIyMTA0ODAwWoEPMjAxMjA1MjgxNTE4MDBaMCMGA1UdIAQcMBowCwYJYIZIAYb6awoEMAsGCSqGSIb2fQdLAzAbBgNVHQkEFDASMBAGCSqGSIb2fQdEHTEDAgEBMIHGBgNVHR8Egb4wgbswb6BtoGukaTBnMRUwEwYKCZImiZPyLGQBGRYFbG9jYWwxFzAVBgoJkiaJk/IsZAEZFgdlbnRydXN0MRIwEAYDVQQDEwllbnRydXN0U00xEjAQBgNVBAMTCWVudHJ1c3RDQTENMAsGA1UEAxMEQ1JMMTBIoEagRIZCZmlsZTovLy8vTVNJREhVLTQ0NUE0RkVFL0NSTC9lbnRydXN0Y2FfZW50cnVzdHNtX2xvY2FsX2NybGZpbGUuY3JsMB8GA1UdIwQYMBaAFBvSL6cPz8L5shubV58yf0pczKzuMB0GA1UdDgQWBBT1/j6OSS8FTjwqluvew16sv7h+VzAJBgNVHRMEAjAAMBkGCSqGSIb2fQdBAAQMMAobBFY4LjADAgSwMA0GCSqGSIb3DQEBBQUAA4IBAQBXxRIA4HUvGSw4L+4uaR51pY4ISjUQWo2Fh7FYBMt29NsKCTdur1OWVVdndt1yjXP4yWXxoAhHtvZL+XNALUFlR2HAWiXuL1nRcxHkB98N5gPqQzW/lJk9cLtL4hVp28EiEpgmKT3I3NP2Pdb2G5MMOdvQ/GFb2y6OwblR8ViPQ8B2aHWzXMrH+0qadPAuBhXyAohwb+mMuYT/ms6xpGi1NMYuYMf6XONz9GkZgnGnMwa+9CCQws1HNz8WYHtmFIxLsVuEWc/0a1vg4IYX1Ds/ttyhJGTVXOSJSkBz8kRyj1pNBDdc1KeG8M++O8m8VgRTJvYaPc7NMiclISukGpea</ds:X509Certificate> </ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
</S:Header>
<S:Body Id="ABC">
<ns2:createUser xmlns:ns2="http://webservice.rbs.emea.ps.entrust.com/" xmlns:ns3="http://webservice.rbs.emea.ps.entrust.com/types/CertificateException" xmlns:ns4="http://webservice.rbs.emea.ps.entrust.com/types/UserException">
<userID>0061020051</userID>
</ns2:createUser>
</S:Body>
</S:Envelope>
  • Service web WCF

J'ai un certificat de serveur (p7b format à partir d'une autorité de certification de confiance) que j'ai installé où mon service web WCF poste de travail (dev) est à l'aide de la console mmc composant logiciel Enfichable Certificats (pour le moment cert est dans la Confiance des Éditeurs). Je ne pense pas que j'ai besoin d'un autre cert sur le serveur Java, que la réponse doit être claire (ni signé ou chiffré). Je suis encore un peu confus sur ce certificat et des certificats en général -, il semble qu'une clé publique.

Ici sur l'app.config de mon projet de test:

<client>
<endpoint address="http://entrust-user-certification-uat.fm.rbsgrp.net/rbs/WebAS"
behaviorConfiguration="endpointCredentialsBehavior" binding="wsHttpBinding"
bindingConfiguration="WebAsServicePortTypeBinding" contract="IWebAsServicePortType"
name="WebAsServicePortType">
<!--<identity>
<dns value="entrust-user-certification-uat.fm.rbsgrp.net" />
</identity>-->
</endpoint>
</client>
<bindings>
<wsHttpBinding>
<binding name="WebAsServicePortTypeBinding" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text"
textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="Message">
<message clientCredentialType="Certificate" negotiateServiceCredential="false"
establishSecurityContext="false" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="endpointCredentialsBehavior">
<clientCredentials>
<clientCertificate findValue="entrust-user-certification-uat.fm.rbsgrp.net"
storeLocation="LocalMachine" storeName="TrustedPublisher"
x509FindType="FindBySubjectName"></clientCertificate>
<serviceCertificate>
<!--   
Setting the certificateValidationMode to PeerOrChainTrust means that if the certificate 
is in the user's Trusted People store, then it will be trusted without performing a
validation of the certificate's issuer chain. This setting is used here for convenience so that the 
sample can be run without having to have certificates issued by a certificate authority (CA).
This setting is less secure than the default, ChainTrust. The security implications of this 
setting should be carefully considered before using PeerOrChainTrust in production code. 
-->
<authentication certificateValidationMode="None" revocationMode="NoCheck" trustedStoreLocation="LocalMachine"/>
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>

Quand j'ai couru un test simple:

     WebAS entrustService = new WebAS();

     ActivationCodes certCodes = entrustService.createUser("testNomad");

J'ai l'erreur:

     échec du Système.Web.Services.Les protocoles.SoapException:
javax.xml.le savon.SOAPException: Pas de Signature élément trouvé dans le message soap

Comment pourrais-je la force de le processus de signature pour chaque message? Je pensais que je pouvais le faire par le biais de configuration WCF assez facilement. Toute aide serait grandement appréciée !

  • Salut Nomadefv, Comment avez-vous, dans le IClientMessageInspector/BeforeSendReques d'injecter votre renvoyée chaîne XML dans la demande ? AJR
  • Désolé. Un peu dans le dernier couple de la semaine. Vous pourriez essayer:
  • 'objet public BeforeSendRequest(réf Système.ServiceModel.Les canaux.Demande de Message Système.ServiceModel.IClientChannel canal) '{ //... obtenir les différents var de la sécurité du paramètre de configuration '// Charger le certificat dans le magasin de certificats. 'X509Certificate2 cert = GetCertificateBySubject(certificateSubjectName, certificateStoreName, certificateStoreLocation); '// Signer la demande de la chaîne de signedSoapMessage = SignRequest(requête.ToString(), cert, signatureId, keyInfoRefId, bodyId);
  • '// Modifier la demande à la signature du message SOAP 'MemoryStream ms = new MemoryStream(Encodage.UTF8.GetBytes(signedSoapMessage)); var lecteur = XmlDictionaryReader.CreateTextReader(ms, nouvelle XmlDictionaryReaderQuotas ()); demande = Message.CreateMessage(lecteur, Int32.MaxValue, demande.Version); 'return null; }
InformationsquelleAutor Nomadefv | 2011-01-12