Comment ajouter plusieurs truststore chemins “de java.net.le protocole ssl.trustStore”?
Je veux mon Code Java à la recherche pour le certificat d'autorité de certification du serveur dans un fichier de clés... si c'est pas en mesure de trouver le certificat spécifique (qui je pense ne seront connus que lorsque j'essaie de me connecter via LDAP Directory Server), il doit chercher le certificat dans un autre fichier de clés, dont le chemin que je connais.
J'ai essayé ceci:
System.setProperty("javax.net.ssl.trustStore", System.getProperty("java.home") + "/lib/security/cacerts" + System.getProperty("path.separator") + path/to/second/keystore);
Mais il n'a pas l'air de fonctionner.
D'ajouter un seul chemin (l'un ou l'autre) fonctionne, c'est à dire qu'il fonctionne comme un charme si le certificat est trouvé et échoue sinon.
Donc ma question est:
-
Est-il une méthode pour ajouter plusieurs keystore chemins de javax.net.le protocole ssl.trustStore?
-
Si il n'est pas possible, comment dois-je écrire mon code (j'ai fais une demande pour l'algorithme), de sorte qu'elle juste ne pas jeter l'Exception après la première recherche en elle-même et ne parviennent pas?
P. S. : je ne suis pas très familier avec Java.
Ci-dessous est la partie de mon code:
if(useSSL)
{
try
{
SSLContext se = SSLContext.getInstance("TLS");
Security.addProvider(se.getProvider());
}
catch(NoSuchAlgorithmException e) { }
System.setProperty("javax.net.ssl.trustStore", System.getProperty("java.home") + "/lib/security/cacerts");
com.org.ldap.LDAPSocketFactory ssf = new LDAPJSSESecureSocketFactory();
LDAPConnection.setSocketFactory(ssf);
}
try
{
lc = new LDAPConnection();
lc.connect( ldapServer, ldapPort);
lc.bind( ldapVersion, ldapUser, (userInfo[1]).getBytes() );
}
catch (LDAPException le)
{
le.printStackTrace();
}
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas avoir plusieurs chemins pour
javax.net.ssl.trustStore
.Le plus simple serait de faire une copie locale de la JRE
cacerts
et importer les certificats à partir de votre autre magasin (dans les faits, de les fusionner). (Voirkeytool -importkeystore
.)Sinon, si vous savez à l'avance que toutes vos connexions LDAP de l'utilisation de vos deuxième fichier de clés (et vous aussi vous voulez être en mesure d'utiliser la valeur par défaut truststore pour d'autres, non liés à des connexions), vous pouvez configurer ce magasin de confiance pour que
SSLSocketFactory
seulement. Je ne suis pas familier aveccom.org.ldap.LDAPSocketFactory
, mais il pourrait avoir une option pour le faire. (Sinon, vous pouvez créer votre propreSSLContext
initialisé avec votre deuxième truststore et obtenir uneSSLSocketFactory
, comme décrit dans cette réponse).Un autre, plus compliqué, serait de créer un personnalisé
X509TrustManager
qui encapsule la confiance par défaut du gestionnaire, les captures de ses exceptions et essaie de nouveau avec une autre fiducie, le gestionnaire d'initialisation à l'aide de votre deuxième magasin. C'est faisable, mais vous devez vous assurer que ça en jette toujours l'exception, si ni les gestionnaires des fonds d'accepter votre certificat (sinon, il y aurait un trou de sécurité). Si vous n'êtes pas familier avec la JSSE API (Java ou en tout), ce n'est probablement pas la meilleure option.En outre, être prudent lorsque vous utilisez
System.setProperty("javax.net.ssl.trustStore", ...)
dans votre code: c'est ce qui est lu, pour initialiser la valeur par défautSSLContext
, mais la valeur par défautSSLContext
n'est initialisé une fois, la première fois que c'est nécessaire. La définition de cette propriété du système par la suite aurait aucun effet (à moins bien sûr, d'autres classes à partir d'autres bibliothèques comptent également sur cette valeur).Il n'est également pas clair ce que vous essayez d'atteindre avec cela, puisque vous aurez toujours réussir à ajouter un fournisseur de services de sécurité qui est déjà là:
Non, il suffit d'importer tous les certificats d'un truststore dans l'autre, et d'utiliser le second.