Saltar al contenido

Opciones para agregar certificados mediante programación a Java KeyStore

Al fin después de tanto luchar ya dimos con la contestación de esta impedimento que tantos usuarios de nuestro espacio presentan. Si quieres aportar algo puedes compartir tu información.

Solución:

Aquí hay un código que puede usar para que los clientes agreguen programáticamente su CA en tiempo de ejecución. No necesita ponerlo en ninguna tienda, solo lleve consigo el archivo codificado PEM. Incluso puede codificarlo en su programa para que no haya un archivo separado para administrar.

static String CA_FILE = "ca-cert.pem";
...

FileInputStream fis = new FileInputStream(CA_FILE);
X509Certificate ca = (X509Certificate) CertificateFactory.getInstance("X.509")
                        .generateCertificate(new BufferedInputStream(fis));

KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(null, null);
ks.setCertificateEntry(Integer.toString(1), ca);

TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);

SSLContext context = SSLContext.getInstance("TLS");
context.init(null, tmf.getTrustManagers(), null);
...

Necesitará un canal de distribución confiable para asegurarse de que su programa no se modifique mientras está sentado en el servidor esperando a que lo seleccionen o mientras viaja por el cable mientras se instala.


openssl s_client -host www.envmgr.com -port 443 -showcerts > cert_chain.crt

Solo debe confiar en el certificado raíz, y no en toda la cadena. El servidor es responsable de enviar todos los certificados intermedios necesarios para construir la cadena. Si el servidor no envía todos los certificados intermedios necesarios para construir la cadena, entonces el servidor está mal configurado.

El problema que está experimentando se denomina problema “Qué directorio”. Es un problema bien conocido en PKI. Esencialmente, significa que un cliente no sabe a dónde ir para obtener un certificado intermedio faltante. Lo resuelve haciendo que el servidor envíe todos los intermediarios requeridos junto con el certificado del servidor. Consulte la regla y la hoja de trucos TLS de OWASP: proporcione siempre todos los certificados necesarios.


Solo desprendimiento de bicicletas, pero hay otra lata de gusanos aquí con Java (especialmente Java 7 y versiones anteriores):

SSLContext ctx = SSLContext.getInstance("TLSv1");
ctx.init(null, tmf.getTrustManagers(), null);

Puede mejorarlo, si lo desea. Ver SSLSocketFactoryEx en ¿Qué suites de cifrado habilitar para SSL Socket?. Cierra algunas brechas en las versiones de protocolo, suites de cifrado, etc. proporcionadas por defecto en Java SSLSocketFactory.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *