Tôi đang cố gắng viết một ứng dụng khách (thực tế là phần mềm trung gian, là khách hàng cho một thực thể, nhưng cũng hoạt động như một máy chủ cho người khác). Trong khả năng khách hàng của nó, nó được cho là để nói chuyện với một máy chủ (VirtualCenter của VMware), và yêu cầu nó để làm công cụ thay mặt nó.Bắt buộc SSL Client Socket để gửi chứng chỉ
Để cung cấp cho bạn nhiều ngữ cảnh hơn, VirtualCenter cho phép ứng dụng đăng ký dưới dạng tiện ích mở rộng. Đơn đăng ký có thể đăng ký chứng nhận tại thời điểm đăng ký (setCertificate). Sau đó, ứng dụng có thể đăng nhập vào VirtualCenter bằng cách sử dụng chứng chỉ của nó (phương thức loginExtensionByCertificate()) và do đó không cần lưu trữ tên người dùng và mật khẩu. Tuy nhiên, để làm việc này, ứng dụng khách (ứng dụng của tôi) phải gửi chứng chỉ như là một phần của kết nối SSL của nó, mặc dù máy chủ (VirtualCenter) không yêu cầu đặc biệt.
Tôi đang viết ứng dụng của mình bằng Java. Tạo trình quản lý khóa của riêng tôi, nối nó với kho khóa của tôi và chỉ định bí danh để sử dụng. Sau đó, khởi tạo bối cảnh ssl của tôi để sử dụng trình quản lý khóa đó. Trong các ổ cắm được tạo ra, tôi thấy SSLContext của họ có trình quản lý khóa của tôi trong chúng. Tuy nhiên, tôi không thấy người quản lý khóa đó từng được gọi để lấy chứng chỉ. Đối với một số lý do, các ổ cắm không cảm thấy nó cần phải gửi một cert.
Tôi hiểu rằng máy chủ có thể yêu cầu khách hàng trình bày chứng chỉ của nó. Trong trường hợp này, nó không xảy ra. Những gì tôi đang tự hỏi liệu có một cách để buộc các ổ cắm được tạo ra để trình bày một cert bất kể cho dù máy chủ yêu cầu nó.
Tôi khuyên bạn nên gỡ lỗi bắt tay bằng cách sử dụng '-Djavax.net.debug = ssl' hoặc ít nhất là' Djavax.net.debug = ssl: handshake' để xem bạn có nhận được 'CertificateRequest' hay không và kiểm tra danh sách' certificate_authorities' Nó chứa. – Bruno