2011-08-26 37 views
16

Tôi cần tạo kết nối Https với máy chủ từ xa rồi truy xuất và xác minh chứng chỉ.Cách lấy chuỗi chứng chỉ máy chủ sau đó xác minh hợp lệ và đáng tin cậy trong Java

tôi đã thiết lập các kết nối tốt:

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

Nhưng có vẻ như phương pháp getServerCertificateChain() là undefined bởi các loại HttpsURLConnection.

Vậy làm cách nào để truy xuất chuỗi chứng chỉ máy chủ? Sự hiểu biết của tôi là getServerCertificateChain() phải trả về một mảng các đối tượng X509Certificate và lớp này có các phương thức tôi có thể sử dụng để thẩm vấn chứng chỉ.

tôi cần phải xác minh rằng:

  1. Giấy chứng nhận có giá trị và đáng tin cậy,
  2. kiểm tra Certificate Revocation List Distribution Point so với số sê-ri giấy chứng nhận
  3. chắc chắn rằng nó không được hết hạn và
  4. kiểm tra xem URL trong chứng chỉ có khớp với URL khác (mà tôi đã truy lục) hay không.

Tôi bị mất và sẽ thực sự đánh giá cao bất kỳ trợ giúp nào!

+0

Bạn có chắc chắn rằng mã khách hàng https của Java chưa làm tất cả bốn việc cho bạn? –

+0

Bạn có nhận được giải pháp cho việc này không? Chứng chỉ có đáng tin cậy hay không? Bất kỳ Giải pháp nào cho rằng –

Trả lời

23

Phương pháp bạn muốn là getServerCertificates, không phải getServerCertificateChain. Có một số mã mẫu đẹp here.


EDIT

gia tăng một số mẫu mã của riêng tôi. Điểm khởi đầu tốt cho bạn. Đừng quên nhìn vào Javadocs cho HttpsURLConnectionX509Certificate.

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"); 
       } 
      } 
     } 
    } 
} 
+0

Cảm ơn bạn - Tôi đang viết mã cho thông số kỹ thuật từ một sổ tay công ty lớn và tôi đã bắt đầu nghi ngờ rằng bất cứ ai đã viết phần này đã sai lầm. Tôi là một tân tiến sĩ mặc dù khi nói đến mạng java vì vậy tôi đã dành hàng giờ cố gắng để tìm ra những gì địa ngục sự khác biệt là giữa getServerCertificateChain và getServerCertificates. –

+0

Làm thế nào để thẩm vấn các chứng chỉ mặc dù theo bốn yêu cầu tôi liệt kê ở trên? –

+0

Bạn sẽ phải chuyển đổi chứng chỉ thành X509Certificates và sử dụng các phương thức trên lớp đó. – Perception

2

Goolgling nhanh đưa tôi đến ví dụ này bằng BouncyCastle. Tôi nghĩ rằng nó sẽ trả lời câu hỏi tốt hơn. http://www.nakov.com/blog/2009/12/01/x509-certificate-validation-in-java-build-and-verify-chain-and-verify-clr-with-bouncy-castle/

+2

mã không được định dạng đúng trong blog đó. Đây là mã nguồn https://svn.apache.org/repos/asf/cxf/tags/cxf-2.4.1/distribution/src/main/release/samples/sts_issue_operation/src/main/java/demo/sts/nhà cung cấp/cert / –

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