Este artículo describe el método para implementar la autenticación bidireccional SSL en Java. Compártelo para su referencia, como sigue:
La verificación SSL común es más común. Solo verifique si nuestro servidor es verdadero o correcto. Por supuesto, si la URL que está visitando es incorrecta, entonces nadie puede hacerlo. Esto se llama autenticación unidireccional SSL.
Pero en realidad, también podemos verificar si el cliente cumple con los requisitos, es decir, emitir un certificado para cada uno de nuestros usuarios, y cada certificado digital es único y no público. De esta manera, puede asegurarse de que el usuario actualmente acceda a mi servidor sea reconocido por el servidor y que otros no pueden acceder.
La autenticación bidireccional asegura que tanto el servidor como el cliente se reconozcan entre sí en el primer nivel. Luego, si quieren comunicarse, adjuntarán un protocolo SSL al protocolo de comunicación para garantizar que el contenido de la comunicación esté encriptado. Incluso las herramientas de sniffer de red como Sniffer vea el código confuso. En el futuro, te demostraré lo que ves con Sniffer sin cifrado. Me temo que estarás más atento de esta manera.
El siguiente contenido se extrae de Internet y se modifica después de la verificación real.
Escenario de simulación:
Cuando el lado del servidor se comunica con el lado del cliente, se 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 resolver comunicaciones seguras en Internet. Implementa protocolos SSL y TSL (seguridad de la capa de transporte). El JSSE incluye tecnologías como cifrado de datos, verificación del servidor, integridad de mensajes y verificación del cliente. Al usar JSSE, los desarrolladores pueden transferir 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 requiere:
1) almacén de claves: donde se guarda la clave privada del servidor
2) Confiar en el almacén de claves: guarda el certificado de autorización del cliente
Del mismo modo, el cliente requiere:
1) almacén de claves: donde se guarda la clave privada del cliente
2) Confiar en el almacén de claves: aquí recomiendo usar el comando KeyTool que viene con Java para generar dichos archivos de información. Por supuesto, OpenSSL es también la generación de certificados SSL de código abierto más popular. OpenSSL está escrito en lenguaje C, sistema cruzado. Sin embargo, podemos considerar la conveniencia de usar programas Java para generar certificados en el futuro y usar el keytool que viene con JDK.
1) Genere la clave privada del servidor e importe en el archivo del almacén de claves del servidor
KeyTool -Genkey -alias Serverkey -Keystore Kserver.Keystore
Durante el proceso, debe completarlo por separado y configurarlo de acuerdo con sus necesidades.
Contraseña del almacén de claves: 123456
Primer y apellido: Jin
Nombre de la unidad organizacional: ninguno
Nombre de la organización: ninguno
Nombre de la ciudad o región: BJ
Nombre del estado o provincia: BJ
Código de país: CN
La contraseña de la tecla privada ServerKey no se completa lo mismo que la contraseña del almacén de claves. Asegúrese de prestar atención aquí, simplemente presione Entrar sin cambiar su contraseña. De lo contrario, si esta clave privada no se puede aplicar directamente en el programa posterior, se informará un error.
Puede generar el archivo kserver.keystore
Server.Keystore se usa para el servidor, que almacena su propia clave privada.
2) Exportar el certificado del servidor según la clave privada
keyTool -export -alias Serverkey -keystore Kserver.keystore -file Server.crt
Server.crt es el certificado en el lado del servidor
3) Importar el certificado del servidor en la tienda de claves de confianza del cliente
keyTool -Import -alias Serverkey -file Server.crt -keystore tclient.keystore
tclient.keystore es para clientes, y posee un certificado de confianza.
De la misma manera, genere la clave privada del cliente y el certificado del cliente, e importe en la tienda de claves de fideicomiso 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 manera, los archivos generados se dividen en dos grupos
Servidor Guardar: kserver.keystore tserver.keystore
Guardar con el cliente: kclient.keystore tclient.kystore
Lo siguiente es para verificar que el certificado que generamos está disponible a través del programa de comunicación Java Socket.
Cliente:
ejemplos de paquete.ssl; import java.io.bufferedInputStream; import java.io.bufferedOutputPutStream; import java.io.fileInputStream; import java.io.ioException; import java.io.inputStream; import java.io.outputStream; import java.io.outstream; import java.security; javax.net.ssl.keyManagerFactory; import javax.net.ssl.sslcontext; import javax.net.ssl.sslsocket; import javax.net.ssl.trustmanagerfactory;/** * ssl cliente * */clase pública sslclient {private estático string final_host = "127.0.0.1"; Private estático final int default_port = 7777; Private static final String client_key_store_password = "123456"; Private static final String client_trust_key_store_password = "123456"; sslsocket privado sslsocket; / ** * Iniciar el programa Client * * @param args */ public static void main (string [] args) {sslclient client = new sslClient (); client.init (); Client.process (); } / *** Conéctese al servidor a través del socket SSL y envíe un mensaje* / public void Process () {if (sslsocket == null) {system.out.println ("error"); devolver; } try {inputStream input = sslsocket.getInputStream (); OutputStream output = sslsocket.getOutputStream (); BufferedInputStream BIS = new BufferedInputStream (entrada); BufferedOutputStream Bos = new BufferedOutputStream (salida); bos.write ("Mensaje del cliente" .getBytes ()); bos.flush (); byte [] buffer = new Byte [20]; bis.read (búfer); System.out.println (nueva cadena (búfer)); sslsocket.close (); } catch (ioException e) {System.out.println (e); }}/** * <ul> * <li> Los puntos clave de la conexión SSL: </li> * <li> Inicializar sslsocket </li> * <li> Importar la tienda de claves de claves privadas del cliente, importar la tienda de teclas de confianza del cliente (certificado del servidor) </li> * </ul> */public void init () {try {sslContext Ctx = sslconteNt.context. KeyManagerFactory KMF = KeyManagerFactory.getInstance ("Sunx509"); TrustManagerFactory tmf = TrustManagerFactory.getInstance ("Sunx509"); KeyStore ks = KeyStore.getInstance ("JKS"); KeyStore tks = KeyStore.getInstance ("JKS"); Ks.Load (nuevo FileInputStream ("e: //kclient.keystore"), client_key_store_password.toCarArray ()); tks.load (nuevo fileInputStream ("e: //tclient.keystore"), client_trust_key_store_password.toCarArray ()); kmf.init (ks, client_key_store_password.toCarArray ()); tmf.init (tks); ctx.init (kmf.getkeymanagers (), tmf.gettrustmanagers (), nulo); sslsocket = (sslsocket) ctx.getSocketFactory (). CreateSocket (default_host, default_port); } catch (Exception e) {System.out.println (e); }}}Lado del servidor:
ejemplos de paquete.ssl; import java.io.bufferedInputStream; import java.io.bufferedOutputPutStream; import java.io.fileInputStream; import java.io.inputStream; import java.io.outputputsream; import java.net.net.sockor; javax.net.ssl.sslcontext; import javax.net.ssl.sslserversocket; importar javax.net.ssl.trustmanagerfactory;/********************************************************************************************************************************************************************************************************************************************************************************A. ******************************************************************************************************************************************************************************************** ******************************************************************************************************************************************************************************************** ******************************************************************************************************************************************************************************************** ******************************************************************************************************************************************************************************************** ******************************************************************************************************************************************************************************************** ******************************************************************************************************************************************************************************************** **************************************************************************************************************************************************************************************************************************************************************************************************A. ServerKey -KeyStore Kserver.KeyStore -File Server.crt </li> * <li> 3) Agregue el certificado al almacén de claves confiable del cliente </li> * <li> KeyTool -Amport -alias Serverkey -file Server.crt -keystore tclient.keystore </li> * </ul> ***********************************************************************************************************************************************************-- ***********************************************************************************************************************************************************-- ***********************************************************************************************************************************************************-- ***********************************************************************************************************************************************************-- ***********************************************************************************************************************************************************-- ***********************************************************************************************************************************************************-- ***********************************************************************************************************************************************************-- **************************************************************************************************************************************************************Ía Servidor * */clase pública sslserver {private static final int default_port = 7777; static final static private String server_key_store_password = "123456"; static final static statal strever_trust_key_store_password = "123456"; SSLSERVERSOCKECH PRIVADO SERVERSOCKECKET; / ** * Iniciar el programa * * @param args */ public static void main (string [] args) {sslserver server = new sslServer (); servidor.init (); servidor.start (); }/** * <ul> * <li> Escuche el SSL Server Socket </li> * <li> Dado que este programa no es una demostración de la escucha de socket, simplemente adopta un formulario de un solo hilo y solo acepta los mensajes del cliente y devuelve el mensaje especificado del cliente </li> * * </ul> */public void start () {if (serversocket == null) {System.out.out.pprintln ("Errt); devolver; } while (true) {try {socket s = serversocket.accept (); InputStream Input = s.getInputStream (); OutputStream output = s.getOutputStream (); BufferedInputStream BIS = new BufferedInputStream (entrada); BufferedOutputStream Bos = new BufferedOutputStream (salida); byte [] buffer = new Byte [20]; bis.read (búfer); System.out.println (nueva cadena (búfer)); bos.write ("Server echo" .getBytes ()); bos.flush (); s.close (); } catch (Exception e) {System.out.println (e); }}}}/** * <ul> * <li> Los puntos clave de la conexión SSL: </li> * <li> Inicializar SSLServersocket </li> * <li> Importar el Servidor Private Key Keystore, e importar el Servidor Confiete Keystore (Certificado de Cliente) </li> * * </ul> */public void init () 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 (nuevo FileInputStream ("E: //kserver.keystore"), server_key_store_password.toCarArray ()); tks.load (nuevo fileInputStream ("e: //tserver.keystore"), server_trust_key_store_password.toCarArray ()); kmf.init (ks, server_key_store_password.toCarArray ()); tmf.init (tks); ctx.init (kmf.getkeymanagers (), tmf.gettrustmanagers (), nulo); Serversocket = (SSLSerVersocket) CTX.GetSerVersocketFactory (). CreateSerVersocket (default_port); ServerSocket.setNeedClientAuth (verdadero); } catch (Exception e) {E.PrintStackTrace (); }}}Para obtener más información sobre el contenido relacionado con Java, consulte los temas de este sitio: "Estructura de datos de Java y tutorial de algoritmo", "Resumen de las puntas de nodo de operación DOM de Java", "Resumen de los archivos de Java y consejos de operación de directorio" y "Resumen de los consejos de operación de caché de Java"
Espero que este artículo sea útil para la programación Java de todos.