JMeterガイド - SSL

クライアント証明書を要求するサーバへのアクセス方法


HTTPサンプラーを使った時は、作成したクライアント証明書(.p12)を
[メニュー]-[オプション]-[SSLマネージャ]
で選択するだけでサーバとの通信が可能になりました。


HTTPサンプラー(HTTPClient)ではこの方法ではサーバにアクセスできませんでした。


以下は、この問題を解決するまでの調査ログです。
最終的には解決(暫定案?)までたどり着きました。


使用したクライアント証明書

  • 事前に用意したクライアント証明書
    • C:/bin/xampp/apache/conf/ssl/users/web_korogi_cert.p12
  • クライアント証明書に設定したパスワード文字列
    • ninshou

step1

  • アクセス成功
  • Httpサンプラー
  • .p12ファイルをjmeter.properetiesで指定した。(1行のみ)
javax.net.ssl.keyStore=C:/bin/xampp/apache/conf/ssl/users/web_korogi_cert.p12
  • GUIのSSLマネージャは使わない。
  • 実行ボタンを押したときにパスワードを訊かれる(ninshouと入力した)

jmeter.log
2006/11/14 00:00:18 INFO - jmeter.threads.JMeterThread: Thread スレッドグループ 1-1 started 2006/11/14 00:00:18 INFO - jmeter.util.SSLManager: KeyStore Type: PKCS 12 2006/11/14 00:00:25 INFO - jmeter.util.SSLManager: JmeterKeyStore Location: C:/bin/xampp/apache/conf/ssl/users/web_korogi_cert.p12 2006/11/14 00:00:25 INFO - jmeter.util.SSLManager: JmeterKeyStore type: class org.apache.jmeter.util.keystore.DefaultKeyStore 2006/11/14 00:00:25 INFO - jmeter.util.JsseSSLManager: class org.apache.jmeter.util.keystore.DefaultKeyStore 2006/11/14 00:00:25 INFO - jmeter.util.SSLManager: TrustStore Type: JKS 2006/11/14 00:00:25 INFO - jmeter.util.SSLManager: TrustStore Location: 2006/11/14 00:00:25 INFO - jmeter.util.SSLManager: TrustStore type: class org.apache.jmeter.util.keystore.DefaultKeyStore 2006/11/14 00:00:25 INFO - jmeter.util.JsseSSLManager: JsseSSLManager installed 2006/11/14 00:00:25 INFO - jmeter.util.JsseSSLManager: WrappedX509Manager: getCertificateChain(xxx.com) 2006/11/14 00:00:25 INFO - jmeter.util.JsseSSLManager: WrappedX509Manager: getPrivateKey: Sun RSA private CRT key, 1024 bits (略) 2006/11/14 00:00:26 INFO - jmeter.threads.JMeterThread: Thread スレッドグループ 1-1 is done

step2

  • アクセス成功
  • Httpサンプラー
  • .p12ファイルをGUIのSSLマネージャで選択した。
    • 選択ボタンを押したときにパスワードを訊かれる(ninshouと入力した)
  • jmeter.propertiesはいじらない。

jmeter.log
2006/11/14 00:05:40 INFO - jmeter.util.SSLManager: KeyStore Type: PKCS 12 2006/11/14 00:05:44 INFO - jmeter.util.SSLManager: JmeterKeyStore Location: C:\bin\xampp\apache\conf\ssl\users\web_korogi_cert.p12 2006/11/14 00:05:44 INFO - jmeter.util.SSLManager: JmeterKeyStore type: class org.apache.jmeter.util.keystore.DefaultKeyStore 2006/11/14 00:05:44 INFO - jmeter.util.JsseSSLManager: class org.apache.jmeter.util.keystore.DefaultKeyStore 2006/11/14 00:05:44 INFO - jmeter.util.SSLManager: TrustStore Type: JKS 2006/11/14 00:05:44 INFO - jmeter.util.SSLManager: TrustStore Location: 2006/11/14 00:05:44 INFO - jmeter.util.SSLManager: TrustStore type: class org.apache.jmeter.util.keystore.DefaultKeyStore 2006/11/14 00:05:44 INFO - jmeter.util.JsseSSLManager: JsseSSLManager installed 2006/11/14 00:05:48 INFO - jmeter.engine.StandardJMeterEngine: Listeners will be started after enabling running version 2006/11/14 00:05:48 INFO - jmeter.engine.StandardJMeterEngine: To revert to the earlier behaviour, define jmeterengine.startlistenerslater=false 2006/11/14 00:05:48 INFO - jmeter.engine.StandardJMeterEngine: Running the test! 2006/11/14 00:05:48 INFO - jmeter.gui.util.JMeterMenuBar: setRunning(true,local) 2006/11/14 00:05:48 INFO - jmeter.engine.StandardJMeterEngine: Starting 1 threads for group スレッドグループ. Ramp up = 1. 2006/11/14 00:05:48 INFO - jmeter.engine.StandardJMeterEngine: Continue on error 2006/11/14 00:05:48 WARN - jmeter.threads.JMeterThread: jmeterthread.startearlier=true (see jmeter.properties) 2006/11/14 00:05:48 INFO - jmeter.threads.JMeterThread: Thread スレッドグループ 1-1 started 2006/11/14 00:05:50 INFO - jmeter.util.JsseSSLManager: WrappedX509Manager: getCertificateChain(xxx.com) 2006/11/14 00:05:50 INFO - jmeter.util.JsseSSLManager: WrappedX509Manager: getPrivateKey: Sun RSA private CRT key, 1024 bits (略) 2006/11/14 00:05:52 INFO - jmeter.threads.JMeterThread: Thread スレッドグループ 1-1 is done

step3

  • アクセス失敗
  • Httpサンプラー(HTTPClient)
  • .p12ファイルをGUIのSSLマネージャで選択した。
    • 選択ボタンを押したときにパスワードを訊かれる(ninshouと入力した)
  • jmeter.propertiesはいじらない。

jmeter.log
javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.handleException(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.handleException(Unknown Source) at com.sun.net.ssl.internal.ssl.AppOutputStream.write(Unknown Source) at java.io.BufferedOutputStream.flushBuffer(Unknown Source) at java.io.BufferedOutputStream.flush(Unknown Source) at org.apache.commons.httpclient.HttpConnection.flushRequestOutputStream(HttpConnection.java:827) at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:1975) at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:993) at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:397) at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:170) at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:396) at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:324) at org.apache.jmeter.protocol.http.sampler.HTTPSampler2.sample(HTTPSampler2.java:527) at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:658) at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:647) at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:247) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty at sun.security.validator.PKIXValidator.<init>(Unknown Source) at sun.security.validator.Validator.getInstance(Unknown Source) at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.getValidator(Unknown Source) at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source) at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(Unknown Source) at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source) at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source) at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source) at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(Unknown Source) ... 15 more Caused by: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty at java.security.cert.PKIXParameters.setTrustAnchors(Unknown Source) at java.security.cert.PKIXParameters.<init>(Unknown Source) at java.security.cert.PKIXBuilderParameters.<init>(Unknown Source) ... 27 more

step3の追加調査

ここで
the trustAnchors parameter must be non-empty
をgoogleで検索した。

http://forum.java.sun.com/thread.jspa?threadID=580...
System.setProperty("javax.net.ssl.trustStore","samplecacerts"); System.setProperty("javax.net.ssl.trustStorePassword","changeit");
こんなような記述が見つかる。つまり、trustStorePasswordというパラメータ名でパスワードを指定することで、non-emptyなパスワードパラメータを設定できて、それによって解決できるっぽい。
ということでstep4へ

step4

  • アクセス成功
  • Httpサンプラー(HTTPClient)
    • .p12ファイルをGUIのSSLマネージャで選択した。
    • 選択ボタンを押したときにパスワードを訊かれる(ninshouと入力した)
  • jmeter.propertiesには2行追加。
javax.net.ssl.trustStore=C:/jdk1.5.0_07/jre/lib/security/cacerts
    • このcacertsファイルにはサーバ証明書を追加している(どのファイルをどのコマンドを使って追加したかは後述する。とても大事だから。)
javax.net.ssl.trustStorePassword=changeit

jmeter.log
2006/11/14 01:02:56 INFO - jmeter.util.SSLManager: KeyStore Type: PKCS 12 2006/11/14 01:02:59 INFO - jmeter.util.SSLManager: JmeterKeyStore Location: C:\bin\xampp\apache\conf\ssl\users\web_korogi_cert.p12 2006/11/14 01:02:59 INFO - jmeter.util.SSLManager: JmeterKeyStore type: class org.apache.jmeter.util.keystore.DefaultKeyStore 2006/11/14 01:02:59 INFO - jmeter.util.JsseSSLManager: class org.apache.jmeter.util.keystore.DefaultKeyStore 2006/11/14 01:02:59 INFO - jmeter.util.SSLManager: TrustStore Type: JKS 2006/11/14 01:02:59 INFO - jmeter.util.SSLManager: TrustStore Location: C:/jdk1.5.0_07/jre/lib/security/cacerts 2006/11/14 01:02:59 INFO - jmeter.util.SSLManager: TrustStore type: class org.apache.jmeter.util.keystore.DefaultKeyStore 2006/11/14 01:02:59 INFO - jmeter.util.JsseSSLManager: AlwaysTrustManager alias: xxx.com 2006/11/14 01:02:59 INFO - jmeter.util.JsseSSLManager: INSTALLED 2006/11/14 01:02:59 INFO - jmeter.util.JsseSSLManager: AlwaysTrustManager alias: entrustclientca 2006/11/14 01:02:59 INFO - jmeter.util.JsseSSLManager: INSTALLED 2006/11/14 01:02:59 INFO - jmeter.util.JsseSSLManager: AlwaysTrustManager alias: verisignclass3g2ca 2006/11/14 01:02:59 INFO - jmeter.util.JsseSSLManager: INSTALLED
(略)
2006/11/14 01:03:00 INFO - jmeter.util.JsseSSLManager: JsseSSLManager installed

step4の考察

HTTPサンプラー(HTTPClient)でアクセスできたということは、SOAP/XML-RPCサンプラー(HTTPサンプラー(HTTPclient)を拡張(extend)して作られている)でもOKだろう。ということでstep5へ。

step5

  • アクセス成功
  • SOAP/XML-RPCサンプラー
  • .p12ファイルをGUIのSSLマネージャで選択した。
    • 選択ボタンを押したときにパスワードを訊かれる(ninshouと入力した)
  • jmeter.propertiesには2行追加。
javax.net.ssl.trustStore=C:/jdk1.5.0_07/jre/lib/security/cacerts
    • このcacertsファイルにはサーバ証明書を追加している(どのファイルをどのコマンドを使って追加したかは後述する。とても大事だから。)
javax.net.ssl.trustStorePassword=changeit
    • jdkにデフォルトでついてきているcacertのパスワードはchangeitとなっている。

jmeter.log
2006/11/14 01:09:12 INFO - jmeter.util.SSLManager: KeyStore Type: PKCS 12 2006/11/14 01:09:15 INFO - jmeter.util.SSLManager: JmeterKeyStore Location: C:\bin\xampp\apache\conf\ssl\users\web_korogi_cert.p12 2006/11/14 01:09:15 INFO - jmeter.util.SSLManager: JmeterKeyStore type: class org.apache.jmeter.util.keystore.DefaultKeyStore 2006/11/14 01:09:15 INFO - jmeter.util.JsseSSLManager: class org.apache.jmeter.util.keystore.DefaultKeyStore 2006/11/14 01:09:15 INFO - jmeter.util.SSLManager: TrustStore Type: JKS 2006/11/14 01:09:15 INFO - jmeter.util.SSLManager: TrustStore Location: C:/jdk1.5.0_07/jre/lib/security/cacerts 2006/11/14 01:09:15 INFO - jmeter.util.SSLManager: TrustStore type: class org.apache.jmeter.util.keystore.DefaultKeyStore 2006/11/14 01:09:15 INFO - jmeter.util.JsseSSLManager: AlwaysTrustManager alias: xxx.com 2006/11/14 01:09:15 INFO - jmeter.util.JsseSSLManager: INSTALLED 2006/11/14 01:09:15 INFO - jmeter.util.JsseSSLManager: AlwaysTrustManager alias: entrustclientca 2006/11/14 01:09:15 INFO - jmeter.util.JsseSSLManager: INSTALLED 2006/11/14 01:09:15 INFO - jmeter.util.JsseSSLManager: AlwaysTrustManager alias: verisignclass3g2ca 2006/11/14 01:09:15 INFO - jmeter.util.JsseSSLManager: INSTALLED
(略)
2006/11/14 01:09:15 INFO - jmeter.util.JsseSSLManager: JsseSSLManager installed

step5の考察

ここでわかったこと。
  • GUIのSSLマネージャは、KeyStoreの設定を行っている。
  • TrustStoreはjmeter.propertiesにて設定する。
javax.net.ssl.trustStore=C:/jdk1.5.0_07/jre/lib/security/cacerts
javax.net.ssl.trustStorePassword=changeit
2006/11/14 01:09:12 INFO - jmeter.util.SSLManager: KeyStore Type: PKCS 12 2006/11/14 01:09:15 INFO - jmeter.util.SSLManager: JmeterKeyStore Location: C:\bin\xampp\apache\conf\ssl\users\web_korogi_cert.p12 2006/11/14 01:09:15 INFO - jmeter.util.SSLManager: JmeterKeyStore type: class org.apache.jmeter.util.keystore.DefaultKeyStore 2006/11/14 01:09:15 INFO - jmeter.util.JsseSSLManager: class org.apache.jmeter.util.keystore.DefaultKeyStore 2006/11/14 01:09:15 INFO - jmeter.util.SSLManager: TrustStore Type: JKS 2006/11/14 01:09:15 INFO - jmeter.util.SSLManager: TrustStore Location: C:/jdk1.5.0_07/jre/lib/security/cacerts 2006/11/14 01:09:15 INFO - jmeter.util.SSLManager: TrustStore type: class org.apache.jmeter.util.keystore.DefaultKeyStore

となると、KeyStoreの設定はGUIのSSLマネージャではなくて、jmeter.propertiesで出来るのでは?
javax.net.ssl.keyStore=C:/bin/xampp/apache/conf/ssl/users/web_korogi_cert.p12 javax.net.ssl.keyStorePassword=ninshou

ということでstep6で検証してみる。

step6

  • アクセス失敗
  • SOAP/XML-RPCサンプラー
  • GUIのSSLマネージャは使わない
  • jmeter.propertiesでは4行追加。
javax.net.ssl.trustStore=C:/jdk1.5.0_07/jre/lib/security/cacerts javax.net.ssl.trustStorePassword=changeit javax.net.ssl.keyStore=C:/bin/xampp/apache/conf/ssl/users/web_korogi_cert.p12 javax.net.ssl.keyStorePassword=ninshou

jmeter.log
2006/11/14 01:20:17 INFO - jmeter.gui.action.Load: Loading file: C:\bin\jakarta-jmeter-2.2\bin\soap2.jmx 2006/11/14 01:20:17 INFO - jmeter.save.SaveService: Testplan (JMX) version: 2.2. Testlog (JTL) version: 2.2 2006/11/14 01:20:17 INFO - jmeter.save.SaveService: Using SaveService properties file version 408187 2006/11/14 01:20:17 INFO - jmeter.protocol.http.sampler.HTTPSampler2: Local host = xxxxx 2006/11/14 01:20:17 INFO - jmeter.protocol.tcp.sampler.TCPSampler: Protocol Handler name=TCPClientImpl 2006/11/14 01:20:17 INFO - jmeter.protocol.tcp.sampler.TCPSampler: Status prefix= 2006/11/14 01:20:17 INFO - jmeter.protocol.tcp.sampler.TCPSampler: Status suffix= 2006/11/14 01:20:17 INFO - jmeter.protocol.tcp.sampler.TCPSampler: Status properties= 2006/11/14 01:20:17 WARN - jmeter.save.SaveService: Could not set up alias JMSSampler java.lang.NoClassDefFoundError: javax/jms/Message 2006/11/14 01:20:17 WARN - jmeter.save.SaveService: Could not set up alias SubscriberSampler java.lang.NoClassDefFoundError: javax/jms/MessageListener 2006/11/14 01:20:17 INFO - jmeter.save.SaveService: Using SaveService properties version 1.8 2006/11/14 01:20:17 INFO - jmeter.save.SaveService: All converter versions present and correct 2006/11/14 01:20:17 INFO - jmeter.protocol.tcp.sampler.TCPClientImpl: Using eolByte=0 2006/11/14 01:20:18 INFO - jmeter.protocol.tcp.sampler.TCPClientImpl: Using eolByte=0 2006/11/14 01:20:33 INFO - jmeter.engine.StandardJMeterEngine: Listeners will be started after enabling running version 2006/11/14 01:20:33 INFO - jmeter.engine.StandardJMeterEngine: To revert to the earlier behaviour, define jmeterengine.startlistenerslater=false 2006/11/14 01:20:33 INFO - jmeter.engine.StandardJMeterEngine: Running the test! 2006/11/14 01:20:33 INFO - jmeter.gui.util.JMeterMenuBar: setRunning(true,local) 2006/11/14 01:20:33 INFO - jmeter.engine.StandardJMeterEngine: Starting 1 threads for group スレッドグループ. Ramp up = 1. 2006/11/14 01:20:33 INFO - jmeter.engine.StandardJMeterEngine: Continue on error 2006/11/14 01:20:33 WARN - jmeter.threads.JMeterThread: jmeterthread.startearlier=true (see jmeter.properties) 2006/11/14 01:20:33 INFO - jmeter.threads.JMeterThread: Thread スレッドグループ 1-1 started 2006/11/14 01:20:34 INFO - jmeter.threads.JMeterThread: Thread スレッドグループ 1-1 is done 2006/11/14 01:20:34 INFO - jmeter.engine.StandardJMeterEngine: Ending thread 0 2006/11/14 01:20:34 INFO - jmeter.engine.StandardJMeterEngine: Stopping test 2006/11/14 01:20:34 INFO - jmeter.engine.StandardJMeterEngine: Notifying test listeners of end of test 2006/11/14 01:20:34 INFO - jmeter.gui.util.JMeterMenuBar: setRunning(false,local) 2006/11/14 01:20:34 INFO - jmeter.engine.StandardJMeterEngine: Test has ended

HTTPレスポンスでのエラーログ
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 com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source) at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source) at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source) at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source) at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(Unknown Source) at com.sun.net.ssl.internal.ssl.AppOutputStream.write(Unknown Source) at java.io.BufferedOutputStream.flushBuffer(Unknown Source) at java.io.BufferedOutputStream.flush(Unknown Source) at org.apache.commons.httpclient.HttpConnection.flushRequestOutputStream(HttpConnection.java:827) at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:1975) at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:993) at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:397) at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:170) at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:396) at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:324) at org.apache.jmeter.protocol.http.sampler.HTTPSampler2.sample(HTTPSampler2.java:527) at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:658) at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:647) at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:247) at java.lang.Thread.run(Unknown Source) 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(Unknown Source) at sun.security.validator.PKIXValidator.engineValidate(Unknown Source) at sun.security.validator.Validator.validate(Unknown Source) at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source) at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(Unknown Source) ... 22 more Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source) at java.security.cert.CertPathBuilder.build(Unknown Source) ... 27 more

step6の考察

jmeter.logを見ると、keyStoreなどの情報を読み込んでいないようだ。
読み込む契機を発生させるため、GUIのSSLマネージャを開いてすぐ閉じてみた。
→step7へ。

step7

読み込む契機が無いようなので、GUIのSSLマネージャを開いてすぐ閉じてみると、keyStoreの情報を読み込んだ。しかし、そのままリクエストを実行すると、ゼロ除算が発生してコケた。
  • アクセス失敗
    • HTTPサンプラー(HTTPClient)
    • GUIのSSLマネージャは使わない
    • jmeter.propertiesには4行追加。
javax.net.ssl.trustStore=C:/jdk1.5.0_07/jre/lib/security/cacerts javax.net.ssl.trustStorePassword=changeit javax.net.ssl.keyStore=C:/bin/xampp/apache/conf/ssl/users/web_korogi_cert.p12 javax.net.ssl.keyStorePassword=ninshou

jmeter.log
2006/11/14 01:23:17 INFO - jmeter.gui.action.Load: Loading file: C:\bin\jakarta-jmeter-2.2\bin\soap2.jmx 2006/11/14 01:23:17 INFO - jmeter.save.SaveService: Testplan (JMX) version: 2.2. Testlog (JTL) version: 2.2 2006/11/14 01:23:17 INFO - jmeter.save.SaveService: Using SaveService properties file version 408187 2006/11/14 01:23:17 INFO - jmeter.protocol.http.sampler.HTTPSampler2: Local host = ansersusa1 2006/11/14 01:23:17 INFO - jmeter.protocol.tcp.sampler.TCPSampler: Protocol Handler name=TCPClientImpl 2006/11/14 01:23:17 INFO - jmeter.protocol.tcp.sampler.TCPSampler: Status prefix= 2006/11/14 01:23:17 INFO - jmeter.protocol.tcp.sampler.TCPSampler: Status suffix= 2006/11/14 01:23:17 INFO - jmeter.protocol.tcp.sampler.TCPSampler: Status properties= 2006/11/14 01:23:17 WARN - jmeter.save.SaveService: Could not set up alias JMSSampler java.lang.NoClassDefFoundError: javax/jms/Message 2006/11/14 01:23:17 WARN - jmeter.save.SaveService: Could not set up alias SubscriberSampler java.lang.NoClassDefFoundError: javax/jms/MessageListener 2006/11/14 01:23:17 INFO - jmeter.save.SaveService: Using SaveService properties version 1.8 2006/11/14 01:23:17 INFO - jmeter.save.SaveService: All converter versions present and correct 2006/11/14 01:23:17 INFO - jmeter.protocol.tcp.sampler.TCPClientImpl: Using eolByte=0 2006/11/14 01:23:17 INFO - jmeter.protocol.tcp.sampler.TCPClientImpl: Using eolByte=0 2006/11/14 01:23:26 INFO - jmeter.util.SSLManager: KeyStore Type: PKCS 12 2006/11/14 01:23:27 INFO - jmeter.util.SSLManager: JmeterKeyStore Location: C:/bin/xampp/apache/conf/ssl/users/web_korogi_cert.p12 2006/11/14 01:23:27 INFO - jmeter.util.SSLManager: JmeterKeyStore type: class org.apache.jmeter.util.keystore.DefaultKeyStore 2006/11/14 01:23:27 INFO - jmeter.util.JsseSSLManager: class org.apache.jmeter.util.keystore.DefaultKeyStore 2006/11/14 01:23:27 INFO - jmeter.util.SSLManager: TrustStore Type: JKS 2006/11/14 01:23:27 INFO - jmeter.util.SSLManager: TrustStore Location: C:/jdk1.5.0_07/jre/lib/security/cacerts 2006/11/14 01:23:27 INFO - jmeter.util.SSLManager: TrustStore type: class org.apache.jmeter.util.keystore.DefaultKeyStore 2006/11/14 01:23:27 INFO - jmeter.util.JsseSSLManager: AlwaysTrustManager alias: xxx.com 2006/11/14 01:23:27 INFO - jmeter.util.JsseSSLManager: INSTALLED 2006/11/14 01:23:27 INFO - jmeter.util.JsseSSLManager: AlwaysTrustManager alias: entrustclientca 2006/11/14 01:23:27 INFO - jmeter.util.JsseSSLManager: INSTALLED 2006/11/14 01:23:27 INFO - jmeter.util.JsseSSLManager: AlwaysTrustManager alias: verisignclass3g2ca 2006/11/14 01:23:27 INFO - jmeter.util.JsseSSLManager: INSTALLED
(略)
2006/11/14 01:23:27 INFO - jmeter.util.JsseSSLManager: JsseSSLManager installed

HTTPサンプラーへのレスポンス
java.net.SocketException: Default SSL context init failed: Get Key failed: / by zero at javax.net.ssl.DefaultSSLSocketFactory.createSocket(Unknown Source) at org.apache.commons.httpclient.protocol.SSLProtocolSocketFactory.createSocket(SSLProtocolSocketFactory.java:81) at org.apache.commons.httpclient.protocol.SSLProtocolSocketFactory.createSocket(SSLProtocolSocketFactory.java:126) at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:706) at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:386) at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:170) at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:396) at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:324) at org.apache.jmeter.protocol.http.sampler.SoapSampler.sample(SoapSampler.java:224) at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:658) at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:647) at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:247) at java.lang.Thread.run(Unknown Source)

まとめ

現時点での解はstep5の方法。

この方法だと、SOAP/XML-RPCサンプラー
でもWebサービスリクエストでも要クライアント証明書のアクセスが成功したことが確認できた。

step5の復習

  • クライアント証明書(.p12形式)はGUIのSSLマネージャで選択する。
    • パスワードは選択ボタンを押したときに入力を求められる。
  • サーバがまっとうであることを証明するために使うサーバ証明書は、jmeter.propertiesにてjavax.net.ssl.trustStoreで指定する。
    • パスワードはjavax.net.ssl.trustStorePasswordで指定する。

サーバ証明書、クライアント証明書の作り方。

(今度書く。)

自家製のサーバ証明書(pem形式)をクライアント側のcacertsに入れる方法

c:\jdk1.5.0_07\bin> c:\jdk1.5.0_07\bin>keytool.exe -import -alias xxx -file C:/bin/xampp/apache/conf/ssl/cacert.pem -noprompt -trustcacerts -keystore c:\jdk1.5.0_07\jre\lib\security\cacerts キーストアのパスワードを入力してください: changeit 証明書がキーストアに追加されました。 c:\jdk1.5.0_07\bin>

このcacertsを使ってstep5を試すと、xxxというalias(別名)のサーバ証明書がきっちり読み込まれている様子がjmeter.logに現れます。
2006/11/14 01:44:05 INFO - jmeter.util.SSLManager: KeyStore Type: PKCS 12 2006/11/14 01:44:08 INFO - jmeter.util.SSLManager: JmeterKeyStore Location: C:\bin\xampp\apache\conf\ssl\users\web_korogi_cert.p12 2006/11/14 01:44:08 INFO - jmeter.util.SSLManager: JmeterKeyStore type: class org.apache.jmeter.util.keystore.DefaultKeyStore 2006/11/14 01:44:08 INFO - jmeter.util.JsseSSLManager: class org.apache.jmeter.util.keystore.DefaultKeyStore 2006/11/14 01:44:08 INFO - jmeter.util.SSLManager: TrustStore Type: JKS 2006/11/14 01:44:08 INFO - jmeter.util.SSLManager: TrustStore Location: C:/jdk1.5.0_07/jre/lib/security/cacerts 2006/11/14 01:44:08 INFO - jmeter.util.SSLManager: TrustStore type: class org.apache.jmeter.util.keystore.DefaultKeyStore 2006/11/14 01:44:08 INFO - jmeter.util.JsseSSLManager: AlwaysTrustManager alias: equifaxsecureebusinessca1 2006/11/14 01:44:08 INFO - jmeter.util.JsseSSLManager: INSTALLED 2006/11/14 01:44:08 INFO - jmeter.util.JsseSSLManager: AlwaysTrustManager alias: verisignclass1g3ca 2006/11/14 01:44:08 INFO - jmeter.util.JsseSSLManager: INSTALLED 2006/11/14 01:44:08 INFO - jmeter.util.JsseSSLManager: AlwaysTrustManager alias: verisignclass2g2ca 2006/11/14 01:44:08 INFO - jmeter.util.JsseSSLManager: INSTALLED 2006/11/14 01:44:08 INFO - jmeter.util.JsseSSLManager: AlwaysTrustManager alias: xxx 2006/11/14 01:44:08 INFO - jmeter.util.JsseSSLManager: INSTALLED
(略)

自家製のサーバ証明書(der形式)をクライアント側のcacertsに入れる方法

C:\jdk1.5.0_07\bin>openssl x509 -in C:/bin/xampp/apache/conf/ssl/cacert.pem -outform DER -out C:/bin/xampp/apache/conf/ssl/cacert.der C:\jdk1.5.0_07\bin>keytool -import -alias xxx2 -file C:/bin/xampp/apache/conf/ssl/cacert.der -noprompt -trustcacerts -keystore c:/jdk1.5.0_07/jre/lib/security/cacerts キーストアのパスワードを入力してください: changeit 証明書がキーストアに追加されました。