Errores de SSL Handshake al intentar conectarse a los servidores push de Apple a través de Java.

He estado probando el código de este pregunta dentro de un proyecto Eclipse/Maven/Jetty, y obtengo SSLHandshakeException desde dentro del bloque try{} cerca de sslSocket.startHandshake(). Lo probé tanto con mi archivo .p12 cargado en keyStore como con mi .pem. Ninguno de los dos trabaja. Ambos trabajaron en un prototipo de PHP que construí. Tampoco estaba claro si los dos usos de eran de la misma contraseña.

try {
    KeyStore keyStore = KeyStore.getInstance("PKCS12");

    keyStore.load(getClass().getResourceAsStream("cert.p12"), "<password>".toCharArray());
    KeyManagerFactory keyMgrFactory = KeyManagerFactory.getInstance("SunX509");
    keyMgrFactory.init(keyStore, "<password>".toCharArray());

    SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(keyMgrFactory.getKeyManagers(), null, null);
    SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

    SSLSocket sslSocket = (SSLSocket) sslSocketFactory.createSocket(host, port);
    String[] cipherSuites = sslSocket.getSupportedCipherSuites();
    sslSocket.setEnabledCipherSuites(cipherSuites);
    sslSocket.startHandshake();
}catch()...

He comprobado la conexión a los servidores de Apple usando

openssl s_client -connect gateway.sandbox.push.apple.com:2195

A cambio obtengo lo siguiente.

CONNECTED(00000003)
depth=1 /C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust Certification Authority - L1C
verify error:num=20:unable to get local issuer certificate
verify return:0
18183:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:/SourceCache/OpenSSL098/OpenSSL098-44/src/ssl/s3_pkt.c:1102:SSL alert number 40
18183:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:/SourceCache/OpenSSL098/OpenSSL098-44/src/ssl/s23_lib.c:182:

No estoy muy seguro de lo que está pasando. ¿Algunas ideas?

preguntado el 03 de mayo de 12 a las 13:05

¿Qué excepción? No habilite todos los conjuntos de cifrado admitidos. Hay una razón por la que algunos de ellos están deshabilitados de forma predeterminada: algunos son inseguros. -

javax.net.ssl.SSLHandshakeException: Alerta fatal recibida: handshake_failure es la excepción que recibo como señalé en mi pregunta. Parece que getClass().getResourceAsStream podría no estar leyendo/encontrando mi archivo "cert.p12". En cuyo caso no estoy seguro de dónde ponerlo para que se encuentre. Además, Push ha existido por un tiempo, ¿por qué no hay un buen tutorial/cómo hacerlo claramente escrito? -

Debo decir que para Java, PHP es fácil y funciona bien. -

La falta de certificado de cliente es la causa probable. No encontrar "cert.p12" causaría eso. Depende de ti saber dónde está... -

Sip. Moví el certificado directamente a / y usé keyStore.load(new FileInputStream("/newcert.p12"), .toCharArray()); Y la excepción desapareció. Es una solución a corto plazo hasta que pueda hacer que la referencia de archivos funcione correctamente en este proyecto. Gracias por ser una caja de resonancia. -

0 Respuestas

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.