2014-07-06 123 views
5

我想驗證客戶端針對CRL提供的X509證書是否已被吊銷。 我已成功實例化一個java.security.cert.X509CRL,但我檢索會話的證書具有問題:javax.security.cert.X509Certificate和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屬於javax.net.ssl封裝,以及其方法getPeerCertificateChain()返回javax.security.cert.X509Certificate[],這是不能被轉換爲java.security.cert.X509Certificate[]那我需要餵養java.security.cert.X509CRL。 怎麼辦?

回答

9

javax.security.cert.X509Certificate已棄用。通過session.getPeerCertificates();獲取java.security.cert.Certificate[],然後將它傳遞給crl.isRevoked實現。

參見:

在包javax.security.cert中存在 兼容早期版本的Java的類安全套接字 擴展名(JSSE )。新的應用程序應該使用位於java.security.cert中的標準 Java SE證書類。

您可以轉換java.security.cert.Certificatejava.security.cert.X509Certificatesource):

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

與選項(我考慮吧),後來我需要使用X509證書的方法,所以這是配不上的問題我。 – user2891462

+0

但是'Certificate'是抽象類 - 我敢打賭'cert [0]'是'instanceof'' X509Certificate'類。只需檢查它並投射 – MGorgon

+0

@ user2891462如果不是,您可以執行像這樣執行的轉換'X509Certificate [] convertCertificates(Certificate [] certsIn)'方法:https://groups.google.com/forum/#!topic/android-開發人員/ HCiHwBKOsrI – MGorgon

相關問題