記憶永続化用のメモブログ

脳内に揮発性記憶領域しかないことに気づいたので作成

Jmeterで自動でテストケースを作成する

JavaからHttpClient4.3でJmeterのProxyを設定してアクセスしたときに少しだけはまったのでメモ

  1. まずJmeterGUIを開いて「ワークベンチのコンテキストメニュー(右クリック) -> 追加 -> Httpプロキシサーバ」で必要な項目を入力する 
    (Global SettingとかHTTP Sampler settingsとか)
  2. 「↑で作ったプロキシサーバのコンテキストメニュー -> 追加 -> 設定エレメント -> HTTPリクエスト初期値設定」で必要な項目を入力する
  3. Httpプロキシサーバの「開始」を押す

そうするとjmeterのインストールディレクトリの中のbinにcrtファイル※1が作成される。(ポップアップで通知される)
とりあえず無視して下のような感じでJAvaのHttpClient4.3でProxyにJmeterのHttpProxyを指定して実行してみた。(プロキシサーバのポートには8081を設定)

そうすると以下のようなエラーが出た

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1886)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:270)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1341)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:153)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:804)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:280)
at org.apache.http.impl.conn.HttpClientConnectionOperator.upgrade(HttpClientConnectionOperator.java:167)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.upgrade(PoolingHttpClientConnectionManager.java:329)
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:392)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:218)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:194)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:85)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:186)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57)
at HttpClientHttpsProxyTest.init(HttpClientHttpsProxyTest.java:xxx)
at HttpClientHttpsProxyTest.main(HttpClientHttpsProxyTest.java:xxx)
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:385)
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
at sun.security.validator.Validator.validate(Validator.java:260)
at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:326)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:231)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:126)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1323)
... 21 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:196)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:268)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:380)
... 27 more

調べてみると
http://www.melange.co.jp/blog/?p=2345
の記事にたどり着いて(助かりました!)、この記事の通りに※1のcrtファイルをimportcertしてみる

# MacOSで実行時
keytool -importcert -v -trustcacerts -file /Applications/apache-jmeter-2.11/bin/ApacheJMeterTemporaryRootCA.crt -keystore /Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home/jre/lib/security/jssecacerts

んで再びアクセスしたらうまくいった