Comment définir par programmation la SSLContext de JAX-WS client?
Je suis en train de travailler sur un serveur dans une application distribuée qui a des clients de navigateur et participe également à de serveur-à-serveur de communication avec une 3ème partie.
Mon serveur a un CA-certificat de signature pour laisser à mes clients de se connecter à l'aide du protocole TLS (SSL) de communication à l'aide de HTTP/S et XMPP(sécurisé). C'est tous fonctionne bien.
Maintenant, j'ai besoin de connecter de manière sécurisée à une 3ème partie serveur à l'aide de JAX-WS sur HTTPS/SSL. Dans cette communication, mon serveur agit comme client dans le JAX-WS interaction et j'ai un client certificat signé par la 3ème partie.
J'ai essayé d'ajouter un nouveau fichier de stockage des clés par le biais de la configuration du système standard (-Djavax.net.ssl.keyStore=xyz
) mais mes autres composants sont clairement affectée par cette. Bien que mes autres composants sont dédiés les paramètres de leur configuration SSL (my.xmpp.keystore=xxx, my.xmpp.truststore=xxy, ...
), il semble qu'ils finissent par utiliser le mondial SSLContext
. (La configuration de l'espace de noms my.xmpp.
semble indiquer la séparation, mais il n'est pas le cas)
J'ai aussi essayé d'ajouter mon certificat client dans mon fichier de clés d'origine, mais -encore une fois - mes autres composants ne semblent pas non plus.
Je pense que ma seule option est de programmation pour accrocher dans le JAX-WS HTTPS configuration pour configurer le fichier de clés et truststore pour le client JAX-WS interaction.
Toutes les idées/conseils sur la façon de faire cela? Tous les renseignements que je trouve utilise le javax.net.ssl.keyStore
méthode ou est l'échelon mondial SSLContext
qui -je pense - se retrouvent dans la même confilc. Le plus proche que je suis arrivé à quelque chose d'utile a ce vieux rapport de bug que les demandes de la fonction dont j'ai besoin: Ajout du support pour le passage d'un SSLContext de JAX-WS client runtime
Tout prend?
Ce rapport de bug est plutôt une demande de fonctionnalité et de ne pas parler de la façon dont il devrait être fait.
OriginalL'auteur maasg | 2012-06-12
Vous devez vous connecter pour publier un commentaire.
Celui-ci était un écrou dur à casser, donc pour l'enregistrement:
Pour résoudre ce problème, il faut un custom
KeyManager
et unSSLSocketFactory
qui utilise cette coutumeKeyManager
pour accéder à la séparation de laKeyStore
.J'ai trouvé le code de base pour cette
KeyStore
etSSLFactory
sur cet excellent billet de blog:comment-à-dynamiquement-choisir-un-certificat-alias-quand-invoquer-web-services
Ensuite, le service spécialisé de
SSLSocketFactory
doit être insérée dans le WebService contexte:Où la
getCustomSocketFactory()
renvoie uneSSLSocketFactory
créé en utilisant la méthode mentionnée ci-dessus. Cela ne fonctionne que pour JAX-WS RI de la Sun-Oracle impl construit dans le JDK, étant donné que la chaîne de caractères indiquant leSSLSocketFactory
de la propriété est la propriété exclusive de cette mise en œuvre.À ce stade, JAX-WS service communication est sécurisée par le protocole SSL, mais si vous chargez le fichier WSDL à partir du même serveur sécurisé (), puis vous aurez un problème de bootstrap, comme le HTTPS de la demande de recueillir le WSDL ne sera pas en utilisant les mêmes informations d'identification que le Service Web. J'ai travaillé autour de ce problème en rendant le WSDL disponibles localement (file:///...) et l'évolution dynamique de la terminaison de service web: (un bon sujet de discussion sur les raisons de ce qui est nécessaire peut être trouvé dans ce forum)
Maintenant le WebService obtient démarré et est en mesure de communiquer via le protocole SSL avec le serveur de contrepartie à l'aide d'un nom (alias) Certificat Client et l'authentification mutuelle. ∎
Nous avons eu la même situation et a fini par avoir une copie du fichier wsdl localement. Sinon vous avez précisément ce problème de bootstrap.
Je suis l'ajout de nouveau commentaire ci-dessous sur ma solution de rechange.
pour info: si votre application utilise JAXWS-RI, alors vous devriez utiliser un peu différente de la propriété:
com.sun.xml.ws.transport.https.client.SSLSocketFactory
. Je précise à la fois pour satisfaire les différents modules de tests unitaires et d'application effective de l'environnement (ne demandez pas).Dans le cas où le blog ne va jamais vers le bas, j'ai archivé ici: archive.est/f3goz
OriginalL'auteur maasg
C'est comment je l'ai résolu basé sur ce post avec quelques modifications mineures. Cette solution ne nécessite pas de création de classes supplémentaires.
l'esprit en indiquant quel est le type de webservicePort? Il ressemble à javax.xml.ws.Service, mais pas sûr.
Les gars, j'ai posté ce retour en 2012. Honnêtement, je ne me souviens pas où je l'ai défini ce port. Désolé qu'il n'est pas expliqué mais je n'ai pas accès à ce code de plus pour vérifier les et laissez vous savez. Que j'ai prises à partir de l'injection de paramètre et n'ont pas eu à le définir moi-même, pas sûr. Il ne devrait pas être si difficile que ça à comprendre, je suppose que si vous faites quelques recherches sur BindingProvider et ce qu'il instancie. Si je l'ai fait travailler le dos puis, si vous le pouvez. Bonne chance!
OriginalL'auteur Radek
J'ai essayé ce qui suit, et ça ne fonctionne pas sur mon environnement:
Mais différente de la propriété a fonctionné comme un charme:
Le reste du code a été prise à partir de la première réponse.
wsimport
générer différents types de code... il est possible qu'ils exigent de propriété différents noms.Lorsque vous ajoutez explicitement jaxws-rt Bocaux à votre application, vous devez utiliser la propriété à des noms qui NE contiennent PAS de
.internal.
. Si vous utilisez le JAXWS-RT inclus dans le JDK vous avez besoin d'utiliser celles contenant ".interne.".JAXWSProperties.SSL_SOCKET_FACTORY
résolu à"com.sun.xml.ws.transport.https.client.SSLSocketFactory"
OriginalL'auteur Igors Sakels
En combinant Radek et l0co de réponses, vous pouvez accéder à l'WSDL derrière https:
keystore
dansgetResourceAsStream(keystore)
reportez-vous au chemin d'accès du fichier de certificat?Dans ce cas, c'est le chemin d'accès dans le chemin de classe. Vous pouvez utiliser un Fichier au lieu de getClass().getResourceAsStream() si vous avez besoin de le chemin absolu du fichier.
pas génial pour moi parce que j'en fais d'autres appels que je veux utiliser le ssl par défaut prise en usine et ce serait de les farcir jusqu'
OriginalL'auteur cidus
Ci-dessus est très bien (comme je l'ai dit en commentaire), à moins que votre WSDL est accessible à l'adresse https://.
Voici ma solution de contournement pour ce:
Jeu vous SSLSocketFactory comme valeur par défaut:
Pour Apache CXF que j'utilise, vous devez également ajouter ces lignes dans votre fichier config:
OriginalL'auteur Łukasz Frankowski
Pour ceux qui essaient et toujours pas à la faire fonctionner, cela n'a pour moi avec Wildfly 8, à l'aide de la dynamique
Dispatcher
:bindingProvider.getRequestContext().put("com.sun.xml.ws.transport.https.client.SSLSocketFactory", yourSslSocketFactory);
Noter que le
internal
partie de la Propriété de la clé a disparu ici.OriginalL'auteur Davio
J'ai eu des problèmes de confiance d'un certificat auto-signé lors de la configuration de la fiducie, le gestionnaire. J'ai utilisé le SSLContexts constructeur de l'apache httpclient pour créer un personnalisé
SSLSocketFactory
et en le passant dans le
new TrustSelfSignedStrategy()
comme un argument dans laloadTrustMaterial
méthode.OriginalL'auteur user3047573
J'ai essayé la procédure décrite ici:
http://jyotirbhandari.blogspot.com/2011/09/java-error-invalidalgorithmparameterexc.html
Et, qui a résolu le problème. J'ai fait quelques modifications mineures - je régler les deux paramètres à l'aide du Système.getProperty...
OriginalL'auteur Kumar Saurabh
Vous pouvez déplacer votre proxy d'authentification et de ssl personnel de savon gestionnaire
C'est mon exemple, faire tout réseau ops
Il utiliser UrlConnection, vous pouvez utiliser n'importe quelle bibliothèque vous voulez dans le gestionnaire.
Amusez-vous!
OriginalL'auteur lunicon