JMeter - 根据应用程序环境

时间:2016-06-21 19:53:56

标签: java jmeter keystore beanshell jks

我们有2个环境,每个环境都有一个证书PFX文件。 我尝试导入这两个证书来制作一个JKS / P12文件,并尝试根据别名访问证书。虽然我可以使用该命令看到2个条目 keytool -list -v -keystore "C:/yyyyy/xxxx.jks" -storepass "kdjfkdjfkdjf" > "C:/KeyStoreContents.txt",我无法访问任何证书并看到错误“找不到别名”。

我有办法根据应用环境设置javax.net.ssl.keyStorejavax.net.ssl.keyStorePassword的值吗?

我尝试在beanshell预处理器中设置它们:

System.setProperty("javax.net.ssl.keyStore","C:/yyyyy/" + pOneTwoName + ".p12");
System.setProperty("javax.net.ssl.keyStorePassword", pOneTwoPwd);

它没有用。

我还尝试了${__P(javax.net.ssl.keyStore, C:/yyyyyy/QA.p12)}${__setProperty(javax.net.ssl.keyStore, C:/yyyyyy/QA.p12)},但上述方法都没有。

有没有办法在执行Keystore Configuration元素之前动态加载这些值?

2 个答案:

答案 0 :(得分:2)

我真的不明白为什么你需要使用2个不同的密钥库,因为Keystore Configuration提供了使用多个证书的可能性。

来自文档:

  

要使JMeter使用多个证书,您需要确保:

     
      
  • import org.apache.jmeter.config.KeystoreConfig; import org.apache.jmeter.engine.StandardJMeterEngine; import org.apache.jmeter.testelement.TestPlan; import org.apache.jorphan.collections.HashTree; import org.apache.jorphan.collections.SearchByClass; import java.lang.reflect.Field; import java.util.Collection; StandardJMeterEngine engine = ctx.getEngine(); Field test = engine.getClass().getDeclaredField("test"); test.setAccessible(true); HashTree testPlanTree = (HashTree) test.get(engine); SearchByClass keyStoreConfigs = new SearchByClass(KeystoreConfig.class); testPlanTree.traverse(keyStoreConfigs); Collection keystoreConfigResults = keyStoreConfigs.getSearchResults(); KeystoreConfig keystoreConfig = (KeystoreConfig)keystoreConfigResults.toArray()[0]; keystoreConfig.testStarted(); 在jmeter.properties或user.properties中设置

  •   
  • 您对HTTP请求使用HTTPClient 4(ADVISED)或HTTPClient 3.1(DEPRECATED SINCE 3.0)实现

  •   

如果出于任何原因,您仍然需要使用2个密钥库,而不是来自一个密钥库的2个证书,遗憾的是在密钥库配置初始化之前无法执行Beanshell测试元素(或任何内容)。

但是,您应该可以强制从Beanshell脚本重新初始化。

示例代码:

{{1}}

有关JMeter中Beanshell脚本的高级信息,请参阅How to Use BeanShell: JMeter's Favorite Built-in Component文章。

答案 1 :(得分:1)

我可以通过以下步骤解决此问题:

  1. 获取应用程序环境的所有证书(pfx)
  2. 可选:将文件的扩展名更改为p12
  3. 使用以下命令为这些证书设置有意义的别名:

    keytool -changealias -alias "ExistingAliasName" -destalias "AppName_Environment" -keystore "C:\JKS\AppName_environment.p12" -storepass "StorePassword"

    第3步的注释:

    一个。它可能会要求输入keypass,我们可以进入商店通行证

    湾即使我们在别名中提供大写,文本也会转换为小写,并将设置为别名

    ℃。在这里,我遵循了这个别名命名约定:JMeter中提到的应用程序name_environment名称

  4. 将证书导入JKS文件,我们可以为JKS设置任何密码,不需要与证书相同。请参阅以下命令:

    keytool -importkeystore -srckeystore "C:\ JKS\ AppName _ Environment.p12" -srcstoretype pkcs12 -srcstorepass "SourceStorePasword” -destkeystore "C:\HomesiteJKS\BungalowFinal.jks" -deststoretype JKS -storepass "JKSPassword"

  5. 通过更改所需的参数值
  6. ,对所有剩余的证书重复上述步骤
  7. 一旦我们有了最终的JKS,我们就可以开始更改JKS中每个证书的密码,并使其与JKS(密钥库)密码相同。请参阅以下命令:

    keytool -keypasswd -alias " AppName_Environment" -keystore “C:\JKS\Final.jks"

    步骤6注意:它会要求您输入密钥库密码,现有证书密码,新密码并重复新密码

  8. 对JKS文件的所有证书条目重复此步骤,以获得所有证书的JKS密码
  9. 现在我们可以使用此文件并在JMeter的system.properties中添加以下条目: javax.net.ssl.keyStore=C:/JKS/Final.jks

    javax.net.ssl.keyStorePassword=JKSPassword

  10. 在JMeter的user.properties或jmeter.properties中添加以下条目,这将允许我们使用JKS文件中的多个证书:

    https.use.cached.ssl.context=false

  11. 将Http请求实施更改为HttpClient4
  12. 使用以下值将Keystore配置元素添加到JMeter测试:

    一个。预加载:真实

    湾变量名持有证书别名:CertAlias

    ℃。别名开始索引:0

    d。别名结束索引:10000

  13. JMeter用户定义变量必须具有CertAlias,其中包含所需的别名
  14. 所有设置,我们应该能够通过加载具有别名的特定证书来在不同的应用程序环境中运行脚本