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).
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 –
'cf' trong ví dụ của bạn là gì? – spy
Đã lâu rồi, nhưng tôi sẽ nói https://docs.oracle.com/javase/7/docs/api/java/security/cert/CertificateFactory.html –