2011-11-18 16 views
6

Tôi đã tạo chứng chỉ máy chủ SSL tại CAcert. Khi tôi cố gắng tìm nạp một trang từ máy chủ này từ một chương trình Java (bên dưới), tôi nhận đượcTại sao java choke trên cert được thực hiện tại cacert.org: "keyCertSign bit không được thiết lập"?

Exception in thread "main" javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: CA key usage check failed: keyCertSign bit is not set 

Bất cứ ai biết điều gì có thể gây ra điều này?

  • Tôi đã thử tạo các chứng chỉ được ký bởi cả hai chứng chỉ gốc loại 1 và lớp 3, cùng một kết quả.
  • Lỗi không không xảy ra khi tôi cố gắng nạp các trang từ hai trang web khác sử dụng CAcert.org Certs: https://www.cacert.orghttps://pause.perl.org (dẫn tôi để tin rằng lớp rễ & 3 Certs từ cacert.org được cài đặt đúng trên hệ thống của tôi).
  • Tôi có thể xem các cerert cacert.org trong keytool -keystore /etc/ssl/certs/java/cacerts -list.
  • Có, tôi biết một số trình duyệt web được giao với các chứng chỉ gốc cacert.org và lớp 3.
  • Chứng chỉ là chứng nhận ký tự đại diện cho *.an.example.com (tên miền thực được redacted).

Dưới đây là các mã Java Tôi đang sử dụng để kiểm tra:

class Test { 
    public static void main(String args[]) throws Exception { 
     java.net.URL url = new java.net.URL(args[0]); 
     java.io.InputStream s = url.openStream(); 
    } 
} 

Các full stack trace không xuất hiện thêm bất kỳ thông tin hữu ích.

Các keytool(1) manpage không đề cập đến

Extensions can be marked critical to indicate that the extension should 
be checked and enforced/used. For example, if a certificate has the 
KeyUsage extension marked critical and set to "keyCertSign" then if this 
certificate is presented during SSL communication, it should be rejected, 
as the certificate extension indicates that the associated private key 
should only be used for signing certificates and not for SSL use. 

nhưng tôi đã kiểm tra các CERT, và trong khi tiện ích "Giấy chứng nhận Key Usage" không nói "Ký", nó cũng được đánh dấu "Không quan trọng".

Xin lỗi, tôi không muốn tiết lộ tên miền hoặc cert của mình, nhưng tôi có thể quay lên máy chủ để thử nghiệm nếu cần.

+1

Tìm thấy: http://www.ericsimmerman.com/resolving-a-ca-key-usage-check-failed-keycert – Thilo

+0

@Thilo - tìm tốt. Tôi kiểm tra lại, và tôi dường như có SSLCertificateChainFile được cài đặt và cấu hình đúng cách. –

+0

@Thilo - Tôi lấy lại điều đó, bạn nói đúng! [Chuỗi tệp bị sai lệch] (http://wiki.cacert.org/SimpleApacheCert?action=AttachFile&do=view&target=CAcert_chain.pem) (CAcert.org folks: FIX RATNG!). Tôi đã tự tạo một chuỗi tệp với 'cat class3.crt root.crt> chain.pem' và lỗi" keyCertSign bit chưa được đặt "bí ẩn đã biến mất. Vui lòng thêm câu trả lời này làm câu trả lời và tôi sẽ chấp nhận nó. –

Trả lời

0

Dường như với tôi rằng chứng chỉ không được sử dụng để liên lạc SSL.
I.e. nó được đánh dấu là chứng chỉ CA nhưng vì phần mở rộng cho việc ký chứng chỉ không được thiết lập, Java từ chối nó.
Java đôi khi nghiêm ngặt hơn về những thứ như thế này trong khi các trình duyệt có nhiều ưu điểm hơn.

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