JMeter - 根据应用程序环境设置javax.net.ssl.keyStore和javax.net.ssl.keyStore密码

JMeter - Setting javax.net.ssl.keyStore and javax.net.ssl.keyStorePassword based on application environment

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

有没有办法根据应用环境设置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)}和none。

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

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

引用文档:

To make JMeter use more than one certificate you need to ensure that:

  • https.use.cached.ssl.context=false is set in jmeter.properties or user.properties

  • You use either HTTPClient 4 (ADVISED) or HTTPClient 3.1 (DEPRECATED SINCE 3.0) implementations for HTTP Request

如果出于任何原因您仍然需要使用 2 个 keystores,而不是来自一个 keystore 的 2 个证书,不幸的是没有办法事先执行 Beanshell 测试元素(或任何东西)到密钥库配置初始化。

但是您应该能够从 Beanshell 脚本强制重新初始化。

示例代码:

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 中 Beanshell 脚本的高级信息,请参阅 How to Use BeanShell: JMeter's Favorite Built-in Component 文章。

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

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

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

    第 3 步注意事项:

    一个。可能会要求输入keypass,我们可以输入store pass

    b。即使我们在别名中提供大写字母,文本也会被转换为小写字母并设置为别名

    c。在这里,我遵循了这个别名命名约定:application name_environment name as mentioned in JMeter

  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. 一旦我们有了最终的 JKS,我们就可以开始更改 JKS 中每个证书的密码,并使其与 JKS(密钥库)密码相同。请参阅以下命令:

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

    第 6 步注意事项:它会要求您输入密钥库密码、现有证书密码、新密码和重复新密码

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

    javax.net.ssl.keyStorePassword=JKSPassword

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

    https.use.cached.ssl.context=false

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

    一个。预载:真

    b。变量名持有证书别名:CertAlias

    c。别名起始索引:0

    d。别名结束索引:10000

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