2016-06-21 234 views
1

我们有2个环境,每个环境都有一个证书PFX文件。 我试图导入这两个证书来创建一个JKS/P12文件,并试图根据别名访问证书。虽然我可以使用命令 keytool -list -v -keystore "C:/yyyyy/xxxx.jks" -storepass "kdjfkdjfkdjf" > "C:/KeyStoreContents.txt"看到2个条目,但我无法访问任何证书并看到错误“别名未找到”。JMeter - 根据应用程序环境设置javax.net.ssl.keyStore和javax.net.ssl.keyStorePassword

我有一种方法来设置基于应用程序环境的值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元素执行前动态加载这些值?

+0

应该没有必要。 'keytool -list'的输出是什么? – EJP

回答

1

我能解决这个问题有以下步骤:

  1. 获取所有的证书(PFX)的应用环境
  2. 可选:文件的扩展名更改为P12
  3. 设置一个有意义的别名这些证书与下面的命令:

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

    步骤3的注释:

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

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

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

  4. 将证书导入到JKS文件中,我们可以将任何密码设置为JKS并且不需要与cert相同。请参见下面的命令:

    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. 添加下面的条目无论是在user.properties或JMeter的的jmeter.properties,这将允许我们使用多个证书从JKS文件:

    https.use.cached.ssl.context=false

  10. 更改HTTP请求实施HttpClient4
  11. 添加密钥库配置元素JMeter测试与下面的值:

    一个。 Preload:True

    b。变量名保存证书别名:CertAlias

    c。别名开始索引:0

    d。别名结束索引:10000

  12. JMeter的用户定义的变量必须与所需的别名CertAlias
  13. 所有集,我们应该能够通过加载特定证书与别名上运行不同的应用环境脚本
2

我不明白为什么您需要使用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个密钥库任何理由,而不是从一个密钥库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(); 

参见How to Use BeanShell: JMeter's Favorite Built-in Component文章在JMeter的BeanShell的脚本的高级信息。

+0

我已经通过导入两个证书创建了一个JKS文件。 – rkkreddy

+0

我已经通过导入两个证书创建了一个JKS文件。所有三个密码都不同 - 证书1,证书2和JKS文件。不知道这是否是问题。我有'https.use.cached.ssl.context = false'添加到jmeter.properties。我也用HttpClient4来实现。当我尝试使用带有别名的Keystore Configuration使用JKS文件中的证书时,发现错误:'meter.util.SSLManager:加载密钥库时出现问题:无法恢复密钥java.security.UnrecoverableKeyException:在太阳时无法恢复密钥 \t .security.provider.KeyProtector.recover(未知来源) ' – rkkreddy

+0

最可能的密钥库配置不正确 –