22
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS SOCKETS SEGUROS CON SOCKETS SEGUROS CON SOCKETS SEGUROS CON SOCKETS SEGUROS CON LIBRERÍAS DE OPENSSL LIBRERÍAS DE OPENSSL

SOCKETS SEGUROS CONSOCKETS SEGUROS CON LIBRERÍAS …lmengual/documentacion/IP/SOCKETS_SSL.pdfEsta función se utiliza siempre en el servidor para cargar la clave privada del certificado

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: SOCKETS SEGUROS CONSOCKETS SEGUROS CON LIBRERÍAS …lmengual/documentacion/IP/SOCKETS_SSL.pdfEsta función se utiliza siempre en el servidor para cargar la clave privada del certificado

INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS

SOCKETS SEGUROS CONSOCKETS SEGUROS CONSOCKETS SEGUROS CON SOCKETS SEGUROS CON LIBRERÍAS DE OPENSSLLIBRERÍAS DE OPENSSL

Page 2: SOCKETS SEGUROS CONSOCKETS SEGUROS CON LIBRERÍAS …lmengual/documentacion/IP/SOCKETS_SSL.pdfEsta función se utiliza siempre en el servidor para cargar la clave privada del certificado

INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS

PROTOCOLO DE SEGURIDAD SSLPROTOCOLO DE SEGURIDAD SSLPROTOCOLO DE SEGURIDAD SSLPROTOCOLO DE SEGURIDAD SSL

FASE 1

FASE 2

FASE 3

FASE 4

Page 3: SOCKETS SEGUROS CONSOCKETS SEGUROS CON LIBRERÍAS …lmengual/documentacion/IP/SOCKETS_SSL.pdfEsta función se utiliza siempre en el servidor para cargar la clave privada del certificado

INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS

Implementación del Protocolo Implementación del Protocolo SSL en SSL en OpenSSLOpenSSL

Se utilizan los objetos “SSL_CTX” y “SSL” – SSL_CTX (Objeto de Contexto): Se utiliza para configurar los

parámetros del protocoloparámetros del protocolo– SSL: El objeto SSL se asocia al objeto de contexto y hereda

sus parámetros– El objeto SSL se asocia también a un socket TCP– El objeto SSL se asocia también a un socket TCP

convencional

Para cargar los certificados de clave pública y l i d tili l f iclaves privadas se utilizan las funciones:– SSL_CTX_use_certificate() y SSL_CTX_use_PrivateKey()

Para verificar el certificado del servidor (u Para verificar el certificado del servidor (u opcionalmente el del cliente) se usan las clases:

– SSL_CTX_set_verify() y SSL_CTX_load_verify_locations();

Page 4: SOCKETS SEGUROS CONSOCKETS SEGUROS CON LIBRERÍAS …lmengual/documentacion/IP/SOCKETS_SSL.pdfEsta función se utiliza siempre en el servidor para cargar la clave privada del certificado

INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS

Conexión SSL Variables y Funciones OpenSSLVariables y Funciones OpenSSL

#include <openssl/ssl.h>

Variable de Contexto SSL_CTX * m_ctx

Se inicializa la variable de contextoSe inicializa la variable de contextoSSL_CTX *SSL_CTX_new(SSL_METHOD *meth);

Esta función verifica el certificado recibido de la otra entidadvoid SSL CTX set verify(SSL CTX *ctx,int mode, int (*callback)(int, X509 STORE CTX *));void SSL_CTX_set_verify(SSL_CTX ctx,int mode, int ( callback)(int, X509_STORE_CTX ));

Esta función carga los certificados que la entidad utiliza para verificar el certificado recibido de la otra parteint SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *Cafile, const char *CApath);

S bj t SSL i i i li l l d l i bl d t tSe crea un objeto SSL que se inicializa con los valores de la variable de contextoSSL * SSL_new(SSL_CTX *ctx);

Se asocia un socket tradicional al objeto SSL. El protocolo SSL se implementará en el socketint SSL set fd(SSL *s int socket);int SSL_set_fd(SSL s, int socket);

Se inicia el protocolo SSL del lado del clienteint SSL_connect(SSL *ssl);

Se envían datos por socket seguroint SSL_write(SSL *ssl,const void *buf,int num);Se reciben datos por el socket seguroint SSL_read(SSL *ssl,void *buf,int num);

Page 5: SOCKETS SEGUROS CONSOCKETS SEGUROS CON LIBRERÍAS …lmengual/documentacion/IP/SOCKETS_SSL.pdfEsta función se utiliza siempre en el servidor para cargar la clave privada del certificado

INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS

Conexión SSL Variables y Funciones OpenSSLVariables y Funciones OpenSSL

#include <openssl/ssl.h>

Esta función se utiliza siempre en el servidor para cargar el certificado del protocolo SSL. Opcionalmente lad tili l li t t ti f t l idpuede utilizar el cliente para autenticarse frente al servidor

SSL_CTX_use_certificate(m_ctx, cert)

Esta función se utiliza siempre en el servidor para cargar la clave privada del certificado del protocolo SSL. Opcionalmente la puede utilizar el cliente para cargar la clave privada del certificado que presenta al servidorp p p g p q pcuando hay autenticación del cliente.SSL_CTX_use_PrivateKey(m_ctx, pkey)

Esta función la utiliza la entidad servidor para iniciar el protocolo SSL si todo ha ido bien (se han verificado losEsta función la utiliza la entidad servidor para iniciar el protocolo SSL si todo ha ido bien (se han verificado los certificados y se han recibido correctamente los mensajes del protocolo) se pueden intercambiardatos de forma seguraif (SSL_accept(ssl) < 0) { .... }

Esta función permite la obtención del certificado de la otra entidad a partir de la conexión SSLX509 * SSL_get_peer_certificate(const SSL *s);

Page 6: SOCKETS SEGUROS CONSOCKETS SEGUROS CON LIBRERÍAS …lmengual/documentacion/IP/SOCKETS_SSL.pdfEsta función se utiliza siempre en el servidor para cargar la clave privada del certificado

INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS

Certificados Necesarios para una Conexión Certificados Necesarios para una Conexión SSL sin Autenticación de ClienteSSL sin Autenticación de Cliente

openssl>

(Generación de un par clave pública‐privada)l i dgenrsa ‐out ClavePrivada.pem 4096

Generación de un Certificado Autofirmado)509 d 3650 k Cl P i d t C tifi dreq ‐new ‐x509 ‐days 3650 ‐key ClavePrivada.pem ‐out Certificado.pem

(Creamos un certificado en formato p12, con la clave privada incorporada protegida con un clave cifrada con 3des (“ppppp)protegida con un clave cifrada con 3des ( ppppp) pkcs12 ‐export ‐in Certificado.pem ‐inkey ClavePrivada.pem ‐out cert.p12

Ficheros Obtenidos: •cert.p12: Certificado de Clave pública+Clave privada•Certificado.pem: Certificado de Clave PúblicaCertificado.pem: Certificado de Clave Pública•ClavePrivada.pem: Clave privada

Page 7: SOCKETS SEGUROS CONSOCKETS SEGUROS CON LIBRERÍAS …lmengual/documentacion/IP/SOCKETS_SSL.pdfEsta función se utiliza siempre en el servidor para cargar la clave privada del certificado

INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS

Conexión SSL sin Autenticación de ClienteCertificado Servidor AutofirmadoCertificado Servidor Autofirmado

Conexión SSLCliente Servidor

CAFILE CERTIFICADO SERVIDOR“Certificado.pem” “cert.p12”

Certificado Servidor

#define CAFILE "Certificado.pemSSL_CTX * m_ctx=SSL_CTX_new(SSLv23_server_method());

Clave Privada + Certificado Servidor

SSL_CTX * m_ctx = SSL_CTX_new(SSLv23_method());

SSL_CTX_set_verify(m_ctx,SSL_VERIFY_PEER|SSL_VERIFY_FAIL IF NO PEER CERT NULL);

if (!GetCertAndPrivateKey(&cert, &pkey))SSL_CTX_use_certificate(m_ctx, cert) SSL_CTX_use_PrivateKey(m_ctx, pkey)

AIL_IF_NO_PEER_CERT, NULL);SSL_CTX_load_verify_locations(m_ctx, CAFILE, CADIR)

SSL * m_ssl=SSL_new(m_ctx);

s=connectTCP(host pto ser ice)

SSL *ssl = SSL_new(m_ctx);

sock = passiveTCP(service,5);*pssock=accept(sock,(&fsin,(int FAR*)&alen);

s=connectTCP(host,pto_service);

SSL_set_fd(m_ssl,s);if (SSL_connect(m_ssl) == -1) {}SSL_write(m_ssl,,)/ SSL_read(m_ssl,,);

SSL_set_fd(ssl,*pssock);

if (SSL_accept(ssl) < 0) { .... }SSL_read(ssl,,)/SSL_write(ssl,,)

Page 8: SOCKETS SEGUROS CONSOCKETS SEGUROS CON LIBRERÍAS …lmengual/documentacion/IP/SOCKETS_SSL.pdfEsta función se utiliza siempre en el servidor para cargar la clave privada del certificado

INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS

Conexión SSL con Autenticación de ClienteC tifi d Cli t /S id A t fi d

ClienteConexión SSL

Certificado Cliente/Servidor Autofirmado

ServidorCliente Servidor

“cert.p12”“Certificado.pem”“cert.p12”“Certificado.pem”

CERT CLIENTE= CERT SERVIDOR

# d fi CAFILE "C tifi d

CAFILE

Certificado Cliente

CERTIFICADO SERVIDOR

Clave Privada + Cert ServidorCertificado Servidor

CERTIFICADO CLIENTE

Clave Privada + Cert Cliente

CAFILE

#define CAFILE "Certificado.pem

SSL_CTX * m_ctx = SSL_CTX_new(SSLv23_method());

if (!GetCertAndPri ateKe (&cert &pke ))

# define CAFILE "Certificado.pemSSL_CTX * m_ctx=SSL_CTX_new(SSLv23_server_method());

if (!GetCertAndPrivateKey(&cert, &pkey))SSL_CTX_use_certificate(m_ctx, cert)

if (!GetCertAndPrivateKey(&cert, &pkey))SSL_CTX_use_certificate(m_ctx, cert) SSL_CTX_use_PrivateKey(m_ctx, pkey)

SSL_CTX_set_verify(m_ctx, ……);

( )SSL_CTX_use_PrivateKey(m_ctx, pkey)

SSL_CTX_set_verify(m_ctx,SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL);SSL CTX load verify locations(m ctx CAFILE CADIR)

SSL_CTX_load_verify_locations(m_ctx, CAFILE, CADIR)

SSL * m_ssl=SSL_new(m_ctx);

s=connectTCP(host,pto service);

SSL_CTX_load_verify_locations(m_ctx, CAFILE, CADIR)

SSL *ssl = SSL_new(m_ctx);

sock = passiveTCP(service,5);* k t( k (&f i (i t FAR*)& l )s connectTCP(host,pto_service);

SSL_set_fd(m_ssl,s);if (SSL_connect(m_ssl) == -1) {}SSL_write(m_ssl,,)/ SSL_read(m_ssl,,);

*pssock=accept(sock,(&fsin,(int FAR*)&alen);

SSL_set_fd(ssl,*pssock);if (SSL_accept(ssl) < 0) { .... }SSL_read(ssl,,)/SSL_write(ssl,,)

Page 9: SOCKETS SEGUROS CONSOCKETS SEGUROS CON LIBRERÍAS …lmengual/documentacion/IP/SOCKETS_SSL.pdfEsta función se utiliza siempre en el servidor para cargar la clave privada del certificado

INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS

SOCKETS SEGUROS EN JAVASOCKETS SEGUROS EN JAVASOCKETS SEGUROS EN JAVASOCKETS SEGUROS EN JAVA

Page 10: SOCKETS SEGUROS CONSOCKETS SEGUROS CON LIBRERÍAS …lmengual/documentacion/IP/SOCKETS_SSL.pdfEsta función se utiliza siempre en el servidor para cargar la clave privada del certificado

INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS

Conexión SSL Conexión SSL C tifi d S idC tifi d S id A t fi dA t fi d (I)(I)Certificado Servidor Certificado Servidor AutofirmadoAutofirmado (I)(I)

Cliente ServidorConexión SSL

Truststore file Keystore File

Certificado Servidor(TrustCertEntry)

Clave Privada + Certificado Servidor(Key Entry)

“AlmacenTrust” “AlmacenSR”

( y) ( y y)

System.setProperty("javax.net.ssl.trustStore","AlmacenTrust");

SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLS k tF t tD f lt()

System.setProperty("javax.net.ssl.keyStore","AlmacenSR");System.setProperty("javax.net.ssl.keyStorePassword","oooooo");

SSLS S k tF t l k tf tSSLSocketFactory.getDefault();

SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(dirip, ptoint);

SSLServerSocketFactory sslserversocketfactory =(SSLServerSocketFactory) SSLServerSocketFactory.getDefault();

SSLServerSocket sslserversocket =(SSLServerSocket) sslserversocketfactory.createServerSocket(9999);

SLSocket sslsocket = (SSLSocket) sslserversocket.accept();

Page 11: SOCKETS SEGUROS CONSOCKETS SEGUROS CON LIBRERÍAS …lmengual/documentacion/IP/SOCKETS_SSL.pdfEsta función se utiliza siempre en el servidor para cargar la clave privada del certificado

INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS

Conexión SSL Conexión SSL C tifi d S idC tifi d S id A t fi dA t fi d (II)(II)Certificado Servidor Certificado Servidor AutofirmadoAutofirmado (II)(II)

1. Generamos el par de claves pública y secreta y se almacenan en el almacen AlmacenSR

keytool -genkey -alias CertificadoAutofirmado -keyalg RSA -validity "100”-keystore AlmacenSR -keypass oooooo -storepass oooooo

keytool -list -v -keystore AlmacenSR

2 Generamos en un fichero .cer el certificado de clave publica

keytool -export -alias CertificadoAutofirmado -keystore AlmacenSR -rfc -fileCertAutofirmado.cer

Page 12: SOCKETS SEGUROS CONSOCKETS SEGUROS CON LIBRERÍAS …lmengual/documentacion/IP/SOCKETS_SSL.pdfEsta función se utiliza siempre en el servidor para cargar la clave privada del certificado

INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS

Conexión SSL Conexión SSL C tifi d S idC tifi d S id A t fi dA t fi d (III)(III)Certificado Servidor Certificado Servidor AutofirmadoAutofirmado (III)(III)

3. Metemos el Certificado Autofirmado en un almacén para que lo use el Cliente

keytool -import -alias CertificadoAutofirmado -file CertAutofirmado.cerkeytool import alias CertificadoAutofirmado file CertAutofirmado.cer -keystore AlmacenTrust

keytool -list -v -keystore AlmacenTrusty y

Page 13: SOCKETS SEGUROS CONSOCKETS SEGUROS CON LIBRERÍAS …lmengual/documentacion/IP/SOCKETS_SSL.pdfEsta función se utiliza siempre en el servidor para cargar la clave privada del certificado

INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS

Conexión SSL Conexión SSL Certificado Servidor Certificado Servidor AutofirmadoAutofirmado (IV)(IV)

>keytool -genkey –alias CertificadoAutofirmado -keyalg RSA -validity "100" -keystore AlmacenSR-keypass oooooo -storepass oooooo

+Cuales son su nombre y su apellido?[Unknown]: alumno1

+Cual es el nombre de su unidad de organizacion?[Unknown]: fim[ ]

+Cual es el nombre de su organizacion?[Unknown]: upm

+Cual es el nombre de su ciudad o localidad?[Unknown]: boa[ ]

+Cual es el nombre de su estado o provincia?[Unknown]: ma

+Cual es el c¾digo de paÝs de dos letras de la unidad?[Unknown]: es

+Es correcto CN=alumno1, OU=fim, O=upm, L=boa, ST=ma, C=es?[no]: y

Page 14: SOCKETS SEGUROS CONSOCKETS SEGUROS CON LIBRERÍAS …lmengual/documentacion/IP/SOCKETS_SSL.pdfEsta función se utiliza siempre en el servidor para cargar la clave privada del certificado

INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS

Conexión SSL Conexión SSL Certificado Servidor Autofirmado (V)Certificado Servidor Autofirmado (V)

>keytool -list -v -keystore AlmacenSR

Escriba la contrase±a del almacÚn de claves: oooooo

ÚTipo de almacÚn de claves: jksProveedor de almacÚn de claves: SUN

Su almacÚn de claves contiene entrada 1

Nombre de alias: certificadoautofirmadoFecha de creaci¾n: 22-sep-2009Tipo de entrada: keyEntryLongitud de la cadena de certificado: 1Certificado[1]:Propietario: CN=alumno1, OU=fim, O=upm, L=boa, ST=ma, C=esEmisor: CN=alumno1, OU=fim, O=upm, L=boa, ST=ma, C=esN·mero de serie: 4ab8a8c8Vßlido desde: Tue Sep 22 12:36:56 CEST 2009 hasta: Thu Dec 31 11:36:56 CET 2009Huellas digitales del certificado:

MD5: BC:F1:49:9A:02:5E:2E:91:27:C4:F9:FA:E3:3B:35:0ASHA1: 45:A7:23:A0:BB:60:FE:7A:FA:C9:6F:B3:8E:CF:2E:D8:F6:3A:02:1E

*******************************************

Page 15: SOCKETS SEGUROS CONSOCKETS SEGUROS CON LIBRERÍAS …lmengual/documentacion/IP/SOCKETS_SSL.pdfEsta función se utiliza siempre en el servidor para cargar la clave privada del certificado

INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS

Conexión SSL Conexión SSL C tifi d S idC tifi d S id A t fi dA t fi d (VI)(VI)Certificado Servidor Certificado Servidor AutofirmadoAutofirmado (VI)(VI)

>keytool -export –alias CertificadoAutofirmado -keystore AlmacenSR -rfc -file CertAutofirmado.cer

Escriba la contrase±a del almacÚn de claves: ooooooEscriba la contrase±a del almacÚn de claves: ooooooCertificado almacenado en el archivo <CertAutofirmado.cer>

>keytool -import –alias CertificadoAutofirmado -file CertAutofirmado.cer -keystore AlmacenTrustEscriba la contrase±a del almacÚn de claves: ooooooEscriba la contrase±a del almacÚn de claves: ooooooPropietario: CN=alumno1, OU=fim, O=upm, L=boa, ST=ma, C=esEmisor: CN=alumno1, OU=fim, O=upm, L=boa, ST=ma, C=esN·mero de serie: 4ab8a8c8Vßlido desde: Tue Sep 22 12:36:56 CEST 2009 hasta: Thu Dec 31 11:36:56 CET 2009Vßlido desde: Tue Sep 22 12:36:56 CEST 2009 hasta: Thu Dec 31 11:36:56 CET 2009Huellas digitales del certificado:

MD5: BC:F1:49:9A:02:5E:2E:91:27:C4:F9:FA:E3:3B:35:0ASHA1: 45:A7:23:A0:BB:60:FE:7A:FA:C9:6F:B3:8E:CF:2E:D8:F6:3A:02:1E

+Confiar en este certificado? [no]: yConfiar en este certificado? [no]: ySe ha a±adido el certificado al almacÚn de claves

Page 16: SOCKETS SEGUROS CONSOCKETS SEGUROS CON LIBRERÍAS …lmengual/documentacion/IP/SOCKETS_SSL.pdfEsta función se utiliza siempre en el servidor para cargar la clave privada del certificado

INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS

Conexión SSL Conexión SSL Certificado Servidor Certificado Servidor AutofirmadoAutofirmado (VII)(VII)

>keytool -list -v -keystore AlmacenTrust

Escriba la contrase±a del almacÚn de claves: oooooo

Tipo de almacÚn de claves: jksProveedor de almacÚn de claves: SUN

Su almacÚn de claves contiene entrada 1Su almacÚn de claves contiene entrada 1

Nombre de alias: certificadoautofirmadoFecha de creaci¾n: 22-sep-2009Tipo de entrada: trustedCertEntryTipo de entrada: trustedCertEntry

Propietario: CN=alumno1, OU=fim, O=upm, L=boa, ST=ma, C=esEmisor: CN=alumno1, OU=fim, O=upm, L=boa, ST=ma, C=esN·mero de serie: 4ab8a8c8N·mero de serie: 4ab8a8c8Vßlido desde: Tue Sep 22 12:36:56 CEST 2009 hasta: Thu Dec 31 11:36:56 CET 2009Huellas digitales del certificado:

MD5: BC:F1:49:9A:02:5E:2E:91:27:C4:F9:FA:E3:3B:35:0ASHA1: 45:A7:23:A0:BB:60:FE:7A:FA:C9:6F:B3:8E:CF:2E:D8:F6:3A:02:1ESHA1: 45:A7:23:A0:BB:60:FE:7A:FA:C9:6F:B3:8E:CF:2E:D8:F6:3A:02:1E

Page 17: SOCKETS SEGUROS CONSOCKETS SEGUROS CON LIBRERÍAS …lmengual/documentacion/IP/SOCKETS_SSL.pdfEsta función se utiliza siempre en el servidor para cargar la clave privada del certificado

INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS

Conexión SSL Conexión SSL Certificado ServidorCertificado Servidor AutofirmadoAutofirmado (VIII)(VIII)

import java.net.*;

Certificado Servidor Certificado Servidor AutofirmadoAutofirmado (VIII)(VIII)Código clienteCódigo cliente

import java.io.*;import javax.net.ssl.*;import java.util.*;public class EchoClient {{

public static voidmain(String[] arstring)

{try {

String dirip;String dirip;System.setProperty("javax.net.ssl.trustStore","AlmacenTrust");

InputStreamReader Flujo = new InputStreamReader(System.in);BufferedReader teclado = new BufferedReader(Flujo);S t t i t("Di i IP " )System.out.print("Direccion IP: " );dirip=teclado.readLine();

System.out.print("Puerto:" );Scanner sc =new Scanner(System.in);( y );String pto= sc.nextLine();int ptoint= Integer.parseInt(pto);

SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();SSLSocket sslsocket = (SSLSocket) sslsocketfactory createSocket(dirip ptoint);SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(dirip, ptoint);

Page 18: SOCKETS SEGUROS CONSOCKETS SEGUROS CON LIBRERÍAS …lmengual/documentacion/IP/SOCKETS_SSL.pdfEsta función se utiliza siempre en el servidor para cargar la clave privada del certificado

INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS

Conexión SSL Conexión SSL Certificado ServidorCertificado Servidor AutofirmadoAutofirmado (IX)(IX)Certificado Servidor Certificado Servidor AutofirmadoAutofirmado (IX)(IX)

Código clienteCódigo cliente

InputStream inputstream = System.in;InputStreamReader inputstreamreader = new InputStreamReader(inputstream);BufferedReader bufferedreader = new BufferedReader(inputstreamreader);

OutputStream outputstream = sslsocket.getOutputStream();p p g p ();OutputStreamWriter outputstreamwriter = new OutputStreamWriter(outputstream);BufferedWriter bufferedwriter = new BufferedWriter(outputstreamwriter);String string = null;

InputStream inputstream2 = sslsocket getInputStream();InputStream inputstream2 = sslsocket.getInputStream();InputStreamReader inputstreamreader2 = new InputStreamReader(inputstream2);BufferedReader bufferedreader2 = new BufferedReader(inputstreamreader2);

while (!(string = bufferedreader.readLine()).equals("")) {b ff d it it ( t i '\ ')bufferedwriter.write(string + '\n');bufferedwriter.flush();System.out.println(bufferedreader2.readLine() );

}

} catch (Exception exception)

{exception.printStackTrace();

}}}//main

}//public

Page 19: SOCKETS SEGUROS CONSOCKETS SEGUROS CON LIBRERÍAS …lmengual/documentacion/IP/SOCKETS_SSL.pdfEsta función se utiliza siempre en el servidor para cargar la clave privada del certificado

INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS

Conexión SSL Conexión SSL Certificado ServidorCertificado Servidor AutofirmadoAutofirmado (X)(X)Certificado Servidor Certificado Servidor AutofirmadoAutofirmado (X)(X)

Código ServidorCódigo Servidor

import java.net.*; // Para ServerSocketimport java.util.*;import javax.net.ssl.*; // Para SSLSocketsimport java.io.*; //entrada/salida

public class EchoServer {public static void

main(String[] arstring){

PrintStream p;PrintStream p;try {

System.setProperty("javax.net.ssl.keyStore","AlmacenSR");System.setProperty("javax.net.ssl.keyStorePassword","oooooo");

SSLS S k tF t l k tf t (SSLS S k tF t )SSLServerSocketFactory sslserversocketfactory =(SSLServerSocketFactory) SSLServerSocketFactory.getDefault();

SSLServerSocket sslserversocket =(SSLServerSocket) sslserversocketfactory.createServerSocket(9999);

SSLSocket sslsocket = (SSLSocket) sslserversocket.accept();( ) p ();

p=new PrintStream(sslsocket.getOutputStream());InputStream inputstream = sslsocket.getInputStream();InputStreamReader inputstreamreader = new InputStreamReader(inputstream);BufferedReader bufferedreader = new BufferedReader(inputstreamreader);BufferedReader bufferedreader = new BufferedReader(inputstreamreader);String string = null;

SSLSession sesion = sslsocket.getSession();System.out.println("Host: "+sesion.getPeerHost());

Page 20: SOCKETS SEGUROS CONSOCKETS SEGUROS CON LIBRERÍAS …lmengual/documentacion/IP/SOCKETS_SSL.pdfEsta función se utiliza siempre en el servidor para cargar la clave privada del certificado

INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS

Conexión SSL Conexión SSL Certificado ServidorCertificado Servidor AutofirmadoAutofirmado (XI)(XI)Certificado Servidor Certificado Servidor AutofirmadoAutofirmado (XI)(XI)

Código ServidorCódigo Servidor

while ((string = bufferedreader.readLine()) != null) {System.out.println(string);System.out.flush();Thread.currentThread().sleep(1000);Thread.currentThread().sleep(1000);p.println(string);

}

}

catch (Exception exception){

exception.printStackTrace();}

}//main}//public

Page 21: SOCKETS SEGUROS CONSOCKETS SEGUROS CON LIBRERÍAS …lmengual/documentacion/IP/SOCKETS_SSL.pdfEsta función se utiliza siempre en el servidor para cargar la clave privada del certificado

INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS

Conexión SSL con Autenticación Cliente (I) Conexión SSL con Autenticación Cliente (I) Certificado Servidor/ClienteCertificado Servidor/Cliente autofirmadoautofirmadoCertificado Servidor/Cliente Certificado Servidor/Cliente autofirmadoautofirmado

Conexión SSLCliente Servidor

“AlmacenTrust” “AlmacenSR”“AlmacenTrust”“AlmacenCL”

“AlmacenCL” = “AlmacenSR”

Truststore file Cliente

Certificado Autofirmado

Keystore File Cliente

Clave Priv + Cert

Truststore file ServidorKeystore File Servidor

Clave Priv + Cert

AlmacenTrust AlmacenSR

Certificado Autofirmado

AlmacenTrustAlmacenCL

System.setProperty("javax.net.ssl.trustStore","AlmacenTrust"); System.setProperty("javax.net.ssl.keyStore","AlmacenSR");S t tP t ("j t l k St P d" ” ")

Certificado Autofirmado(TrustCertEntry)

Clave Priv + Cert Autofirmado (Key Entry)

Clave Priv Cert Autofirmado (Key Entry)

Certificado Autofirmado(TrustCertEntry)

System.setProperty("javax.net.ssl.keyStore","AlmacenCL");System.setProperty("javax.net.ssl.keyStorePassword",” oooooo");

SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();

System.setProperty("javax.net.ssl.keyStorePassword",” ooooooo");System.setProperty("javax.net.ssl.trustStore","AlmacenTrust");

SSLServerSocketFactory sslserversocketfactory =(SSLServerSocketFactory) SSLServerSocketFactory.getDefault();

SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(dirip, ptoint);

SSLServerSocket sslserversocket =(SSLServerSocket) sslserversocketfactory.createServerSocket(9999);sslserversocket.setNeedClientAuth(true);

SLSocket sslsocket = (SSLSocket) sslserversocket accept();SLSocket sslsocket = (SSLSocket) sslserversocket.accept();

Page 22: SOCKETS SEGUROS CONSOCKETS SEGUROS CON LIBRERÍAS …lmengual/documentacion/IP/SOCKETS_SSL.pdfEsta función se utiliza siempre en el servidor para cargar la clave privada del certificado

INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS

Conexión SSL con Autenticación Cliente (II) Conexión SSL con Autenticación Cliente (II) Certificado Servidor/ClienteCertificado Servidor/Cliente autofirmadoautofirmado

import java.security.cert.X509Certificate; // para Manejo del Certificados

Certificado Servidor/Cliente Certificado Servidor/Cliente autofirmadoautofirmado

// OBTENCION DE LA SESION Y DEL CERTIFICADO RECIBIDO DEL SERVIDOR Y EN EL CLIENTE

SSLSession sesion = sslsocket.getSession();

System.out.println("Host: "+sesion.getPeerHost());

X509Certificate certificate = (X509Certificate)sesion.getPeerCertificates()[0]

System.out.println("Propietario: "+certificate.getSubjectDN());System.out.println("Emisor: "+certificate.getIssuerDN());System.out.println("Numero Serie: "+certificate.getSerialNumber() );S t t i tl ("t t i " tifi t t St i () )System.out.println("to string: "+certificate.toString() );

byte[] buf = certificate.getEncoded();Fil O t tSt Fil O t tSt (" ")FileOutputStream os = new FileOutputStream("server.cer");ó FileOutputStream os = new FileOutputStream(“cliente.cer");

os.write(buf);l ()os.close();