[autenticación ssl, certificado] SSL autenticación bidireccional java combat, keytool para crear un certificado


Artículos relacionados:
//-----------Comienzo de Java SSL-------------
【autenticación ssl, certificado】SSL dos- forma de autenticación La diferencia con la autenticación unidireccional SSL (diagrama esquemático)
[autenticación ssl, certificado] descripción de API de sintaxis ssl (SSLContext) en java, conexión con herramientas keytool
[autenticación ssl, certificado] autenticación bidireccional SSL combate real de java, herramienta clave para crear un certificado
[autenticación ssl, certificado] Análisis de captura de paquetes de Wireshark
[certificación ssl, certificado] Ver el contenido del archivo de almacén de claves
//------------Terminación SSL de Java------ ---------- ----------

//-----------El siguiente es el conocimiento relacionado con el certificado CA y openssl-------------
[certificación ssl, certificado] Certificación bidireccional TLS/SSL concepto, ejemplo de openssl genrsa
[certificación ssl, certificado] explicación detallada del comando openssl genrsa
[certificación ssl, certificado] Concepto básico del certificado SSL, formato de certificado, diferencia entre openssl y keytool

descripción general

Preste atención al comando keytool, la versión es diferente [certificación ssl, certificado] la diferencia y la conexión entre keytool genkey y genkeypair

Para conocer el principio del código de ejemplo de este artículo, consulte [autenticación ssl, certificado] conexión ssl y keytool en java , y véanlo juntos

ejemplo de herramienta clave

Escenario de simulación:
la comunicación entre el servidor y el cliente requiere autorización y verificación de identidad, es decir, el cliente solo puede aceptar mensajes del servidor y el servidor solo puede aceptar mensajes del cliente.

Tecnología de implementación:
JSSE (Java Security Socket Extension)
es una solución lanzada por Sun para solucionar la seguridad de las comunicaciones en Internet. Implementa los protocolos SSL y TSL (Transport Layer Security). En JSSE se incluyen tecnologías como el cifrado de datos, la autenticación del servidor, la integridad de los mensajes y la autenticación del cliente. Mediante el uso de JSSE, los desarrolladores pueden transmitir datos de forma segura entre el cliente y el servidor a través del protocolo TCP/IP.

Para implementar la autenticación de mensajes.
El servidor necesita:
1) KeyStore: guarda la clave privada del servidor
2) Trust KeyStore: guarda el certificado de autorización del cliente
Del mismo modo, el cliente necesita:
1) KeyStore: guarda la clave privada del cliente
2) Trust KeyStore: guarda una copia del certificado de autorización del servidor, la función es similar al blanco La lista se usa para juzgar si el certificado enviado por el par es legal. Solo el certificado tks es válido, de lo contrario, la conexión se rechaza directamente.

Podemos usar el comando keytool que viene con Java para generar dichos archivos de información
1) Generar la clave privada del servidor e importarla al archivo KeyStore del servidor

Estrictamente hablando, en este momento se genera un par de claves, es decir, tanto la clave privada como la clave pública están en este archivo, y luego se puede exportar el certificado a través de Importar (el certificado contiene la clave pública)

keytool -genkey -alias serverkey -keystore kserver.keystore

Durante el proceso, debe completarlos respectivamente y configurarlos usted mismo de acuerdo con sus necesidades
Contraseña del almacén de claves: 123456
Nombre y apellido: piedra
Nombre de la unidad de organización: eulic
Nombre de la organización: eulic Nombre de
la ciudad o región: HZ
Nombre del estado o provincia: ZJ
Código de país: CN
serverkey clave privada Contraseña, no ingrese la misma contraseña que el almacén de claves: 123456
para generar el archivo kserver.keystore
server.keystore es para el servidor, que almacena su propia clave privada

2) Según la clave privada, exporte el certificado del servidor (incluida la clave pública)

Por eso se dice que kserver.keystore contiene información de clave pública

keytool -export -alias serverkey -keystore kserver.keystore -file server.crt

server.crt es el certificado del servidor

3) Importe el certificado del servidor en Trust KeyStore del cliente

keytool -import -alias serverkey -file server.crt -keystore tclient.keystore

tclient.keystore es para el cliente, que almacena certificados de confianza

Con el mismo método, genere la clave privada y el certificado del cliente e impórtelos en el Trust KeyStore del servidor.

1)keytool -genkey -alias clientkey -keystore kclient.keystore
2)keytool -export -alias clientkey -keystore kclient.keystore -file client.crt
3)keytool -import -alias clientkey -file client.crt -keystore tserver.keystore

De esta forma, los archivos generados se dividen en dos grupos:
Almacenamiento del servidor: kserver.keystore tserver.keystore
Almacenamiento del cliente: kclient.keystore tclient.kyestore

Luego, use JSSE para generar SSLServerSocket y SSLSocket respectivamente

En el lado del servidor, genere el código SSLServerSocket:

SSLContext ctx = SSLContext.getInstance("SSL");

KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");

KeyStore ks = KeyStore.getInstance("JKS");
KeyStore tks = KeyStore.getInstance("JKS");

ks.load(new FileInputStream("data/kserver.keystore"), SERVER_KEY_STORE_PASSWORD.toCharArray());
tks.load(new FileInputStream("data/tserver.keystore"), SERVER_TRUST_KEY_STORE_PASSWORD.toCharArray());

kmf.init(ks, SERVER_KEY_STORE_PASSWORD.toCharArray());
tmf.init(tks);

ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

serverSocket = (SSLServerSocket) ctx.getServerSocketFactory().createServerSocket(DEFAULT_PORT);
serverSocket.setNeedClientAuth(true);

Nota: En el lado del servidor, debe configurarse setNeedClientAuth(true)para habilitar la autenticación bidireccional; de lo contrario, es esencialmente una autenticación unidireccional.

En el lado del cliente, el código para generar SSLSocket es similar con pequeñas diferencias:

SSLContext ctx = SSLContext.getInstance("SSL");

KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");

KeyStore ks = KeyStore.getInstance("JKS");
KeyStore tks = KeyStore.getInstance("JKS");

ks.load(new FileInputStream("data/kclient.keystore"), CLIENT_KEY_STORE_PASSWORD.toCharArray());
tks.load(new FileInputStream("data/tclient.keystore"), CLIENT_TRUST_KEY_STORE_PASSWORD.toCharArray());

kmf.init(ks, CLIENT_KEY_STORE_PASSWORD.toCharArray());
tmf.init(tks);

ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

return (SSLSocket) ctx.getSocketFactory().createSocket(DEFAULT_HOST, DEFAULT_PORT);

De esta forma, se completa la interacción basada en la autenticación entre el servidor y el cliente.

El cliente usa la clave privada clientkey en kclient.keystore para cifrar los datos y los envía al servidor.
El servidor usa el certificado client.crt en tserver.keystore (incluida la clave pública de clientkey) para descifrar los datos. Si el descifrado tiene éxito, prueba que el mensaje proviene del cliente.procesamiento lógico

El servidor usa la clave privada serverkey en kserver.keystore para cifrar los datos y los envía al cliente.
El cliente usa el certificado server.crt en tclient.keystore (incluida la clave pública serverkey) para descifrar los datos. Si el descifrado es exitoso , prueba que el mensaje proviene del servidor.procesamiento lógico

Si el descifrado falla durante el proceso, prueba que la fuente del mensaje es incorrecta. No se realiza ningún procesamiento lógico. Esto completa la autenticación bidireccional.

Al iniciar el servidor:

  • Primero use telnet 127.0.0.1 7777 para conectarse en CMD y descubra que la conexión es exitosa, pero después de enviar el mensaje, la conexión se interrumpe inmediatamente porque el cliente no tiene un certificado en este momento;
  • Reinicie el programa cliente y descubra que la conexión es normal y puede intercambiar mensajes

Ver study-ssl para un ejemplo completo

referencia

Implementación java de autenticación bidireccional SSL

Supongo que te gusta

Origin blog.csdn.net/m0_45406092/article/details/129790663
Recomendado
Clasificación