2010-01-20 3 views
1

J'essaie d'utiliser com.sun.grizzly.SSLConfig.setKeyStoreFile() pour définir le protocole SSL pour Grizzly. Il ne prend qu'une chaîne comme entrée (pas InputStream ou File). Je veux utiliser un fichier jks qui se trouve dans un fichier JAR. Si je passe une chaîne pour un chemin jar (par exemple C: \ dir \ my.jar! \ Resources \ my.jks), elle échoue. Autre que de décompresser le fichier du JAR, comment puis-je utiliser ce JKS pour grizzly.Définition du fichier de clés de Grizzly pour utiliser un fichier jks dans un bocal

Répondre

3

Il ne semble pas que vous puissiez transmettre autre chose qu'un nom de fichier. Si vous affichez le source et examinez les méthodes validateConfiguration() et createSSLContext(), vous verrez qu'il transmet la variable keyStoreFile directement au constructeur FileInputStream.

À court terme, vous êtes probablement bloqué avec décompression et utilisation du nom de fichier direct. Ou vous pouvez substituer les deux méthodes listées ci-dessus pour valider et initialiser correctement le SSLContext. À long terme, je soumettrais un patch.

2

@ L'idée de Kevin a fonctionné! L'utilisation grizzly-servlet-webserver 1.9.8, voici mon code:


SSLConfig ssl = new SSLConfig(){ 
@Override 
public SSLContext createSSLContext() { 
    try{ 
    //Load the keystore. 
    KeyStore keyStore=KeyStore.getInstance(KeyStore.getDefaultType()); 
    InputStream keyStream=ClassLoader.getSystemResourceAsStream("my.jks"); 
    //InputStream keyStream=new java.net.URL("jar:file:/C:/dir/my.jar!/my.jks").openStream(); 
    keyStore.load(keyStream,"mypassword"); 
    keyStream.close(); 

    //Create the factory from the keystore. 
    String kmfAlgorithm=System.getProperty("ssl.KeyManagerFactory.algorithm",KeyManagerFactory.getDefaultAlgorithm()); 
    KeyManagerFactory keyManagerFactory=KeyManagerFactory.getInstance(kmfAlgorithm); 
    keyManagerFactory.init(keyStore,"mypassword"); 

    //Create the SSLContext 
    SSLContext sslContext=SSLContext.getInstance("TLS"); 
    sslContext.init(keyManagerFactory.getKeyManagers(), null, null); 
    return sslContext; 
    } 

    //Wrap all Exceptions in a RuntimeException. 
    catch(Exception e){ 
    throw new RuntimeException(e); 
    } 
} 
}; 

Je pris quelques raccourcis (ne pas vous déconnecter des exceptions, en utilisant plusieurs constantes de chaîne, etc.), mais vous pouvez obtenir l'idée.

Questions connexes