2010-10-13 4 views
1

Lors de la création d'un serveur SSL, j'ai reçu cette exception: Default SSL context init failed: null. Il semble que cela vient du fait qu'il ne peut pas trouver le keystore et le truststore. J'essaie de les définir à partir d'un fichier jar. Le fichier existe dans le pot mais il semble que la ressource ne puisse pas être trouvée.L'initialisation du contexte SSL par défaut a échoué: null

String keystore = TestFramework.class.getResource("/security/keystore.jks").getFile(); 
System.setProperty("javax.net.ssl.keyStore", keystore); 
System.setProperty("javax.net.ssl.keyStorePassword", password); 
String truststore = TestFramework.class.getResource("/security/truststore").getFile(); 
System.setProperty("javax.net.ssl.trustStore", truststore); 
System.setProperty("javax.net.ssl.trustStorePassword", "ebxmlrr"); 

j'ai couru une commande ls pour vérifier si le fichier existe. Ça existe. Ensuite, je vérifie si keystore.jks existe en exécutant la commande jar -tf myjar.jar | grep security et il existe.

security/ 
security/keystore.jks 
security/truststore 

Mon application est exécutée sous Tomcat.

Répondre

6

La raison qui ne fonctionne pas est que ces propriétés système attendent un fichier sur le système de fichiers réel, et non à partir d'une archive. Vous feriez mieux de créer votre propre SSLContext utilisant ces flux et keystore trustore:

KeyStore keyStore = KeyStore.getInstance("jks"); 
keyStore.load(TestFramework.class.getResourceAsStream("/security/keystore.jks"), password.toCharArray()); 
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509"); 
keyManagerFactory.init(keyStore, password.toCharArray()); 

KeyStore trustStore = KeyStore.getInstance("jks"); 
trustStore.load(TestFramework.class.getResourceAsStream("/security/truststore"), "ebxmlrr".toCharArray()); 
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509"); 
trustManagerFactory.init(trustStore); 

SSLContext context = SSLContext.getInstance("SSL"); 
context.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom()); 

... 

HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection(); 
urlConnection.setSSLSocketFactory(context.getSocketFactory()); 
+0

Juste un petit commentaire, la méthode de charge a besoin d'un InputStream au lieu d'une URL. Merci pour l'aide. – Sydney

+0

Fixé. C'est ce que j'ai pour adapter le code sans le compiler. – laz