2014-07-06 10 views
5

Ich mag das X509-Zertifikat von einem Client gegen einen CRL präsentiert, um zu überprüfen, um zu sehen, ob es widerrufen wurde. Ich habe instanziiert erfolgreich eine java.security.cert.X509CRL, aber ich habe Probleme das Zertifikat der Sitzung abrufen:Inkompatibilität zwischen javax.security.cert.X509Certificate und java.security.cert.X509Certificate

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 gehört zur javax.net.ssl Paket, und seine Methode getPeerCertificateChain() eine javax.security.cert.X509Certificate[] zurückgibt, die dem java.security.cert.X509Certificate[] umgewandelt kann nicht sein, dass Ich muss die java.security.cert.X509CRL füttern. Wie kann es gemacht werden?

Antwort

9

javax.security.cert.X509Certificate ist veraltet. Holen java.security.cert.Certificate[] von session.getPeerCertificates();, und übergibt es dann auf Ihre crl.isRevoked Umsetzung.

Siehe auch:

Die Klassen im Paket javax.security.cert mit früher für Kompatibilität existieren Versionen des Java Secure Sockets Erweiterung (JSSE). Neue Anwendungen sollten stattdessen die Standard Java SE Zertifikat Klassen in java.security.cert befindet verwenden.

können Sie konvertieren java.security.cert.Certificate-java.security.cert.X509Certificate (source):

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

Das Problem mit dieser Option (ich es in Betracht gezogen) ist, dass später muss ich Methoden der X509Certificate verwenden, es war also nicht gut genug für mich. – user2891462

+0

Aber 'ist Zeugnis für abstrakte Klasse - ich wette, dass' cert [0] 'ist' 'instanceof' X509Certificate' Klasse. Schauen Sie doch einfach und werfen – MGorgon

+0

@ user2891462 Wenn nicht, Sie Umwandlung wie dies umgesetzt 'X509Certificate [] convertCertificates (Certificate [] certsIn)' Methode ausführen: https://groups.google.com/forum/#!topic/android- Entwickler/HCiHwBKOsrI – MGorgon

Verwandte Themen