Seguridad Informtica - PowerPoint PPT Presentation

1 / 74
About This Presentation
Title:

Seguridad Informtica

Description:

Cuando se crea la conexi n, el programa cliente tiene un socket y ... Cada hilo es un objeto de la clase ConexionEco, hija de Thread. Comunicaci n con sockets ... – PowerPoint PPT presentation

Number of Views:171
Avg rating:3.0/5.0
Slides: 75
Provided by: mic4152
Category:

less

Transcript and Presenter's Notes

Title: Seguridad Informtica


1
Seguridad Informática
Comunicaciones Seguras Java SE Security Micael.Ga
llego_at_urjc.es
Seguridad en Java
2
Índice
  • Introducción
  • Comunicación con sockets
  • SSL
  • SSL en Java
  • Verificación del Servidor
  • Aceptar certificado no fiable
  • HTTPS

3
Introducción
  • Para realizar comunicaciones seguras en Internet
    lo más habitual es usar
  • Secure Sockets Layer (SSL)
  • Es un protocolo sobre TCP
  • Proporciona cifrado y autenticación
  • Hipertext Transfer Protocol Secure (HTTPS)
  • Es una versión de HTTP que se basa en SSL
  • Proporciona aspectos de seguridad en HTTP
  • Usado por las webs para su identificación y para
    la confidencialidad de la información que envían
    los usuarios

4
Índice
  • Introducción
  • Comunicación con sockets
  • SSL
  • SSL en Java
  • Verificación del Servidor
  • Aceptar certificado no fiable
  • HTTPS

5
Comunicación con sockets
  • Introducción
  • Qué es un socket?
  • Sockets en Java
  • Crear un cliente con sockets
  • Crear un servidor con sockets
  • Multitarea con sockets
  • Creación de sockets con una factoría

6
Comunicación con sockets Introducción
  • El protocolo TCP/IP proporciona una comunicación
    fiable punto a punto
  • Para comunicarse sobre TCP, un programa cliente y
    un programa servidor deben establecer una
    conexión entre sí
  • Cada programa (cliente y servidor) se enlaza a
    un socket local, que será usado para enviar y
    recibir información a través de la conexión

7
Comunicación con sockets Introducción
  • Existen formas de crear aplicaciones para
    Internet (o una intranet) de alto nivel.
    Aplicaciones Web, Servicios Web, etc
  • Algunas veces es necesario establecer
    comunicaciones de bajo nivel entre aplicaciones.
    En el desarrollo de aplicaciones
    cliente-servidor.

8
Comunicación con sockets Introducción
  • En las aplicaciones cliente-servidor
  • El servidor proporciona un servicio (información
    meteorológica, consultas a una base de datos)
  • El cliente usa el servicio proporcionado por el
    servidor (mostrando la información de forma
    gráfica, enviando información nueva)
  • La comunicación debe ser fiable
  • Que no se pierda información por el camino
  • Que llegue en el orden que se envió

9
Comunicación con sockets Introducción
  • El protocolo TCP/IP proporciona una comunicación
    fiable punto a punto.
  • Para comunicarse sobre TCP, un programa cliente y
    un programa servidor deben establecer una
    conexión entre sí.
  • Cada programa (cliente y servidor) se enlaza a un
    socket, que será usado para enviar y recibir
    información a través de la conexión.

10
Comunicación con sockets
  • Introducción
  • Qué es un socket?
  • Sockets en Java
  • Cliente con sockets
  • Servidor con sockets
  • Multitarea con sockets
  • Creación de sockets con una factoría

11
Comunicación con sockets Qué es un Socket?
  • Un ordenador conectado a Internet (host) tiene
    una o varias direcciones IP. Habitualmente solo
    tiene una dirección IP
  • Por cada dirección IP tiene puertos (del 1 al
    65535)
  • Un programa servidor se ejecuta esperando
    conexiones de los clientes en un determinado
    puerto y dirección IP del host

12
Comunicación con sockets Qué es un socket?
  • El programa cliente conoce el nombre del host y
    el puerto en el que está escuchando el programa
    servidor
  • Realiza una petición de conexión a ese host y
    puerto

13
Comunicación con sockets Qué es un socket?
  • Si todo va bien, se establece una comunicación
    entre un puerto del cliente (elegido al azar o
    establecido por el programador) y el puerto del
    servidor
  • El servidor puede atender a nuevos clientes en el
    puerto de escucha

14
Comunicación con sockets Qué es un socket?
  • Cuando se crea la conexión, el programa cliente
    tiene un socket y el programa servidor tiene otro
    socket (ServerSocket)
  • Usando los sockets, tanto el servidor como el
    cliente pueden enviar y recibir información de
    forma similar
  • Un socket es cada uno de los extremos de una
    comunicación bidireccional entre dos programas
  • Cada socket está asociado a un puerto y dirección
    IP de cada máquina

15
Comunicación con sockets
  • Introducción
  • Qué es un socket?
  • Sockets en Java
  • Cliente con sockets
  • Servidor con sockets
  • Multitarea con sockets
  • Creación de sockets con una factoría

16
Comunicación con sockets Sockets en Java
  • El paquete java.net alberga todas las clases e
    interfaces relacionados con las comunicaciones
  • La clase ServerSocket se usa por los servidores
    para esperar nuevas conexiones
  • La clase Socket se usa cuando se ha creado la
    conexión para enviar y recibir la información
    tanto por el cliente como por el servidor

17
Comunicación con sockets Comunicación con sockets
  • Introducción
  • Qué es un socket?
  • Sockets en Java
  • Cliente con sockets
  • Servidor con sockets
  • Multitarea con sockets
  • Creación de sockets con una factoría

18
Comunicación con sockets Cliente con sockets
  • Clase java.net.Socket
  • Socket(String host, int port)
  • Crea un socket y le conecta al host y puerto
    especificado
  • InputStream getInputStream()
  • Devuelve el InputStream desde el que se puede
    leer la información enviada por el otro extremo
  • OutputStream getOutputStream()
  • Devuelve el OutputStream donde se puede escribir
    la información al otro extremo
  • void close()
  • Cierra la conexión

19
Comunicación con sockets Cliente con sockets
  • Ejemplo de cliente

try String host ... int port ... Socket
socket new Socket(host,port) OutputStream out
socket.getOutputStream() InputStream in
socket.getInputStream() // Envío y recepción
de información out.close() in.close() socket
.close() catch (UnknownHostException e)
System.err.println("Host desconocido")
catch (IOException e) System.err.println("Error
I/O")
20
Comunicación con sockets Cliente con sockets
  • Ejemplo Cliente de eco
  • Lee una línea de text por teclado y la envía a un
    servidor de eco
  • El servidor de eco responde con la misma línea
    enviada se muestra por pantalla
  • Para trabajar con los distintos flujos se usan
    las clases PrintWriter y BufferedReader

21
Comunicación con sockets Cliente con sockets
BufferedReader teclado new
BufferedReader(new InputStreamReader(System.in))
Socket socket new Socket("127.0.0.1",
7) BufferedReader leerServidor new
BufferedReader(new InputStreamReader(socket.getInp
utStream())) PrintWriter escribirServidor
new PrintWriter(socket.getOutputStream(),true) f
or(int i0 ilt3 i) String linea
teclado.readLine() escribirServidor.println(li
nea) String lineaRecibida
leerServidor.readLine() System.out.println("Ec
o "lineaRecibida) leerServidor.close() escr
ibirServidor.close() socket.close()
22
Comunicación con sockets
  • Introducción
  • Qué es un socket?
  • Sockets en Java
  • Cliente con sockets
  • Servidor con sockets
  • Multitarea con sockets
  • Creación de sockets con una factoría

23
Comunicación con sockets Servidor con sockets
  • Clase java.net.ServerSocket
  • ServerSocket(int port)
  • Crea un ServerSocket enlazado en el puerto
    especificado. No espera ninguna conexión.
  • Socket accept()
  • Bloquea esperando la llegada de una nueva
    conexión. Si llega una conexión, se devuelve un
    Socket para establecer la comunicación
  • Se puede volver a llamar accept() para esperar
    nuevas conexiones

24
Comunicación con sockets Servidor con sockets
  • Ejemplo de servidor

try int port ... ServerSocket serverSocket
new ServerSocket(port) while (true)
Socket socket serverSocket.accept() Inp
utStream is socket.getInputStream() OutputStr
eam os socket.getOutputStream() //Envio y
recepción de información is.close() os.c
lose() socket.close() catch (IOException
e) System.err.println("Error I/O")
25
Comunicación con sockets Servidor con sockets
  • Ejemplo Servidor de eco
  • Lo único que debe hacer es leer bytes del
    InputStream del socket y escribirlos en el
    OutputStream
  • El servidor finaliza su ejecución cuando se
    detiene su ejecución desde el sistema operativo

26
Comunicación con sockets Servidor con sockets
ServerSocket serverSocket new
ServerSocket(7) while (true) Socket socket
serverSocket.accept() try
InputStream is socket.getInputStream()
OutputStream os socket.getOutputStream()
byte bytes new byte512 int
leidos while ((leidos is.read(bytes)) !
-1) os.write(bytes, 0, leidos)
is.close() os.close()
socket.close() catch (IOException e)
System.out.println("Fallo en la conexión.")

27
Comunicación con sockets
  • Introducción
  • Qué es un socket?
  • Sockets en Java
  • Cliente con sockets
  • Servidor con sockets
  • Multitarea con sockets
  • Creación de sockets con una factoría

28
Comunicación con sockets Multitarea con sockets
  • Con este esquema, mientras estamos atendiendo a
    un cliente, los demás clientes serán rechazados
  • Cuando el servidor tenga que atender a varios
    clientes de forma simultánea, debe crear un nuevo
    hilo de ejecución (Thread) por cada cliente

29
Comunicación con sockets Multitarea con sockets
  • java.lang.Thread
  • Se puede crear una clase hija de Thread, y
    redefinir el método void run()
  • Se puede crear una clase que implemente el
    interfaz java.lang.Runnable (que obliga a
    implementar el método void run()). La clase
    Thread tiene un constructor que recibe un
    Runnable como parámetro
  • El código del método run() será ejecutado en un
    nuevo hilo de ejecución al invocar el método void
    start() de la clase Thread

30
Comunicación con sockets Multitarea con sockets
  • Ejemplo de servidor multitarea

ServerSocket serverSocket new
ServerSocket(7) while (true) Socket socket
serverSocket.accept() Thread t new Thread(new
Proceso(socket)) t.start()
31
Comunicación con sockets Multitarea con sockets
public class Proceso implements Runnable
Socket socket public ProcesoEcho(Socket
socket) this.socket socket public
void run() try InputStream is
socket.getInputStream() OutputStream os
socket.getOutputStream() // Envío y
recepción de información is.close() os.
close() socket.close() catch
(IOException e) System.out.println("Fallo en
la conexión.")
32
Comunicación con sockets Multitarea con sockets
  • Ejemplo Servidor de eco multitarea
  • Se hace uso de la clase Thread para crear un hilo
    que gestione cada conexión
  • Cada hilo es un objeto de la clase ConexionEco,
    hija de Thread

33
Comunicación con sockets Multitarea con sockets
  • Servidor

ServerSocket serverSocket new
ServerSocket(7) while (true) Socket socket
serverSocket.accept() Thread t new
Thread(new ConexionEco(socket)) t.start()
34
Comunicación con sockets Multitarea con sockets
public class ConexionEco implements Runnable
Socket socket public ConexionEco(Socket
socket) this.socket socket public
void run() try InputStream
is socket.getInputStream()
OutputStream os socket.getOutputStream()
byte bytes new byte512 int
leidos while((leidos is.read(bytes))
! -1) os.write(bytes,0,leidos)
is.close() os.close()
socket.close() catch (IOException e)
System.out.println("Fallo en la
conexión")
35
Comunicación con sockets
  • Introducción
  • Qué es un socket?
  • Sockets en Java
  • Cliente con sockets
  • Servidor con sockets
  • Multitarea con sockets
  • Creación de sockets con una factoría

36
Comunicación con sockets Creación de sockets con
factoría
  • Los sockets se pueden crear usando las factorías
  • javax.net.ServerSocketFactory
  • javax.net.SocketFactory
  • Permiten crear diferentes tipos de sockets
    dependiendo de sus características

37
Comunicación con sockets Creación de sockets con
factoría
  • Cliente
  • Servidor

Socket socket new Socket("127.0.0.1", 7)
SocketFactory ssf SocketFactory.getDefault() So
cket socket ssf.createSocket("127.0.0.1", 7)
ServerSocket socket new ServerSocket(7)
ServerSocketFactory ssf ServerSocketFactory.getD
efault() ServerSocket serverSocket
ssf.createServerSocket(7)
38
Índice
  • Introducción
  • Comunicación con sockets
  • SSL
  • SSL en Java
  • Verificación del Servidor
  • Aceptar certificado no fiable
  • HTTPS

39
SSL
  • Historia
  • Diseñado originalmente por Netscape
  • Su versión actual es SSL 3.0
  • Ahora se desarrolla y mantiene por el Internet
    Engineering Task Force (IETF)
  • El IETF lo actualizó ligeramente y lo llamó TLS
    1.0
  • En Java se soportan SSL 3.0 y TLS 1.0
  • SSL permite usar diferentes algoritmos, pero lo
    más habitual es usar el RSA

40
SSL
  • SSL realiza dos operaciones
  • Intercambio de claves (similar al algoritmo
    Diffie-Hellman)
  • Cifrado de datos con la clave intercambiada
  • Los servidores SSL deben autenticarse usando
    certificados, pero habitualmente los clientes no
    tienen que autenticarse

41
SSL
  • Certificados
  • Un servidor debe enviar su certificado al cliente
  • Un cliente debe verificar el certificado del
    servidor con una CA
  • Opcionalmente el cliente también se autenticará
    con un certificado al servidor

42
SSL
  • En el contexto de SSL, se utilizan varios
    ficheros de keystore
  • Truststore
  • Es un keystore que tiene el cliente y contiene
    los certificados de aquellas personas u
    organizaciones en las que confía el usuario
  • Keystore
  • Es un keysore que tiene el servidor (y también el
    cliente si tiene que autenticarse) y contiene
    tanto su certificado como su clave privada

43
Índice
  • Introducción
  • Comunicación con sockets
  • SSL
  • SSL en Java
  • Verificación del Servidor
  • Aceptar certificado no fiable
  • HTTPS

44
SSL en Java
  • Validar los certificados de los servidores
  • Por defecto se usa el keystore
  • JREHOME/lib/security/cacerts
  • Se puede cambiar con la propiedad
  • javax.net.ssl.trustStore
  • Usar certificados propios para identificarse
  • Debe establecerse la ruta del fichero de
    certificados con la propiedad
  • javax.net.ssl.keyStore
  • Debe establecerse la contraseña de acceso con la
    propiedad
  • javax.net.ssl.keyStorePassword

45
SSL en Java
  • Para los ejemplos vamos a crear un keystore para
    el servidor y un truststore para el cliente
  • 1) Crear una clave y un certificado con algoritmo
    RSA en un keystore (serverKeystore)
  • 2) Exportar el certificado a un fichero
    serverCert.cer
  • 3) Importar el certificado a un nuevo keystore
    (clientTruststore)

keytool -genkey -keyalg RSA -keystore
serverKeystore
keytool -export -file serverCert.cer -keystore
serverKeystore
keytool -import -keystore clientTruststore -file
serverCert.cer
46
SSL en Java
  • Creación de Sockets SSL
  • Se usan factorías de sockets
  • Cliente
  • javax.net.ssl.SSLSocketFactory
  • Servidor
  • javax.net.ssl.SSLServerSocketFactory
  • Hay que especificar también el keystore y el
    truststore para que se autentique el servidor de
    forma automática

47
SSL en Java
  • Cliente
  • Servidor

System.setProperty("javax.net.ssl.trustStore","cli
entTruststore") SocketFactory ssf
SSLSocketFactory.getDefault() Socket socket
ssf.createSocket("127.0.0.1", 7)
System.setProperty("javax.net.ssl.keyStore","serve
rKeystore") System.setProperty("javax.net.ssl.key
StorePassword","password") ServerSocketFactory
ssf SSLServerSocketFactory.getDefault() ServerS
ocket serverSocket ssf.createServerSocket(7)
48
SSL en Java
  • Las propiedades se pueden establecer en la línea
    de comandos
  • Cliente
  • Servidor

C\gtjava -Djavax.net.ssl.trustStoreclientTruststo
re ClienteEco
C\gtjava -Djavax.net.ssl.keyStoreserverKeystore
-Djavax.net.ssl.keyStorePasswordpasswor
d ServidorEco
49
Ejercicio 1
  • Implementa el servidor de Eco con SSL

50
Índice
  • Introducción
  • Comunicación con sockets
  • SSL
  • SSL en Java
  • Verificación del Servidor
  • Aceptar certificado no fiable
  • HTTPS

51
Verificación del servidor
  • Sólo si el certificado del servidor está en el
    truststore del cliente, el servidor es
    autenticado automáticamente
  • Es útil acceder a la información del certificado
    y acceder al nombre del servidor que emite ese
    certificado, así podremos comprobar si son
    coherentes

52
Verificación del servidor
  • Cada Socket SSL está asociado a una sesión SSL
  • Desde la sesión SSL se puede acceder al
    certificado del servidor y a su nombre

import java.security.cert.X509Certificate Socke
tFactory ssf SSLSocketFactory.getDefault() Sock
et socket ssf.createSocket("127.0.0.1",
7) SSLSocket sslSocket (SSLSocket)socket
SSLSession sesion sslSocket.getSession() Syste
m.out.println("Host "sesion.getPeerHost()) X509
Certificate certificate (X509Certificate)sesion.
getPeerCertificates()0 System.out.println("Nomb
re "certificate.getIssuerDN())
53
Ejercicio 2
  • Muestra la información del servidor en el cliente
    de eco
  • Se deberá mostrar el nombre del host y el
    Distinguised Name del certificado

54
Índice
  • Introducción
  • Comunicación con sockets
  • SSL
  • SSL en Java
  • Verificación del Servidor
  • Aceptar certificado no fiable
  • HTTPS

55
Aceptar certificado no fiable
  • Hay veces que tenemos que dar la oportunidad al
    usuario de aceptar conexiones aunque el
    certificado no esté en el truststore
  • No es una buena política de seguridad, pero hay
    sitios que sólo disponen de certificados
    autofirmados

56
Aceptar certificado no fiable
SSLContext sc SSLContext.getInstance("TLS") sc.
init(null, new TrustManager new
SimpleTrustManager() , null) SocketFactory ssf
sc.getSocketFactory() Socket socket
ssf.createSocket("127.0.0.1", 7) SSLSocket
sslSocket (SSLSocket) socket SSLSession sesion
sslSocket.getSession() System.out.println("Host
" sesion.getPeerHost()) try
X509Certificate certificate
(X509Certificate)sesion.getPeerCertificates()0
System.out.println("Nombre "
certificate.getIssuerDN()) catch
(SSLPeerUnverifiedException e)
System.out.println("Servidor no autenticado")
System.exit(-1)
57
Aceptar certificado no fiable
Creamos un SSLContext
SSLContext sc SSLContext.getInstance("TLS") sc.
init(null, new TrustManager new
SimpleTrustManager() , null) SocketFactory ssf
sc.getSocketFactory() Socket socket
ssf.createSocket("127.0.0.1", 7) SSLSocket
sslSocket (SSLSocket) socket SSLSession sesion
sslSocket.getSession() System.out.println("Host
" sesion.getPeerHost()) try
X509Certificate certificate
(X509Certificate)sesion.getPeerCertificates()0
System.out.println("Nombre "
certificate.getIssuerDN()) catch
(SSLPeerUnverifiedException e)
System.out.println("Servidor no autenticado")
System.exit(-1)
58
Aceptar certificado no fiable
SSLContext sc SSLContext.getInstance("TLS") sc.
init(null, new TrustManager new
SimpleTrustManager() , null) SocketFactory ssf
sc.getSocketFactory() Socket socket
ssf.createSocket("127.0.0.1", 7) SSLSocket
sslSocket (SSLSocket) socket SSLSession sesion
sslSocket.getSession() System.out.println("Host
" sesion.getPeerHost()) try
X509Certificate certificate
(X509Certificate)sesion.getPeerCertificates()0
System.out.println("Nombre "
certificate.getIssuerDN()) catch
(SSLPeerUnverifiedException e)
System.out.println("Servidor no autenticado")
System.exit(-1)
Debemos implementar una clase para controlar qué
certificados serán aceptados
59
Aceptar certificado no fiable
SSLContext sc SSLContext.getInstance("TLS") sc.
init(null, new TrustManager new
SimpleTrustManager() , null) SocketFactory ssf
sc.getSocketFactory() Socket socket
ssf.createSocket("127.0.0.1", 7) SSLSocket
sslSocket (SSLSocket) socket SSLSession sesion
sslSocket.getSession() System.out.println("Host
" sesion.getPeerHost()) try
X509Certificate certificate
(X509Certificate)sesion.getPeerCertificates()0
System.out.println("Nombre "
certificate.getIssuerDN()) catch
(SSLPeerUnverifiedException e)
System.out.println("Servidor no autenticado")
System.exit(-1)
Obtenemos la factoría de ese SSLContext
60
Aceptar certificado no fiable
SSLContext sc SSLContext.getInstance("TLS") sc.
init(null, new TrustManager new
SimpleTrustManager() , null) SocketFactory ssf
sc.getSocketFactory() Socket socket
ssf.createSocket("127.0.0.1", 7) SSLSocket
sslSocket (SSLSocket) socket SSLSession sesion
sslSocket.getSession() System.out.println("Host
" sesion.getPeerHost()) try
X509Certificate certificate
(X509Certificate)sesion.getPeerCertificates()0
System.out.println("Nombre "
certificate.getIssuerDN()) catch
(SSLPeerUnverifiedException e)
System.out.println("Servidor no autenticado")
System.exit(-1)
Si no se autentica al servidor, salta esta
excepción
61
Aceptar certificado no fiable
  • La clase SimpleTrustManager se ha creado para
    controlar qué certificados se aceptan y cuales no
  • Busca primero en un keystore, si está el
    certificado, le acepta automáticamente
  • Si no está el certificado, pregunta por pantalla

62
Aceptar certificado no fiable
public class SimpleTrustManager implements
X509TrustManager private SetltX509Certificate
gt certs new HashSetltX509Certificategt()
public SimpleTrustManager() throws Exception
//Cargamos los certificados del Keystore en el
atributo certs public void
checkClientTrusted(X509Certificate chain,
String authType) throws CertificateException
public X509Certificate
getAcceptedIssuers() return
certs.toArray(new X509Certificatecerts.size())

63
Aceptar certificado no fiable
public void checkServerTrusted(X509Certifica
te chain, String authType) throws
CertificateException for(int i0
iltchain.length i) if(certs.contains(c
haini)) return
System.out.println("El servidor
"chain0.getIssuerDN() " no se puede
verificar. " "Desde realizar la
conexión de todas formas?") Scanner
s new Scanner(System.in).useDelimiter("\r\n")
String opcion s.next()
if(!opcion.equalsIgnoreCase("si"))
throw new CertificateException("La clave no está
en el trustore")
Si el certificado está en el truststore, se
acepta automáticamente
Ojo, en Linux es \n
Si no está, se le pregunta al usuario. Si no
autoriza, se eleva una excepción
64
Ejercicio 3
  • Implementar la posibilidad de que los usuarios de
    la aplicación cliente de eco, puedan aceptar
    certificados aunque no estén en el keystore

65
Índice
  • Introducción
  • Comunicación con sockets
  • SSL
  • SSL en Java
  • Verificación del Servidor
  • Aceptar certificado no fiable
  • HTTPS

66
HTTPS
  • HTTPS es la versión segura de HTTP
  • Se basa en SSL
  • Cada servidor debe tener un certificado por cada
    IP pública (habitualmente sólo una)
  • El puerto por defecto de HTTPS es el 443

67
HTTPS
  • Tomcat
  • Es un servidor web implementado en Java
  • Soporta HTTPS
  • http//tomcat.apache.org/
  • HTTPS en Tomcat
  • Generar keystore
  • Crear un keystore
  • Debe tener un certificado RSA
  • El alias debe ser tomcat
  • Formato por defecto (JKS)

68
HTTPS
  • Configuración de Tomcat
  • Modificación del fichero TOMCAT\conf\server.xml
  • Arranque de Tomcat

ltConnector port"8443" protocol"HTTP/1.1"
SSLEnabled"true" maxThreads"150"
scheme"https" secure"true"
keystoreFile"F/Data/si/ws/SSL/tomcatKeystore"
keystorePass"password"
keyAlias"tomcat" clientAuth"false"
sslProtocol"TLS" /gt
C\apache-tomcat-6.0.16gt SET
JAVA_HOMEC\Archiv1\Java\jdk1.6.0_02 C\apache-
tomcat-6.0.16\bingtstartup.bat
69
HTTPS
70
HTTPS
  • Desde Java se puede acceder por http a páginas web

URL url new URL("http//127.0.0.18080/") URLCo
nnection urlConection url.openConnection() Inpu
tStream is urlConection.getInputStream() File
fichero new File("test.html") FileOutputStream
fos new FileOutputStream(fichero) byte bytes
new byte1024 int leidos while ((leidos
is.read(bytes)) ! -1) fos.write(bytes, 0,
leidos) fos.close() is.close()
71
HTTPS
  • También se puede acceder por https

System.setProperty("javax.net.ssl.trustStore","tom
catKeystore") URL url new URL("https//127.0.0
.18443/") HttpsURLConnection urlConection
(HttpsURLConnection) url.openConnection() urlCo
nection.setHostnameVerifier(new
SimpleHostnameVerifier()) InputStream is
urlConection.getInputStream() File fichero new
File("testhttps.html") FileOutputStream fos
new FileOutputStream(fichero) byte bytes new
byte1024 int leidos while ((leidos
is.read(bytes)) ! -1) fos.write(bytes, 0,
leidos) fos.close() is.close()
El verificador de https que se implementa en Java
SE 6 es muy restrictivo, nos implementamos uno
que valida el certificado sólo por estar en el
truststore
72
HTTPS
import javax.net.ssl. public class
SimpleHostnameVerifier implements
HostnameVerifier _at_Override public boolean
verify(String hostname, SSLSession session)
System.out.println("Host "hostname) try
X509Certificate cert
(X509Certificate)session.getPeerCertificates()0
System.out.println("DN"cert.getIssuerDN
()) catch (SSLPeerUnverifiedException e)
e.printStackTrace() return
true
Muestra el nombre del host y el nombre del
certificado. Lo acepta automáticamente
73
HTTPS
  • Al igual que con los sockets SSL, también se
    pueden aceptar conexiones aunque el certificado
    no esté en el truststore

SSLContext sc SSLContext.getInstance("TLS") sc.
init(null, new TrustManager new
SimpleTrustManager() , null) SSLSocketFactory
ssf sc.getSocketFactory() URL url new
URL("https//127.0.0.18443/") HttpsURLConnection
urlConnection (HttpsURLConnection)
url.openConnection() urlConnection.setSSLSocketFa
ctory(ssf)
A una HttpsUrlConnection se le puede establecer
una SSLSocketFactory. Basta con configurar esa
factoría con un TrustManager adecuado
74
Ejercicio 4
  • Implementa un programa que descargue una página
    web accesible mediante https
  • El programa debe preguntar al usuario en caso de
    que el certificado no se encuentre en su
    truststore
Write a Comment
User Comments (0)
About PowerShow.com