Le réglage par défaut de Java SSLContext à partir d'une ressource au moment de l'exécution
Les composants de base de mes question sont (contexte suit l'extrait de code)
- Est le code suivant, une alternative valable à la configuration de Java par défaut du fichier de clés via l'-Djavax.net.le protocole ssl.fichier de clés?
- Quel est l'impact, autre que de changer la valeur par défaut de la clé et de gestionnaires des fonds, ne serait-ce code avoir sur le comportement de SSL à l'intérieur de la JVM
- Est-il une meilleure alternative à la configuration par défaut de fiducie et/ou les magasins de clés, au moment de l'exécution, à partir d'une ressource?
KeyStore ks = KeyStore.getInstance("JKS"); ks.load(testService.class.getClassLoader().getResourceAsStream("resources/.keystore"), "changeit".toCharArray()); TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(ks); KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); kmf.init(ks, "changeit".toCharArray()); SSLContext ctx = SSLContext.getInstance("TLS"); ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); SSLContext.setDefault(ctx);
Le contexte entourant cette question est comme suit. Je suis actuellement à l'élaboration d'un CXF client pour un service web avec l'authentification par certificat. Pour diverses raisons, ajouter le certificat du client et la clé de la valeur par défaut du fichier de clés n'est pas une option souhaitable. Idéalement, je cherchais un moyen d'inclure un fichier de clés en tant que fichier de ressources dans le POT, et le définir comme valeur par défaut au moment de l'exécution, que le besoin s'en fait sentir. Je voulais aussi éviter de configuration de chaque client et/ou de connexion sur chaque objet, et aussi de soutenir le fonctionnement des choses comme JaxWsDynamicClientFactory (surtout pour le souci d'exhaustivité).
J'ai parcouru l'internet pour le matériel pertinent et trouvé ces (un, deux) liées à des questions, mais aucune des solutions proposées étaient exactement ce que je cherchais (bien que je ne l'utiliser comme tremplin pour développer le code ci-dessus).
Maintenant, je me rends compte que d'autres solutions pourraient être apportées à travailler, mais j'étais/suis spécifiquement à la recherche d'une solution qui réponde à toutes ces exigences.
OriginalL'auteur Jeffrey P | 2012-01-06
Vous devez vous connecter pour publier un commentaire.
Votre code, utilisez le même fichier de clés (chargé à partir du chargeur de classe) comme clé par défaut magasin et la confiance par défaut magasin. C'est en fait l'équivalent de réglage à la fois
-Djavax.net.ssl.keystore*
et-Djavax.net.ssl.truststore*
avec la même valeur.C'est bien si c'est ce que vous voulez faire. (Vous pouvez fermer la
InputStream
une fois que vous avez chargé le fichier de clés, cependant).Cela affectera l'ensemble de la JVM, et tout ce qui utilise les
SSLContext.getDefault()
, en particulier tout ce qui s'appuie sur la valeur par défautSSLSocketFactory
(URLConnection
et ainsi de suite).Car ce sera par défaut de votre magasin de confiance, la valeur par défaut de confiance des certificats d'autorité de certification à partir des principaux CAs ne seront pas dans votre magasin de confiance, sauf si vous avez explicitement importé dans la copie que vous chargez à partir du chargeur de classe.
Sans doute, vous n'aurez pas un grand nombre de nouveaux CA (ou auto-signé) certificats de confiance. Il peut être plus pratique de garder le fichier de clés et truststore séparés, depuis votre truststore peut être commun à la plupart de vos clients, et il devrait habituellement être juste une étape de la configuration au début.
OriginalL'auteur Bruno