Cuối cùng quản lý để giải quyết tất cả các vấn đề, vì vậy tôi sẽ trả lời câu hỏi của riêng tôi.Đây là các thiết lập/tập tin mà tôi đã sử dụng để quản lý để giải quyết các vấn đề cụ thể của tôi;
Các khách hàng của keystore là một PKCS # 12 định dạng tập tin chứa
- công giấy chứng nhận của khách hàng (trong trường hợp này có chữ ký của CA tự ký)
- của khách hàng tin khóa
Để tạo nó, tôi đã sử dụng OpenSSL pkcs12
lệnh, ví dụ;
openssl pkcs12 -export -in client.crt -inkey client.key -out client.p12 -name "Whatever"
Mẹo: chắc chắn bạn sẽ có được OpenSSL mới nhất, không phiên bản 0.9.8h vì điều đó dường như bị một lỗi mà không cho phép bạn tạo ra đúng PKCS # 12 tập tin.
Tệp PKCS # 12 này sẽ được trình khách Java sử dụng để trình bày chứng chỉ ứng dụng khách đến máy chủ khi máy chủ yêu cầu khách hàng xác thực rõ ràng. Xem Wikipedia article on TLS để biết tổng quan về cách giao thức để xác thực chứng chỉ ứng dụng thực sự hoạt động (cũng giải thích lý do tại sao chúng tôi cần khóa riêng của khách hàng tại đây). truststore
Các khách hàng là một thẳng về phía trước định dạng JKS tập tin có chứa các gốc hoặc chứng chỉ CA trung gian. Các chứng chỉ CA này sẽ xác định điểm cuối nào bạn sẽ được phép giao tiếp, trong trường hợp này nó sẽ cho phép máy khách của bạn kết nối với bất kỳ máy chủ nào trình bày chứng chỉ được ký bởi một trong các CA của truststore.
Để tạo nó, bạn có thể sử dụng công cụ khóa Java tiêu chuẩn, ví dụ;
keytool -genkey -dname "cn=CLIENT" -alias truststorekey -keyalg RSA -keystore ./client-truststore.jks -keypass whatever -storepass whatever
keytool -import -keystore ./client-truststore.jks -file myca.crt -alias myca
Sử dụng truststore này, khách hàng của bạn sẽ cố gắng làm một cái bắt tay SSL hoàn chỉnh với tất cả các máy chủ người trình bày một giấy chứng nhận có chữ ký của CA xác định bởi myca.crt
.
Các tệp ở trên chỉ dành cho khách hàng. Khi bạn muốn thiết lập một máy chủ, máy chủ cần các tệp khóa và tin cậy của riêng nó. Một bước đi tuyệt vời để thiết lập một ví dụ hoàn toàn làm việc cho cả máy khách và máy chủ Java (sử dụng Tomcat) có thể được tìm thấy trên this website.
vấn đề/chú/Mẹo
- khách hàng thẩm định chứng chỉ chỉ có thể được thực thi bởi máy chủ.
- (Quan trọng!) Khi máy chủ yêu cầu chứng chỉ ứng dụng khách (như là một phần của bắt tay TLS), nó cũng sẽ cung cấp danh sách các CA đáng tin cậy như một phần của yêu cầu chứng chỉ. Khi chứng chỉ ứng dụng khách mà bạn muốn hiển thị để xác thực là không phải được ký bởi một trong các CA này, nó sẽ không được trình bày (theo ý kiến của tôi, đây là hành vi kỳ lạ, nhưng tôi chắc chắn có lý do) .Đây là nguyên nhân chính của vấn đề của tôi, vì bên kia đã không định cấu hình máy chủ của họ đúng cách để chấp nhận chứng chỉ ứng dụng khách tự ký của tôi và chúng tôi cho rằng vấn đề ở cuối của tôi không cung cấp đúng chứng chỉ ứng dụng khách trong yêu cầu.
- Nhận Wireshark. Nó có phân tích gói SSL/HTTPS tuyệt vời và sẽ là một sự giúp đỡ rất lớn trong việc gỡ lỗi và tìm ra vấn đề. Nó tương tự như
-Djavax.net.debug=ssl
nhưng có cấu trúc hơn và (được cho là) dễ hiểu hơn nếu bạn không thoải mái với đầu ra gỡ lỗi SSL của Java.
Hoàn toàn có thể sử dụng thư viện Apache httpclient. Nếu bạn muốn sử dụng httpclient, chỉ cần thay thế URL đích bằng HTTPS tương đương và thêm các đối số JVM sau (giống với bất kỳ ứng dụng khách nào khác, bất kể thư viện bạn muốn sử dụng để gửi/nhận dữ liệu qua HTTP/HTTPS) :
-Djavax.net.debug=ssl
-Djavax.net.ssl.keyStoreType=pkcs12
-Djavax.net.ssl.keyStore=client.p12
-Djavax.net.ssl.keyStorePassword=whatever
-Djavax.net.ssl.trustStoreType=jks
-Djavax.net.ssl.trustStore=client-truststore.jks
-Djavax.net.ssl.trustStorePassword=whatever
"Khi chứng chỉ ứng dụng khách muốn hiển thị để xác thực không được ký bởi một trong các CA này, nó sẽ không được hiển thị ở tất cả". Các chứng chỉ không được trình bày vì máy khách biết rằng chúng sẽ không được máy chủ chấp nhận. Ngoài ra, chứng chỉ của bạn có thể được ký bởi CA trung gian "ICA" và máy chủ có thể giới thiệu máy khách của bạn với CA gốc "RCA" và trình duyệt web của bạn sẽ vẫn cho phép bạn chọn chứng chỉ mặc dù ICA không phải là RCA. – KyleM
Như một ví dụ của chú thích ở trên, hãy xem xét một tình huống mà bạn có một CA gốc (RCA1) và hai CA trung gian (ICA1 và ICA2). Trên Apache Tomcat nếu bạn nhập RCA1 vào kho lưu trữ tin cậy, trình duyệt web của bạn sẽ hiển thị TẤT CẢ các chứng chỉ được ký bởi ICA1 và ICA2, mặc dù chúng không nằm trong kho lưu trữ tin cậy của bạn. Điều này là bởi vì đó là chuỗi quan trọng không phải là chứng chỉ cá nhân. – KyleM
"theo ý kiến của tôi, đây là hành vi kỳ lạ, nhưng tôi chắc chắn có một lý do cho nó". Lý do cho nó là đó là những gì nó nói trong RFC 2246. Không có gì lạ về nó. Cho phép khách hàng trình bày các chứng chỉ không được máy chủ chấp nhận là điều kỳ quặc và lãng phí thời gian và không gian. – EJP