2014-07-06 16 views
5

Tôi muốn xác minh chứng chỉ X509 được trình bày bởi khách hàng dựa vào CRL để xem liệu nó có bị thu hồi hay không. Tôi đã instanciated thành công một java.security.cert.X509CRL, nhưng tôi gặp khó khăn lấy giấy chứng nhận phiên:Sự không tương thích giữa javax.security.cert.X509Certificate và 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 thuộc về gói javax.net.ssl, và phương pháp của nó getPeerCertificateChain() trả về một javax.security.cert.X509Certificate[], mà không thể được chuyển đổi sang java.security.cert.X509Certificate[] rằng Tôi cần cho ăn java.security.cert.X509CRL. Làm thế nào nó có thể được thực hiện?

Trả lời

9

javax.security.cert.X509Certificate không được dùng nữa. Nhận java.security.cert.Certificate[] bởi session.getPeerCertificates(); và sau đó chuyển nó đến crl.isRevoked triển khai của bạn.

Xem thêm:

Các lớp trong gói javax.security.cert tồn tại cho khả năng tương thích với các phiên bản trước của Java Ổ cắm an toàn Tiện ích mở rộng (JSSE). Thay vào đó, các ứng dụng mới sẽ sử dụng các lớp chứng chỉ Java SE tiêu chuẩn nằm trong java.security.cert.

Bạn có thể chuyển đổi 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

Vấn đề với lựa chọn đó (tôi dự tính nó) là sau đó tôi cần phải sử dụng phương pháp X509Certificate, vì vậy nó là không đủ tốt cho tôi. – user2891462

+0

Nhưng 'Certificate' là lớp trừu tượng - tôi đặt cược rằng' cert [0] 'là' instanceof' 'X509Certificate' class. Chỉ cần kiểm tra và đúc – MGorgon

+0

@ user2891462 Nếu không, bạn có thể thực hiện chuyển đổi như thế này được triển khai phương pháp 'X509Certificate [] conversionCertificates (Certificate [] certsIn)': https://groups.google.com/forum/#!topic/android- developers/HCiHwBKOsrI – MGorgon

Các vấn đề liên quan