ti-enxame.com

javax.net.ssl.SSLException: Java.security.InvalidAlgorithmParameterException: o parâmetro trustAnchors deve estar não vazio

Eu estou olhando para analisar um arquivo XML que atualiza o arquivo disse diariamente - o único problema que eu tenho é que eles usam seu próprio certificado ( https: // .. .) E eu não posso usar isso URL específico, nem existe um link http: // ... disponível.

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

Este código lança a seguinte exceção ao executar meus testes:

javax.net.ssl.SSLException: Java.lang.RuntimeException: Erro inesperado: Java.security.InvalidAlgorithmParameterException: o parâmetro trustAnchors deve estar não vazio

Eu vi várias sugestões lidando com a criação de várias classes para lidar com esse tipo de conexão ou com um servidor pessoal, além de adicionar o certificado a um keystore e, em seguida, adicionar esse keystore ao projeto Java, mas já estive incapaz de fazer isso e estou procurando uma maneira um pouco mais simples para eu acessar o XML online.

10
Acetaminophen

Você precisa de um armazenamento confiável para armazenar certificados SSL. Você pode baixar o certificado usando seu navegador da Web preferido. Para carregar o certificado no armazenamento confiável, você precisa do programa "keytool", que vem com o JDK.

Por exemplo, se o seu arquivo de certificado é denominado "certificate.crt" e você deseja criar um armazenamento confiável chamado "secure.ts", é possível invocar o keytool da seguinte maneira:

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

Agora, você deve informar ao seu programa onde está o keystore e a senha para abri-lo, definindo as propriedades do sistema "javax.net.ssl.trustStore" e "javax.net.ssl.trustStorePassword" before opening the connection

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

Esta mensagem curiosa significa que o truststore não foi encontrado.

Nada a ver com XML BTW.

3
user207421

Você pode tentar com isso:

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