2011-12-04 14 views
9

Estoy buscando analizar un archivo XML que actualice dicho archivo a diario, el único problema que me he encontrado es que usan su propio certificado (https://..) y no puedo usar esa URL específica, ni hay un enlace http: // ... disponible.javax.net.ssl.SSLException: java.security.InvalidAlgorithmParameterException: el parámetro trustAnchors debe estar vacío

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

Este código produce la siguiente excepción durante la ejecución de mis pruebas:

javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty

he visto una variedad de sugerencias que se ocupan de la creación de varias clases para hacer frente a este tipo de conexión o con un servidor personal , además de agregar el certificado a un almacén de claves y luego agregar ese almacén de claves al proyecto Java, pero no he podido hacer eso y estoy buscando una forma un poco más simple para que acceda al XML en línea.

+0

Parece que ha cambiado la configuración de trustStore no utilizar la falta de pago. ¿Qué has cambiado? – Bruno

+1

Esto tuvo el efecto de eliminar el almacenamiento de confianza predeterminado, por lo tanto, obtuvo un parámetro trustAnchors vacío. Siempre debe haber un almacén de confianza no vacío. – Bruno

+0

Ver esto [respuesta] [1] En resumen, no se puede encontrar el almacén de claves. [1]: http://stackoverflow.com/a/6788682/207131 – FabienB

Respuesta

3

Este mensaje curioso significa que no se encontró el almacén de confianza.

Nada que ver con XML BTW.

+0

¿Cómo puedo agregar y administrar un almacén de confianza? – Acetaminophen

+0

@Acetaminophen Consulte la Guía de referencia de Javadoc: Seguridad/JSSE. – EJP

+0

He cambiado el nombre /lib/security/cacerts a /lib/security/cacerts_orig anteriormente en un intento de agregar el certificado que tengo a un almacén de claves - He solucionado eso y ahora aparece el siguiente error: javax.net.ssl .SSLHandshakeException: sun.security.validator.ValidatorException: construcción de rutas PKIX fallida: sun.security.provider.certpath.SunCertPathBuilderException: no se puede encontrar una ruta de certificación válida para el destino solicitado – Acetaminophen

9

Necesita un almacén de confianza para almacenar certificados SSL. Puede descargar el certificado utilizando su navegador web preferido. Para cargar el certificado en el almacén de confianza, necesita el programa "keytool", que viene con el JDK.

Por ejemplo, si el archivo de Certificación se llama "certificate.crt" y que desea crear un almacén de confianza llamado "secure.ts", puede invocar herramienta de claves de la siguiente manera:

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

Ahora, debe informe a su programa en el almacén de claves es y la contraseña para abrirlo, la definición de las propiedades del sistema "javax.net.ssl.trustStore" y "javax.net.ssl.trustStorePassword" antes de abrir la conexión

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()); 
-3

Me encontré con la misma excepción para mi MAC OSX (Yosemite), mientras desarrollo aplicaciones Java 6. Es necesario descargar e instalar Java de Apple para OSX 2014:

http://support.apple.com/kb/DL1572

0

Usted puede tratar con esto:

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. 
Cuestiones relacionadas