7

HTTP 要求を実行し、Java を使用して X.509 証明書で署名するにはどうすればよいですか?

私は通常、C# でプログラミングします。今、私がやりたいことは、Java のみで、次のようなものです。

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

Java でjava.security.cert.X509Certificateインスタンスを作成しましたが、それを HTTP リクエストに関連付ける方法がわかりません。java.net.URL インスタンスを使用して HTTP リクエストを作成できますが、証明書をそのインスタンスに関連付けることができないようです (また、java.net.URL の使用が適切かどうかもわかりません)。

4

3 に答える 3

2

私はC#プログラマーではありませんが、コードがHTTPS / TLSを使用して呼び出しを行い、認証用のクライアント証明書を提供していると思いますか?別名、WS-Securityの使用方法を尋ねているのではありませんか?

その場合、ここここでの答えはあなたに役立つと思います。証明書をp12クライアントキーストアにインポートするには、opensslユーティリティを使用する必要があります。サーバーが非標準のCAまたは自己署名証明書を使用している場合は、それらの証明書を使用してクライアントトラストストアも設定する必要があります。

この時点で、私がリンクした質問を見てください。多数のJVM引数を指定する必要があります。最後に、(標準のJavaオブジェクトまたはhttpclientを使用して)もう一度呼び出しを試みます。トラストストアが正しい場合、クライアントはサーバー証明書を受け入れる必要があり、サーバーはクライアント証明書を要求する必要があります。キーストアが正しく設定されていれば、クライアントはX.509クライアント証明書で認証され、準備が整います。

于 2010-05-26T21:22:43.203 に答える
1

クライアント証明書認証でHTTPSを使用しようとしているようです。サーバーがこれを要求するように構成されていると想定しています(クライアント証明書はサーバーによってのみ要求できるため)。

Javaでは、java.security.cert.X509Certificate実際には単なる証明書(秘密鍵を含まない公開鍵証明書)です。クライアント側で必要なのは、それを使用して秘密鍵を構成することです。秘密鍵と証明書がキ​​ーストアにあり(簡単にするために、そのキーストアには、秘密鍵を持つ適切な証明書が1つだけ、おそらくチェーン内の他の証明書があると仮定します)、デフォルトを使用していると仮定します。トラストストア:

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必要に応じて、システムプロパティを使用することもできます。)

于 2010-07-06T02:59:02.320 に答える
1

Apache Commonsのオープン ソースHttpClientライブラリをお勧めします。このユースケースと他の多くのユースケースをカバーしています。

于 2010-05-26T20:57:36.237 に答える