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 cài đặt / tệp tôi đã sử dụng để quản lý để giải quyết (các) vấn đề cụ thể của mình;
Kho khóa của khách hàng là tệp định dạng PKCS # 12 có chứa
- Chứng chỉ công khai của khách hàng (trong trường hợp này được ký bởi CA tự ký)
- Của khách hàng cá nhân chủ chốt
Để tạo ra nó, tôi đã sử dụng pkcs12
lệnh của OpenSSL , ví dụ;
openssl pkcs12 -export -in client.crt -inkey client.key -out client.p12 -name "Whatever"
Mẹo: đảm bảo bạn nhận được OpenSSL mới nhất, không phải phiên bản 0.9.8h vì dường như đó là lỗi không cho phép bạn tạo các tệp PKCS # 12 đúng cách.
Tệp PKCS # 12 này sẽ được máy khách Java sử dụng để xuất trình chứng chỉ ứng dụng khách cho máy chủ khi máy chủ yêu cầu rõ ràng máy khách xác thực. Xem bài viết Wikipedia trên TLS để biết tổng quan về cách giao thức xác thực chứng chỉ ứng dụng khách 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 ở đây).
Cửa hàng ủy thác của khách hàng là một tệp định dạng JKS chuyển tiếp chứa các chứng chỉ CA gốc hoặc 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 liên lạc, trong trường hợp này, nó sẽ cho phép khách hàng của bạn kết nối với bất kỳ máy chủ nào xuất trình chứng chỉ được ký bởi một trong các CA của Truststore.
Để tạo ra nó, bạn có thể sử dụng keytool 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 cửa hàng tin cậy này, khách hàng của bạn sẽ cố gắng thực hiện bắt tay SSL hoàn chỉnh với tất cả các máy chủ xuất trình chứng chỉ được ký bởi CA được xác định bởi myca.crt
.
Các tập tin trên chỉ dành cho khách hàng. Khi bạn cũng muốn thiết lập một máy chủ, máy chủ cần các tệp tin và kho khóa riêng. Có thể tìm thấy một hướng dẫn tuyệt vời để thiết lập một ví dụ hoạt động đầy đủ cho cả máy khách và máy chủ Java (sử dụng Tomcat) trên trang web này .
Vấn đề / Nhận xét / Mẹo
- Xác thực chứng chỉ ứng dụng khá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ư 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 bạn muốn xuất trình để xác thực không được ký bởi một trong những CA này, nó sẽ không được trình bày (theo tôi, đây là hành vi kỳ lạ, nhưng tôi chắc chắn có lý do cho điều đó). Đây là nguyên nhân chính gây ra sự cố của tôi, vì bên kia đã không cấu hình đúng máy chủ của họ để 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 đề nằm ở phía tôi vì đã 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ẽ giúp ích rất nhiều cho việc gỡ lỗi và tìm ra vấn đề. Nó tương tự
-Djavax.net.debug=ssl
nhưng có cấu trúc chặt chẽ hơn và (có thể nói là) dễ hiểu hơn nếu bạn không thoải mái với đầu ra gỡ lỗi Java SSL.
Hoàn toàn có thể sử dụng thư viện httpclient của Apache. Nếu bạn muốn sử dụng httpclient, chỉ cần thay thế URL đích bằng tương đương HTTPS và thêm các đối số JVM sau (tương tự cho mọi máy khách 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