2014-07-06 26 views
5

Chcę zweryfikować certyfikat X509 przedstawiony przez klienta przeciwko CRL, aby sprawdzić, czy został odwołany. Mam powodzeniem instanciated się java.security.cert.X509CRL, ale mam problemy z pobraniem certyfikat sesji:Niekompatybilność między javax.security.cert.X509Certificate a java.security.cert.X509Certyfikat

try { 
    SSLSocket s = (SSLSocket) serverSocket.accept(); 
    s.setSoTimeout(TIMEOUT_RW * 1000); 
    s.startHandshake(); 
    SSLSession session = s.getSession(); 
    X509Certificate[] cert = session.getPeerCertificateChain(); 
    if (crl.isRevoked(cert[0])) { 
     System.err.println("Attempted to stablish connection using revoked certificate"); 
    } else { 
     ... 
    } 
} catch (Exception ex) { 
    System.err.println("Something went wrong"); 
} 

SSLSession należącego do pakietu javax.net.ssl, a jego metody getPeerCertificateChain() zwraca javax.security.cert.X509Certificate[], które nie mogą być zamieniane na java.security.cert.X509Certificate[] że Muszę nakarmić java.security.cert.X509CRL. Jak to zrobić?

Odpowiedz

9

javax.security.cert.X509Certificate jest przestarzałe. Uzyskaj java.security.cert.Certificate[] przez session.getPeerCertificates();, a następnie przekaż go do swojej implementacji crl.isRevoked.

Zobacz także:

klas w pakiecie javax.security.cert istnieją dla kompatybilność z wcześniejszymi wersjami Javy Bezpieczne gniazda Rozszerzenie (JSSE). Nowe aplikacje powinny zamiast tego używać standardowych klas certyfikatów Java SE zlokalizowanych w java.security.cert.

Można konwertować java.security.cert.Certificate do java.security.cert.X509Certificate (source):

CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
    ByteArrayInputStream bais = new ByteArrayInputStream(certificate.getEncoded()); 
    X509Certificate x509 = (X509Certificate) cf.generateCertificate(bais); 
+0

Problem z tej opcji (I rozważa to) jest to, że później trzeba użyć metody X509Certificate, więc nie było wystarczająco dobre dla mnie. – user2891462

+0

Ale 'Certificate' to klasa abstrakcyjna - założę się, że' cert [0] 'jest klasą' instanceof' 'X509Certificate'. Wystarczy go sprawdzić i odrzucić: – MGorgon

+0

@ user2891462 Jeśli nie, możesz wykonać konwersję taką jak ta zaimplementowana 'X509Certificate [] convertCertificates (Certificate [] certsIn)' method: https://groups.google.com/forum/#!topic/android- programistów/HCiHwBKOsrI – MGorgon