Come ottenere la catena di certificati del server quindi verificare che sia valido e affidabile in Java

Devo creare una connessione Https con un server remoto, quindi recuperare e verificare il certificato.

Ho stabilito bene la connessione:

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

Ma sembra che il metodo HttpsURLConnection getServerCertificateChain() non sia definito dal tipo HttpsURLConnection .

Quindi, come posso recuperare la catena di certificati del server? La mia comprensione è che getServerCertificateChain() dovrebbe restituire una matrice di oggetti X509Certificate e che questa class abbia metodi che posso usare per interrogare il certificato.

Devo verificare che:

  1. il certificato è valido e attendibile,
  2. controllare il punto di distribuzione dell’elenco di revoche di certificati rispetto al numero di serie del certificato
  3. assicurati che non sia scaduto e
  4. controlla che l’URL nel certificato corrisponda ad un altro (che ho già recuperato).

Sono perso e apprezzerei davvero ogni aiuto!

Il metodo che vuoi è getServerCertificates , non getServerCertificateChain . C’è un bel codice di esempio qui .


MODIFICARE

Aggiunto un codice di esempio mio. Buon punto di partenza per te. Non dimenticare di guardare Javadocs per HttpsURLConnection e 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"); } } } } } 

Googling veloce mi ha portato a questo esempio utilizzando BouncyCastle. Penso che risponda meglio alla domanda. http://www.nakov.com/blog/2009/12/01/x509-certificate-validation-in-java-build-and-verify-chain-and-verify-clr-with-bouncy-castle/