2016-06-21 77 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

最可能的密鑰庫配置不正確 –

相關問題