2010-05-26 13 views
6

Làm cách nào để thực hiện yêu cầu HTTP và ký nó với chứng chỉ X.509 bằng Java?Làm cách nào để ký yêu cầu HTTP có chứng chỉ X.509 trong Java?

Tôi thường lập trình bằng C#. Bây giờ, những gì tôi muốn làm là một cái gì đó tương tự như sau, chỉ trong Java:

private HttpWebRequest CreateRequest(Uri uri, X509Certificate2 cert) 
{ 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri); 
    request.ClientCertificates.Add(cert); 
    /* ... */ 
    return request; 
} 

Trong Java Tôi đã tạo ra một trường hợp java.security.cert.X509Certificate nhưng tôi không thể tìm ra cách để kết hợp nó với một yêu cầu HTTP. Tôi có thể tạo một yêu cầu HTTP bằng cách sử dụng một cá thể java.net.URL, nhưng tôi dường như không thể liên kết chứng chỉ của tôi với cá thể đó (và tôi không chắc liệu sử dụng java.net.URL có thích hợp không).

+0

Một trong các đề xuất này có hoạt động không? – jasonmp85

Trả lời

1

Tôi muốn giới thiệu thư viện mã nguồn mở HttpClient từ Apache Commons. Bao gồm trường hợp sử dụng này và nhiều trường hợp khác.

+0

404 Không tìm thấy ... – Tomas

+1

Đã sửa lỗi. Hy vọng nó giúp! –

2

Tôi không phải là lập trình viên C#, nhưng tôi cho rằng mã đó thực hiện cuộc gọi bằng HTTPS/TLS và cung cấp chứng chỉ ứng dụng khách để xác thực? Aka, bạn không hỏi cách sử dụng WS-Security, phải không?

Trong trường hợp đó, tôi nghĩ câu trả lời là herehere sẽ được sử dụng cho bạn. Bạn cần sử dụng tiện ích openssl để nhập chứng chỉ của bạn vào kho khóa khách hàng p12. Nếu máy chủ của bạn đang sử dụng CA không chuẩn hoặc cert tự ký, bạn cũng sẽ cần phải thiết lập một truststore của khách hàng với các chứng chỉ đó.

Tại thời điểm này, hãy xem các câu hỏi tôi đã liên kết: bạn sẽ cần xác định toàn bộ các đối số JVM. Cuối cùng, hãy thử thực hiện lại cuộc gọi của bạn (sử dụng các đối tượng Java chuẩn hoặc httpclient). Khách hàng nên chấp nhận cert máy chủ nếu truststore của bạn là chính xác và máy chủ nên yêu cầu một cert của khách hàng. Nếu kho khóa của bạn được thiết lập chính xác, ứng dụng khách đã xác thực với chứng chỉ ứng dụng khách X.509 và bạn sẽ sẵn sàng sử dụng.

1

Dường như bạn đang cố gắng sử dụng HTTPS với xác thực chứng chỉ ứng dụng khách. Tôi giả định rằng máy chủ của bạn được cấu hình để yêu cầu điều này (vì chứng chỉ máy khách chỉ có thể được yêu cầu bởi máy chủ).

Trong Java, java.security.cert.X509Certificate thực sự chỉ là chứng chỉ (chứng chỉ khóa công khai, không có khóa riêng). Những gì bạn cần ở phía máy khách là cấu hình khóa riêng với nó. Giả sử rằng khóa cá nhân và chứng chỉ của bạn nằm trong kho khóa (để đơn giản hóa, tôi giả sử chỉ có một chứng chỉ phù hợp với khóa riêng của nó, có thể với các chứng chỉ khác trong chuỗi, trong kho khóa đó) và bạn đang sử dụng cửa hàng tin cậy mặc định:

KeyStore ks = ... 
/* load the keystore */ 

KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); 
kmf.init(ks, password); 

SSLContext sslContext = SSLContext.getInstance("TLS"); 
sslContext.init(kmf.getKeyManagers(), null, null); 

URL url = new URL("https://example/"); 
HttpsURLConnection connection = (HttpsURLConnection)url.openConnection(); 

connection.setSSLSocketFactory(sslContext.getSSLSocketFactory()); 

thư viện khác sẽ cho phép bạn thiết lập các SSLContext hoặc KeyStore hơi khác nhau, nhưng các nguyên tắc cần được như vậy.

(Bạn cũng có thể sử dụng thuộc tính hệ thống javax.net.ssl.keyStore nếu thích hợp.)