Foro de elhacker.net

Programación => Java => Mensaje iniciado por: alzehimer_cerebral en 20 Junio 2010, 13:43 pm



Título: Conexiones Https a servidor con certificado autofirmado
Publicado por: alzehimer_cerebral en 20 Junio 2010, 13:43 pm
Hola a todos, estoy peleandome para conectarme a un servidor por https, dicho servidor tiene un certificado autofirmado X509.

Suponemos que desde la aplicacion que estoy programando (cliente) no se incluye este certificado en el "keystore" por lo tanto hay que mostrar al usuario cierta informacion del certificado para que decida si proceder con la conexion o no.

De momento estoy jugando con unos ejemplos que he encontrado por internet.  Por lo que he visto tengo que generar un SSLContext y en este configurar que conexiones son aceptadas para luego generar un SSLSocketFactory que se pueda añadir a una HttpsUrlConnection (ya que la idea es realizar conexiones directamente a urls sin utilizar sockets).

Para que quede mas claro e codigo es el siguiente:
Código
  1. //Para aceptar certificados que no estan en el keystore del cliente
  2.        SSLContext sc = SSLContext.getInstance("TLS");
  3.        sc.init(null, new TrustManager[] { new SimpleTrustManager1() }, null);
  4.        SSLSocketFactory ssf = sc.getSocketFactory();
  5.  
  6.  
  7.        URL url = new URL("https://192.168.2.2:443/default-ssl/");
  8.        HttpsURLConnection urlConection = (HttpsURLConnection) url.openConnection();
  9.        urlConection.setSSLSocketFactory(ssf);
  10.  


El problema viene cuando quiero establecer que conexiones son aceptadas mediante la clase SimpleTrustManager1 implements X509TrustManager.  Os pongo el boceto que he encontrado a seguir:

Código
  1. public class SimpleTrustManager1 implements X509TrustManager   {
  2.  
  3.    private Set<X509Certificate> certs = new HashSet<X509Certificate>();
  4.  
  5.  
  6.    public SimpleTrustManager1() throws Exception {
  7.      //Cargamos los certificados del Keystore en el atributo certs
  8.   }
  9.  
  10.   public void checkClientTrusted(X509Certificate[] chain, String authType)
  11.      throws CertificateException {
  12.   }
  13.  
  14.   public X509Certificate[] getAcceptedIssuers() {
  15.     return certs.toArray(new X509Certificate[certs.size()]);
  16.   }
  17.  
  18.   public void checkServerTrusted(X509Certificate[] chain, String authType)
  19.      throws CertificateException {
  20.  
  21.      for(int i=0; i<chain.length; i++){
  22.         if(certs.contains(chain[i])){
  23.            return;
  24.         }
  25.      }
  26.  
  27.      System.out.println("El servidor "+chain[0].getIssuerDN()+
  28.         " no se puede verificar. " +
  29.         "¿Desde realizar la conexión de todas formas?");
  30.  
  31.      Scanner s = new Scanner(System.in).useDelimiter("\r\n");
  32.      String opcion = s.next();
  33.      if(!opcion.equalsIgnoreCase("si")){
  34.          throw new CertificateException("La clave no está en el trustore");
  35.      }
  36.   }
  37.  
  38. }
  39.  

Como se pueden cargar los certificados del "Keystore" en el atributo certs, para asi completar la funcionalidad del constructor???

Voy bien encaminado??, os pido paciencia..  Cualquier aporte, consejo, recomendacion en bienvenida.

Gracias de antemano.

alzehimer_cerebral