web-dev-qa-db-fra.com

javax.net.ssl.SSLException: Java.security.InvalidAlgorithmParameterException: le paramètre trustAnchors doit être non vide

Je cherche à analyser un fichier XML qui met à jour ledit fichier quotidiennement - le seul problème que j'ai rencontré est qu'ils utilisent leur propre certificat ( https: // .. .) Et je ne peux pas l'utiliser URL spécifique, ni un lien http: // ... disponible.

URL url = new URL("https://...");
...
Document document = db.parse(url.openStream());

Ce code lève l'exception suivante lors de l'exécution de mes tests:

javax.net.ssl.SSLException: Java.lang.RuntimeException: erreur inattendue: Java.security.InvalidAlgorithmParameterException: le paramètre trustAnchors ne doit pas être vide

J'ai vu diverses suggestions concernant la création de différentes classes pour traiter ce type de connexion ou avec un serveur personnel, ainsi que l'ajout du certificat à un magasin de clés, puis l'ajout du magasin de clés au projet Java. incapable de le faire et cherche un moyen légèrement plus simple pour accéder au XML en ligne.

10
Acetaminophen

Vous avez besoin d'un truststore pour stocker les certificats SSL. Vous pouvez télécharger le certificat à l'aide de votre navigateur Web préféré. Pour charger le certificat dans le magasin de clés de confiance, vous avez besoin du programme "keytool", fourni avec le JDK.

Par exemple, si votre fichier de certificat s'appelle "certificate.crt" et que vous voulez créer un magasin de clés de confiance nommé "secure.ts", vous pouvez appeler keytool comme suit:

keytool -importcert -keystore secure.ts -storepass S3cuR3pas$! -file certificate.crt

Maintenant, vous devez indiquer à votre programme l'emplacement du fichier de clés et le mot de passe pour l'ouvrir, en définissant les propriétés système "javax.net.ssl.trustStore" et "javax.net.ssl.trustStorePassword" avant ouverture de la connexion

URL url = new URL("https://...");

System.setProperty("javax.net.ssl.trustStore", "secure.ts");
System.setProperty("javax.net.ssl.trustStorePassword", "S3cuR3pas$!");
...
Document document = db.parse(url.openStream());
10
Errepunto

Ce message curieux signifie que le magasin de clés de confiance n'a pas été trouvé.

Rien à voir avec XML BTW.

3
user207421

Vous pouvez essayer avec ceci:

String javaHomePath = System.getProperty("Java.home");
String keystore = javaHomePath + "/lib/security/cacerts";
String storepass= "changeit";
String storetype= "JKS";

String[][] props = {
    { "javax.net.ssl.trustStore", keystore, },
    { "javax.net.ssl.keyStore", keystore, },
    { "javax.net.ssl.keyStorePassword", storepass, },
    { "javax.net.ssl.keyStoreType", storetype, },
};
for (int i = 0; i < props.length; i++) {
    System.getProperties().setProperty(props[i][0], props[i][1]);
}
// Now you can proceed to connect to call the webservice.
// SSL will be used automatically if the service endpoint url 
// starts with <a href="https://." target="_blank"         rel="nofollow">https://.</a>
// The server will send its certificate signed by verisign and 
// client will trust and authenticate the server as it recognizes 
// verisign as one trusted root.
0
atiruz