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; }
Vous devez vous connecter pour publier un commentaire.
OK. Après quelques essais et erreurs, voici la solution à l'aide de SignedXml et IClientMessageInspector/BeforeSendRequest modèle. Merci beaucoup pour Yaron Naveh pour ses suggestions pertinentes.
et la CustomSignedXml classe:
Pouvez-vous capturer message envoyer par votre service WCF? Btw. est message de sécurité utilisés par Java de service décrite dans le fichier WSDL - ce qui rendrait les choses beaucoup plus facile.
Par votre description, je pense que votre configuration est incorrecte, car quand le Certificat du client les informations d'identification sont utilisés, vous avez besoin de deux certificats - certificat du client avec le public et la clé privée et le certificat du serveur avec la clé publique.
Il est également décrit dans vos exigences:
Pourquoi auriez-vous besoin de renvoyer le certificat du service qui est déjà installé sur ce serveur? Pourquoi le service de vérifier si son certificat d'autorité de certification de confiance? Je suppose que ces exigences vous dit que vous devez créer un nouveau certificat pour votre client.
Mais ceux qui sont seuls hypothèse parce que les besoins réels sont généralement décrits dans la langue commune, - WSDL + WS-Security assertions.
Le contrôle de la Signature et de chiffrement est possible à plusieurs niveaux. Tout d'abord chaque
ServiceContract
etMessageContract
a bien ProtectionLevel qui est par défautEncryptAndSign
. Vous pouvez le modifier àSign
.