2010-05-26 3 views
6

HTTP 요청을 수행하고 Java를 사용하여 X.509 인증서로 서명하려면 어떻게합니까?Java에서 X.509 인증서로 HTTP 요청을 서명하려면 어떻게합니까?

나는 보통 C# 프로그램을 사용합니다. 자바에서 나는 java.security.cert.X509Certificate 인스턴스를 만든하지만 난 HTTP 요청에 연결하는 방법을 알아낼 수 없습니다

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

: 자, 내가 뭘하고 싶은 유일한 자바에서 다음과 유사한이다. java.net.URL 인스턴스를 사용하여 HTTP 요청을 만들 수 있지만 인증서를 해당 인스턴스와 연결할 수없는 것 같습니다 (java.net.URL 사용 여부도 알 수 없습니다).

+0

는 이러한 제안 중 하나가 작동 했습니까? – jasonmp85

답변

1

Apache Commons의 오픈 소스 HttpClient 라이브러리를 권하고 싶습니다. 이 유스 케이스와 다른 많은 사례를 다룹니다.

+0

404 찾을 수 없음 ... – Tomas

+1

수정 됨. 희망이 도움이됩니다! –

2

저는 C# 프로그래머가 아니지만 코드가 HTTPS/TLS를 사용하여 전화를 걸고 인증을위한 클라이언트 인증서를 제공한다고 가정하고 있습니까? 일명, 당신은 WS-Security 사용법을 묻지 않고있다.

그 경우에는 대답 herehere이 유용 할 것입니다. openssl 유틸리티를 사용하여 인증서를 p12 클라이언트 키 저장소로 가져와야합니다. 서버가 비표준 CA 또는 자체 서명 된 인증서를 사용하는 경우 해당 인증서로 클라이언트 신뢰 저장소를 설정해야합니다.

내가 링크 한 질문을 살펴 보자. 전체 JVM 인수를 지정해야한다. 마지막으로, 표준 Java 오브젝트 또는 httpclient를 사용하여 다시 호출하십시오. 트러스트 스토어가 정확하고 서버가 클라이언트 인증서를 요청해야하는 경우 클라이언트는 서버 인증서를 수락해야합니다. 키 스토어가 올바르게 설정되면 클라이언트는 X.509 클라이언트 인증서로 인증을 받아야합니다.

1

클라이언트 인증서 인증과 함께 HTTPS를 사용하려는 것 같습니다. 나는 (클라이언트 인증서가 서버에 의해서만 요구 될 수 있기 때문에) 당신의 서버가 이것을 요구하도록 구성되어 있다고 가정하고있다.

Java에서 java.security.cert.X509Certificate은 실제로 인증서 (개인 키가없는 공개 키 인증서)입니다. 클라이언트 측에서 필요한 것은 개인 키를 구성하는 것입니다. 개인 키와 인증서가 키 저장소에 있다고 가정하면 (단순화하기 위해 해당 개인 키와 함께 적합한 인증서가 하나 뿐이고 체인의 다른 인증서가 해당 키 저장소에있는 것으로 가정하고 있음) 기본 신뢰 저장소 :

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()); 

다른 라이브러리는 당신이 SSLContext 또는 KeyStore 약간 다르게 설정 할 수 있지만 기본 원칙은 동일해야합니다.

(적절하다면 당신은 또한 javax.net.ssl.keyStore 시스템 속성을 사용할 수 있습니다.)