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.keyStore
和javax.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 文章。
我可以通过以下步骤解决这个问题:
- 获取应用程序环境的所有证书(pfx)
- 可选:将文件的扩展名更改为 p12
使用以下命令为这些证书设置有意义的别名:
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
将证书导入到JKS文件中,我们可以为JKS设置任意密码,无需与证书相同。请参阅以下命令:
keytool -importkeystore -srckeystore "C:\ JKS\ AppName _ Environment.p12" -srcstoretype pkcs12 -srcstorepass "SourceStorePasword” -destkeystore "C:\HomesiteJKS\BungalowFinal.jks" -deststoretype JKS -storepass "JKSPassword"
- 通过更改所需的参数值对所有剩余的证书重复上述步骤
一旦我们有了最终的 JKS,我们就可以开始更改 JKS 中每个证书的密码,并使其与 JKS(密钥库)密码相同。请参阅以下命令:
keytool -keypasswd -alias " AppName_Environment" -keystore “C:\JKS\Final.jks"
第 6 步注意事项:它会要求您输入密钥库密码、现有证书密码、新密码和重复新密码
- 对 JKS 文件的所有证书条目重复此步骤,以获得所有证书的 JKS 密码
现在我们可以使用这个文件并在 JMeter 的 system.properties 中添加以下条目:
javax.net.ssl.keyStore=C:/JKS/Final.jks
javax.net.ssl.keyStorePassword=JKSPassword
在 JMeter 的 user.properties 或 jmeter.properties 中添加以下条目,这将允许我们使用 JKS 文件中的多个证书:
https.use.cached.ssl.context=false
- 将 Http 请求实现更改为
HttpClient4
使用以下值将 Keystore 配置元素添加到 JMeter 测试:
一个。预载:真
b。变量名持有证书别名:CertAlias
c。别名起始索引:0
d。别名结束索引:10000
- JMeter 用户定义的变量必须具有具有所需别名的 CertAlias
- 一切就绪,我们应该能够 运行 通过加载具有别名
的特定证书来在不同的应用程序环境中运行脚本
我们有 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.keyStore
和javax.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.propertiesYou 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 文章。
我可以通过以下步骤解决这个问题:
- 获取应用程序环境的所有证书(pfx)
- 可选:将文件的扩展名更改为 p12
使用以下命令为这些证书设置有意义的别名:
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
将证书导入到JKS文件中,我们可以为JKS设置任意密码,无需与证书相同。请参阅以下命令:
keytool -importkeystore -srckeystore "C:\ JKS\ AppName _ Environment.p12" -srcstoretype pkcs12 -srcstorepass "SourceStorePasword” -destkeystore "C:\HomesiteJKS\BungalowFinal.jks" -deststoretype JKS -storepass "JKSPassword"
- 通过更改所需的参数值对所有剩余的证书重复上述步骤
一旦我们有了最终的 JKS,我们就可以开始更改 JKS 中每个证书的密码,并使其与 JKS(密钥库)密码相同。请参阅以下命令:
keytool -keypasswd -alias " AppName_Environment" -keystore “C:\JKS\Final.jks"
第 6 步注意事项:它会要求您输入密钥库密码、现有证书密码、新密码和重复新密码
- 对 JKS 文件的所有证书条目重复此步骤,以获得所有证书的 JKS 密码
现在我们可以使用这个文件并在 JMeter 的 system.properties 中添加以下条目:
javax.net.ssl.keyStore=C:/JKS/Final.jks
javax.net.ssl.keyStorePassword=JKSPassword
在 JMeter 的 user.properties 或 jmeter.properties 中添加以下条目,这将允许我们使用 JKS 文件中的多个证书:
https.use.cached.ssl.context=false
- 将 Http 请求实现更改为
HttpClient4
使用以下值将 Keystore 配置元素添加到 JMeter 测试:
一个。预载:真
b。变量名持有证书别名:CertAlias
c。别名起始索引:0
d。别名结束索引:10000
- JMeter 用户定义的变量必须具有具有所需别名的 CertAlias
- 一切就绪,我们应该能够 运行 通过加载具有别名 的特定证书来在不同的应用程序环境中运行脚本