2012-04-06 39 views
12

Tôi đang cố gắng xử lý chứng chỉ X509 trong một vài bước và gặp phải một số sự cố. Tôi mới đến JCE nên tôi chưa hoàn toàn cập nhật mọi thứ.Phân tích chứng chỉ Java X509 và xác nhận hợp lệ

Chúng tôi muốn có thể phân tích cú pháp một số chứng chỉ X509 khác nhau dựa trên các mã hóa khác nhau (PEM, DER và PCKS7). Tôi đã xuất khẩu cùng một chứng chỉ từ https://belgium.be ở định dạng PEM và PCKS7 bằng cách sử dụng FireFox (chứng chỉ bao gồm chuỗi). Tôi đã để lại vài dòng ra rằng không cần thiết cho những câu hỏi

public List<X509Certificate> parse(FileInputStream fis) { 
    /* 
    * Generate a X509 Certificate initialized with the data read from the inputstream. 
    * NOTE: Generation fails when using BufferedInputStream on PKCS7 certificates. 
    */ 
    List<X509Certificate> certificates = null; 
     log.debug("Parsing new certificate."); 
     certificates = (List<X509Certificate>) cf.generateCertificates(fis); 
    return certificates; 
    } 

Mã này đang làm việc tốt aslong như tôi làm việc với một FileInputStream thay vì một BufferedInputStream cho PCKS7, mà là khá kỳ lạ đã tôi nghĩ? Nhưng tôi có thể sống với nó.

Bước tiếp theo là xác thực các chuỗi chứng chỉ này. 1) Kiểm tra xem tất cả chứng chỉ có ngày hợp lệ (dễ) 2) Xác thực chuỗi chứng chỉ bằng OCSP (và dự phòng CRL nếu không tìm thấy URL OCSP trong chứng chỉ). Đây là nơi tôi không hoàn toàn chắc chắn làm thế nào để xử lý này.

Tôi đang sử dụng Sun JCE, nhưng có vẻ như không có nhiều tài liệu sẵn có (trong ví dụ) về điều này?

Lần đầu tiên tôi thực hiện triển khai đơn giản chỉ kiểm tra chuỗi mà không phải trải qua kiểm tra OCSP/CRL.

private Boolean validateChain(List<X509Certificate> certificates) { 
    PKIXParameters params; 
    CertPath certPath; 
    CertPathValidator certPathValidator; 
    Boolean valid = Boolean.FALSE; 

    params = new PKIXParameters(keyStore); 
    params.setRevocationEnabled(false); 

    certPath = cf.generateCertPath(certificates); 
    certPathValidator = CertPathValidator.getInstance("PKIX"); 

    PKIXCertPathValidatorResult result = (PKIXCertPathValidatorResult) 
    certPathValidator.validate(certPath, params); 

     if(null != result) { 
     valid = Boolean.TRUE; 
     } 
    return valid; 
} 

Điều này làm việc tốt cho chứng chỉ PEM của tôi chứ không phải chứng chỉ PCKS7 (cùng chứng chỉ, chỉ xuất ở định dạng khác). java.security.cert.CertPathValidatorException: Đường dẫn không gắn kết với bất kỳ neo tin cậy nào.

Sự khác biệt duy nhất tôi có thể thấy là thứ tự mà CertPath được tạo thành không giống nhau? Tôi đã không thể tìm ra những gì đã xảy ra vì vậy tôi đã bỏ qua điều này và tiếp tục với giấy chứng nhận PEM, nhưng cho phép gọi CÂU HỎI 1 này;)

Những gì tôi muốn thực hiện sau đó là kiểm tra OCSP. Dường như nếu tôi bật OCSP bằng: Security.setProperty ("ocsp.enable", "true"); và đặt params.setRevocationEnabled (true); nó sẽ có thể tự tìm thấy URL OCSP, nhưng điều đó dường như không đúng. Việc thực hiện tiêu chuẩn phải làm gì (CÂU HỎI 2)? java.security.cert.CertPathValidatorException: Phải xác định vị trí của một OCSP Responder

Đi qua này, tôi tìm thấy một cách để lấy url OCSP từ giấy chứng nhận sử dụng AuthorityInfoAccessExtension và như vậy.

Nhưng sau khi cài đặt url OCSP bằng tay trong tài sản ocsp.url, tôi nhận được một java.security.cert.CertPathValidatorException: OCSP lỗi phản ứng: TRÁI PHÉP

Nó có vẻ như tôi là thiếu một nhiều bước cần thiết trong khi rất nhiều tài liệu tham khảo trực tuyến nói rằng thiết lập thuộc tính ocsp.enable phải là tất cả những gì bạn cần làm?

Có lẽ bất kỳ ai trong số các bạn không thể hướng dẫn tôi qua quá trình này một chút?Bước tiếp theo sẽ thực hiện kiểm tra CRL nếu không tìm thấy OCSP, nếu bất cứ ai có thể chỉ ra bất kỳ ví dụ nào hoặc chỉ cho tôi một số tài liệu về điều này, nó cũng sẽ được đánh giá cao!

Cảm ơn!

EDIT: Kể từ khi nó không được chọn lên các tài sản trên riêng của mình, tôi đã cố gắng để thiết lập tất cả các thuộc tính bản thân mình bằng cách sử dụng sau đây:

// Activate OCSP 
     Security.setProperty("ocsp.enable", "true"); 
     // Activate CRLDP -- no idea what this is 
     Security.setProperty("com.sun.security.enableCRLDP", "true"); 

     X509Certificate target = (X509Certificate) certPath.getCertificates().get(0); 
     Security.setProperty("ocsp.responderURL","http://ocsp.pki.belgium.be/"); 
     Security.setProperty("ocsp.responderCertIssuerName", target.getIssuerX500Principal().getName()); 
     Security.setProperty("ocsp.responderCertSubjectName", target.getSubjectX500Principal().getName()); 
     Security.setProperty("ocsp.responderCertSerialNumber", target.getSerialNumber().toString(16)); 

Mà cho một ngoại lệ: java. security.cert.CertPathValidatorException: Không thể tìm thấy chứng chỉ của người trả lời (được đặt bằng cách sử dụng các thuộc tính bảo mật OCSP).

+0

OSCPChecker dường như thực hiện việc này trong phương thức getOCSPServerURI: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/sun/security/provider/certpath/OCSPChecker .java # OCSPChecker.getOCSPServerURI% 28sun.security.x509.X509CertImpl% 2Cjava.lang.String% 29 –

+0

'cf' trong ví dụ của bạn là gì? – spy

+0

Đã lâu rồi, nhưng tôi sẽ nói https://docs.oracle.com/javase/7/docs/api/java/security/cert/CertificateFactory.html –

Trả lời

15

Để tham khảo trong tương lai tôi sẽ gửi câu trả lời cho câu hỏi của riêng tôi (một phần ít nhất)

OCSP và CRL kiểm tra được thực hiện trong việc thực hiện tiêu chuẩn Java đã và không có nhu cầu về mã tùy chỉnh hoặc các nhà cung cấp khác (BC , ..). Chúng được tắt theo mặc định.

Để kích hoạt này, bạn phải ít nhất đặt hai thông số:

(PKIXParameters or PKIXParameterBuilder) params.setRevocationEnabled(true); 
Security.setProperty("ocsp.enable", "true"); 

này sẽ kích hoạt OCSP kiểm tra khi bạn đang cố gắng để xác nhận đường dẫn chứng chỉ (PKIXCertPathValidatorResult.validate()).

Khi bạn muốn thêm việc kiểm tra dự phòng cho CRL nếu không OCSP có sẵn, thêm một tài sản aditional:

System.setProperty("com.sun.security.enableCRLDP", "true"); 

Rất nhiều vấn đề của tôi đang xảy ra do thực tế rằng tôi phải hỗ trợ giấy chứng nhận khác nhau định dạng (PKCS7, PEM). thực hiện của tôi hoạt động tốt cho PEM, nhưng kể từ khi PKCS7 KHÔNG lưu thứ tự của giấy chứng nhận trong chuỗi đó là một chút khó khăn hơn (http://bugs.sun.com/view_bug.do?bug_id=6238093)

X509CertSelector targetConstraints = new X509CertSelector(); 

targetConstraints.setCertificate(certificates.get(0)); 
// Here's the issue for PKCS7 certificates since they are not ordered, 
// but I havent figured out how I can see what the target certificate 
// (lowest level) is in the incoming certificates.. 

PKIXBuilderParameters params = new PKIXBuilderParameters(anchors, targetConstraints); 

Hy vọng điều này sẽ là những nhận xét hữu ích cho những người khác nữa, có lẽ ai đó có thể làm sáng tỏ cách tìm chứng chỉ đích trong danh sách PKCS7 không theo thứ tự?

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