2016-02-06 22 views
5

クライアント鍵認証を実装しようとしています(自己署名入りのcaを使用)。HttpClientを使用したクライアント認証

コードは次のようになります。私はそれが正しく私の証明書を選択します見ることができます-Djavax.net.debug=all

KeyStore keyStore = KeyStore.getInstance("PKCS12"); 
keyStore.load(new FileInputStream("client.p12"), "changeit".toCharArray()) 

SSLContext sslcontext = SSLContexts.custom() 
      .loadTrustMaterial(null, new TrustSelfSignedStrategy()) //DONT DO THAT, IT'S JUST TO SIMPLIFY THIS EXAMPLE. USE REAL TrustStore WITH REAL SERVER CERTIFICATE IMPORTED. DONT TRUST SELF SIGNED 
      .loadKeyMaterial(keyStore, "changeit".toCharArray()) 
      .build(); 
socketFactory = new SSLConnectionSocketFactory(
      sslcontext, 
      new String[] {"TLSv1.2", "TLSv1.1"}, 
      null, 
      new NoopHostnameVerifier() 
); 
HttpClient httpclient = HttpClients.custom() 
      .setSSLSocketFactory(socketFactory) 
      .build(); 

、私が署名、私は証明書の要求を見て、そこにECDHClientKeyExchangeなどを参照してください、すべてが正常に見えます。

しかし、いずれにせよ、私は(ステータス400で)nginxのからの次の応答を取得しています:

<head><title>400 The SSL certificate error</title></head> 

お知らせを、間違った証明書/キーnginxのは、通常、W/Oプレーンテキスト応じて任意の詳細を提供する、セッションをドロップすること。

のようなコマンドラインからこのclient.p12作品、:

$ curl -ivk --cert client.p12:changeit https://192.168.1.1 


* Rebuilt URL to: https://192.168.1.1/ 
* Trying 192.168.1.1... 
* Connected to 192.168.1.1 (192.168.1.1) port 443 (#0) 
* WARNING: SSL: Certificate type not set, assuming PKCS#12 format. 
* Client certificate: client-es.certs.my 
* TLS 1.2 connection using TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 
* Server certificate: server.certs.my 
* Server certificate: ca.my 
> GET/HTTP/1.1 
> Host: 192.168.1.1 
> User-Agent: curl/7.43.0 
> Accept: */* 
> 
< HTTP/1.1 200 OK 

だから、このキーは間違いなく有効です。しかし、なぜJavaではうまくいかないのですか?私はjava SSLの設定で見逃していることは何ですか?

+0

証明書がキ​​ーストアにインポートされていますか? – STaefi

+0

これは 'client.p12'から直接ロードされます。私もキーストアにインポートしようとしましたが、何も変わりません –

答えて

2

問題は、私のクライアントキーがキーチェーンに署名証明書も含めていることでした。それは私のクライアント(認証に必要な)証明書が、証明書のチェーン全体だけではなく(もちろんキーなしで、単に証明書)

た:

> Root CA cert -> Client CA cert -> Client key + cert 

私はJavaが、この時に間違った証明書を使用して推測します大文字と小文字の区別があります。

p12またはkeychainにクライアントの鍵と証明書のみを追加することで、中間体なしで修正されました。

には-certfileのオプションがありません(これまでは持っていました)。ちょうどクライアントキー/証明書。正しいエクスポート・コマンドである:

openssl pkcs12 -export \ 
    -in client.crt -inkey client.key \ 
    -out client.p12 

このclient.p12はその後、キーチェーンにインポートすることができます

keytool -importkeystore \ 
    -deststorepass changeit -destkeystore keystore \ 
    -srckeystore client.p12 -srcstoretype PKCS12 -srcstorepass changeit 

とカスタム認証のためにうまく働きました。

+0

これはNGINXと関係があると思います。私たちはF5とNGINXを持っています。 NGINXと通信するためにこの変更を加えるだけです。私は証明書を変更するのではなく、修正するためにNGINXにどのような変更を加えることができるかを学びたいと思います。 –

関連する問題