2011-12-26 38 views
7

Có thể dễ dàng đính kèm chứng chỉ ứng dụng khách vào một bản khai Axis2 được tạo bằng cách sử dụng wsdl2java không? Tôi cần phải tự động thay đổi chứng chỉ ứng dụng theo từng yêu cầu, do đó, việc lưu trữ nó đơn giản trong kho khóa sẽ không hoạt động cho trường hợp của chúng tôi.Đính kèm chứng chỉ ứng dụng khách với Axis2?

Tôi đã tìm thấy các ví dụ trong đó việc này đang được thực hiện cho các cuộc gọi không SOAP, nhưng không thể tìm thấy bất kỳ điều gì liên quan đến việc sử dụng các nhánh máy khách Axis. Cố gắng để hack XML cho cuộc gọi SOAP là một lựa chọn tôi đoán, albiet một đau đớn! Than van!

+0

¿này sẽ đưa vào tài khoản mà bạn cần giấy chứng nhận hiện tại để lấy một tin nhắn với giấy chứng nhận mới? Ngoài ra, máy khách WS phải có khả năng thay thế chứng chỉ trong kho khóa bởi vì nó không thể sống bên ngoài kho khóa và giữ nguyên java. – Alfabravo

Trả lời

6

Nếu bạn muốn thay đổi giấy chứng nhận được sử dụng tùy thuộc vào kết nối được thực hiện, bạn sẽ cần phải cấu hình một SSLContext làm như vậy, như mô tả trong câu trả lời này: https://stackoverflow.com/a/3713147/372643

Theo như tôi biết, Axis 2 sử dụng Apache HttpClient 3.x, vì vậy bạn sẽ cần phải làm theo cách của nó để cấu hình SSLContext (và X509KeyManager nếu cần). Cách dễ nhất có thể là định cấu hình trình xử lý giao thức https toàn cầu của Apache HttpClient với SSLContext của bạn, được thiết lập với cấu hình X509KeyManager để chọn chứng chỉ ứng dụng khách theo yêu cầu của bạn (qua chooseClientAlias).

Nếu tổ chức phát hành và kết nối Socket (có thể là địa chỉ từ xa) không đủ để quyết định chọn chứng chỉ nào, bạn có thể cần phải thực hiện một logic phức tạp hơn, gần như chắc chắn sẽ yêu cầu đồng bộ hóa cẩn thận với phần còn lại của ứng dụng của bạn.

EDIT:

Một khi bạn đã xây dựng SSLContext của bạn và X509KeyManager, bạn cần phải vượt qua chúng để Apache HttpClient 3.x. Đối với điều này, bạn có thể xây dựng SecureProtocolSocketFactory của riêng bạn, mà sẽ xây dựng các ổ cắm từ này SSLContext (thông qua một SSLSocketFactory, xem SSLContext phương pháp). Có các ví dụ trong số Apache HttpClient 3.x SSL guide. Tránh EasySSLProtocolSocketFactory, vì nó sẽ không kiểm tra bất kỳ cert máy chủ nào (do đó cho phép tấn công MITM). Bạn cũng có thể thử this implementation.

Lưu ý rằng bạn chỉ thực sự cần phải tùy chỉnh X509KeyManager của bạn, bạn có thể khởi tạo của bạn SSLContext (thông qua init) với null cho các thông số khác để giữ các giá trị mặc định (đặc biệt là các thiết lập niềm tin mặc định).

Sau đó, "cài đặt" SecureProtocolSocketFactory này trên toàn cầu cho Apache HttpClient 3.x sử dụng một cái gì đó như thế này:

Protocol.registerProtocol("https", new Protocol("https", 
    (ProtocolSocketFactory)secureProtocolSocketFactory, 443)); 
+0

Cảm ơn, thông tin hữu ích. Vì vậy, tôi cần phải làm điều này: 'httpclient.getHostConfiguration(). SetHost (" www.whatever.com ", 443, myhttps);' Làm thế nào để có được giữ của httpClient trong Axis2 - Tôi đã có một org.apache. axis2.client.Stub và ServiceClient, nhưng làm cách nào để giữ lại httpClient cơ bản từ các trường hợp này? – Sunny

+0

Tôi đã thử một cách tiếp cận tương tự như bài đăng khác http://stackoverflow.com/a/6469030/420611 Nhưng tôi tiếp tục nhận được ngoại lệ này bất kể tôi có sử dụng 'EasySSLProtocolSocketFactory' hoặc' StrictSSLProtocolSocketFactory': org.apache.commons hay không. ssl.ProbablyBadPasswordException: Có thể là mật khẩu JKS-Key xấu: java.security.UnrecoverableKeyException: Mật khẩu không được rỗng – Sunny

+0

@Sunny, có vẻ như vấn đề về mật khẩu trên kho khóa của bạn.Độc lập với 'X509KeyManager' của bạn, bạn sẽ cần có khả năng tải khóa cá nhân và chứng chỉ từ kho khóa của bạn một lần vào' bí danh'. Bạn có thể xem xét "gói" mặc định 'X509KeyManager' và chỉ ghi đè lên logic của bạn để chọn bí danh (bạn có thể sử dụng [this] (http://code.google.com/p/jsslutils/source/browse/trunk/jsslutils /src/main/java/org/jsslutils/sslcontext/keymanagers/FixedServerAliasKeyManager.java) làm điểm bắt đầu, ngoại trừ bí danh ứng dụng khách). – Bruno

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