2011-08-26 10 views
16

Necesito crear una conexión Https con un servidor remoto y luego recuperar y verificar el certificado.Cómo obtener la cadena de certificados del servidor y luego verificar que sea válida y confiable en Java

he establecido la conexión fina:

try { 
    url = new URL(this.SERVER_URL); 
    HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
    HttpsURLConnection secured = (HttpsURLConnection) con; 
    secured.connect(); 
} 

Pero parece getServerCertificateChain() método está definido por el tipo HttpsURLConnection.

Entonces, ¿cómo recupero la cadena de certificados del servidor? Tengo entendido que getServerCertificateChain() debe devolver una matriz de objetos X509Certificate y que esta clase tiene métodos que puedo usar para interrogar al certificado.

necesito para verificar que:

  1. el certificado es válido y de confianza,
  2. comprobación del punto de distribución de lista de revocación de certificados con el número de serie del certificado
  3. asegúrese de que no ha caducado y
  4. comprueba que la URL del certificado coincide con otra (que ya he recuperado).

¡Estoy perdido y realmente agradecería cualquier ayuda!

+0

¿Está seguro de que el código de cliente https de Java todavía no hace las cuatro cosas por usted? –

+0

¿Obtuviste la solución para esto? Si el certificado es de confianza o no? Cualquier solución para eso –

Respuesta

23

El método que desea es getServerCertificates, no getServerCertificateChain. Hay algún buen código de muestra here.


EDITAR

añadido un código de ejemplo de mi propia. Buen punto de partida para ti. No te olvides de mirar los Javadocs para HttpsURLConnection y X509Certificate.

import java.net.URL; 
import java.security.cert.Certificate; 
import java.security.cert.CertificateExpiredException; 
import java.security.cert.X509Certificate; 

import javax.net.ssl.HttpsURLConnection; 

public class TestSecuredConnection { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     TestSecuredConnection tester = new TestSecuredConnection(); 
     try { 
      tester.testConnectionTo("https://www.google.com"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public TestSecuredConnection() { 
     super(); 
    } 

    public void testConnectionTo(String aURL) throws Exception { 
     URL destinationURL = new URL(aURL); 
     HttpsURLConnection conn = (HttpsURLConnection) destinationURL 
       .openConnection(); 
     conn.connect(); 
     Certificate[] certs = conn.getServerCertificates(); 
     for (Certificate cert : certs) { 
      System.out.println("Certificate is: " + cert); 
      if(cert instanceof X509Certificate) { 
       try { 
        ((X509Certificate) cert).checkValidity(); 
        System.out.println("Certificate is active for current date"); 
       } catch(CertificateExpiredException cee) { 
        System.out.println("Certificate is expired"); 
       } 
      } 
     } 
    } 
} 
+0

Gracias - Estoy codificando las especificaciones de un manual de grandes corporaciones y comencé a sospechar que quien escribió esta sección se había equivocado. Aunque soy un neófito en lo que respecta a la red de Java, he pasado horas tratando de imaginarme cuál es la diferencia entre getServerCertificateChain y getServerCertificates. –

+0

¿Cómo interrogo los certificados según los cuatro requisitos enumerados anteriormente? –

+0

Deberá convertir los certificados a X509Certificates y usar los métodos en esa clase. – Perception

2

Google rápido me trajo a este ejemplo usando BouncyCastle. Creo que es mejor responder la pregunta. http://www.nakov.com/blog/2009/12/01/x509-certificate-validation-in-java-build-and-verify-chain-and-verify-clr-with-bouncy-castle/

+2

código no formateado correctamente en ese blog ... Aquí está el código fuente https://svn.apache.org/repos/asf/cxf/tags/cxf-2.4.1/distribution/src/main/release/samples/sts_issue_operation/src/main/java/demo/sts/provider/cert / –

Cuestiones relacionadas