QA@IT

JAVA 7上からTLSv1.2接続について

24091 PV

JAVAからHTTPS TLSv1.2認証サーバーへ接続を行いたいのですがなかなかうまくいきません。
ブラウザ上からはTLS1.2で接続できているようですが、
JAVAから接続ができない状態です。

IE、Chromeから接続できるところを見るとサーバーの設定は間違っているようには見えないのですが…
JAVA側の設定が足りてないのでしょうか?

環境

  • Win7pro 32bit
  • JAVA7 u25
  • Apache 2.4.6 with OpenSSL 1.0.1e

証明書

下記URL参考に
CA、サーバー証明書、クライアント証明書の作成
http://www015.upp.so-net.ne.jp/unixlife/practical/openssl.html

クライアント側設定

JAVAへ証明書のインポート

keytool -import -trustcacerts -keystore  "%JAVA_HOME%/jre/lib/security/cacerts" -file "CA\cacert.pem"
keytool -importkeystore -trustcacerts -destkeystore "%JAVA_HOME%/jre/lib/security/cacerts" -srcstoretype PKCS12 -srckeystore "CLIENT\clcert.p12"

Windowsへ証明書のインポート

CLIENT\clcert.p12を取り込み

サーバー側設定

TLS1.2のみ許可する設定に変更
conf\extra\httpd-ssl.conf

SSLProtocol TLSv1.2
SSLCertificateFile "conf/SSLdata/SERVER/cert.pem"
SSLCertificateKeyFile "conf/SSLdata/SERVER/servernopass.key"
SSLCertificateChainFile "conf/SSLdata/CA/cacert.pem"
SSLCACertificatePath "conf/SSLdata/CA"
SSLCACertificateFile "conf/SSLdata/CA/cacert.pem"
SSLCARevocationPath "conf/SSLdata/CLIENT"
SSLCARevocationFile "conf/SSLdata/CLIENT/clcert.pem"
SSLVerifyClient optional

ブラウザで確認

IE

IE8の設定でTLS1.2使用にチェック
https://localhost/ にアクセス
「It works!」が表示される
ページプロパティでは
「TLS 1.2、AES / 128 ビット暗号 (高); RSA / 1024 ビット交換」
Apacheログ

[12/Sep/2013:15:31:56 +0900] ::1 TLSv1.2 AES128-SHA256 "GET / HTTP/1.1" -

GoogleChrome

https://localhost/ にアクセス
「It works!」が表示される
ページ情報はECDHE_RSA AES_256_CBC SHA
この接続はTLS 1.2を使用していますと表記
Apacheログ

[12/Sep/2013:15:31:25 +0900] ::1 TLSv1.2 ECDHE-RSA-AES256-SHA "GET / HTTP/1.1" 46

JAVAで確認

http://x68000.q-e-d.net/~68user/net/java-http-url-connection-1.html
こちらのHttpClientHttpURLConnection ソースを拝借いたしまして
javax.net.ssl.HttpsURLConnectionで接続するように変更
https://localhost/へ接続

D:\>java HttpClientHttpURLConnection
Exception in thread "main" javax.net.ssl.SSLException: Received fatal alert: protocol_version
        at sun.security.ssl.Alerts.getSSLException(Unknown Source)
        at sun.security.ssl.Alerts.getSSLException(Unknown Source)
        at sun.security.ssl.SSLSocketImpl.recvAlert(Unknown Source)
        at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
        at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
        at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
        at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
        at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(Unknown Source)
        at HttpClientHttpURLConnection.main(HttpClientHttpURLConnection.java:21)

試しにApache設定変更

conf\extra\httpd-ssl.conf

SSLProtocol ALL

確認

IE

「It works!」
TLS 1.2、AES / 128 ビット暗号 (高); RSA / 1024 ビット交換
Apacheログ

[12/Sep/2013:15:31:56 +0900] ::1 TLSv1.2 AES128-SHA256 "GET / HTTP/1.1" -

Chrome

「It works!」
TLS1.2 ECDHE_RSA AES_256_CBC SHA
Apacheログ

[12/Sep/2013:15:31:25 +0900] ::1 TLSv1.2 ECDHE-RSA-AES256-SHA "GET / HTTP/1.1" 46

JAVA

D:\>java HttpClientHttpURLConnection
レスポンスヘッダ:
  null: [HTTP/1.1 200 OK]
  ETag: ["2e-432a5e4a73a80"]
  Date: [Thu, 12 Sep 2013 06:23:50 GMT]
  Content-Length: [46]
  Last-Modified: [Mon, 11 Jun 2007 18:53:14 GMT]
  Keep-Alive: [timeout=5, max=100]
  Content-Type: [text/html]
  Connection: [Keep-Alive]
  Accept-Ranges: [bytes]
  Server: [Apache/2.4.6 (Win32) OpenSSL/1.0.1e]
レスポンスコード[200] レスポンスメッセージ[OK]

---- ボディ ----
<html><body><h1>It works!</h1></body></html>

Apacheログ

[12/Sep/2013:15:23:50 +0900] 127.0.0.1 TLSv1 ECDHE-RSA-AES256-SHA "GET / HTTP/1.1" 46

回答

自己解決

d:\>java -Dhttps.protocols="TLSv1.2" HttpClientHttpURLConnection
レスポンスヘッダ:
  null: [HTTP/1.1 200 OK]
  ETag: ["2e-432a5e4a73a80"]
  Date: [Thu, 12 Sep 2013 07:43:09 GMT]
  Content-Length: [46]
  Last-Modified: [Mon, 11 Jun 2007 18:53:14 GMT]
  Keep-Alive: [timeout=5, max=100]
  Content-Type: [text/html]
  Connection: [Keep-Alive]
  Accept-Ranges: [bytes]
  Server: [Apache/2.4.6 (Win32) OpenSSL/1.0.1e]
レスポンスコード[200] レスポンスメッセージ[OK]

---- ボディ ----
<html><body><h1>It works!</h1></body></html>

なんてこったい!

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。