Title: Seguridad Informtica
1Seguridad 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
3Introducció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
5Comunicació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
6Comunicació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
7Comunicació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.
8Comunicació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ó
9Comunicació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.
10Comunicació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
11Comunicació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
12Comunicació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
13Comunicació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
14Comunicació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
15Comunicació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
16Comunicació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
17Comunicació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
18Comunicació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
19Comunicación con sockets Cliente con sockets
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")
20Comunicació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
21Comunicació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()
22Comunicació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
23Comunicació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
24Comunicación con sockets Servidor con sockets
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")
25Comunicació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
26Comunicació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.")
27Comunicació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
28Comunicació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
29Comunicació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
30Comunicació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()
31Comunicació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.")
32Comunicació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
33Comunicación con sockets Multitarea con sockets
ServerSocket serverSocket new
ServerSocket(7) while (true) Socket socket
serverSocket.accept() Thread t new
Thread(new ConexionEco(socket)) t.start()
34Comunicació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")
35Comunicació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
36Comunicació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
37Comunicación con sockets Creación de sockets con
factoría
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
39SSL
- 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
40SSL
- 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
41SSL
- 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
42SSL
- 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
44SSL 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
45SSL 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
46SSL 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
47SSL en Java
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)
48SSL 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
49Ejercicio 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
51Verificació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
52Verificació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())
53Ejercicio 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
55Aceptar 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
56Aceptar 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)
57Aceptar 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)
58Aceptar 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
59Aceptar 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
60Aceptar 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
61Aceptar 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
62Aceptar 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())
63Aceptar 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
64Ejercicio 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
66HTTPS
- 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
67HTTPS
- 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)
68HTTPS
- 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
69HTTPS
70HTTPS
- 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()
71HTTPS
- 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
72HTTPS
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
73HTTPS
- 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
74Ejercicio 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