目前一般 web 应用都是采用单向认证的,原因很简单,用户数目广泛,且无需做在通讯层做用户身份验证,一般都在应用逻辑层来保证用户的合法登入。
但如果是企业应用对接,情况就不一样,可能会要求对 client(相对而言)做身份验证。这时需要做双向认证
private static final String SSL_TRUST_STORE = "javax.net.ssl.trustStore";// 证书库
private static final String KEY_STORE_PASSWORD = "javax.net.ssl.keyStorePassword"; // 密码
public static final String JAVAX_NET_SSL_KEY_STORE = "javax.net.ssl.keyStore"; // 证书库
# Truststore properties (trusted certificates)
javax.net.ssl.trustStore=D:\\key\\client.truststore
private String getPassword() {
String password = System.getProperty(KEY_STORE_PASSWORD);
if (null == password) {
final GuiPackage guiInstance = GuiPackage.getInstance();
if (guiInstance != null) {
synchronized (this) { // TODO is sync really needed?
this.defaultpw = JOptionPane.showInputDialog(
guiInstance.getMainFrame(),
JMeterUtils.getResString("ssl_pass_prompt"), // $NON-NLS-1$
JMeterUtils.getResString("ssl_pass_title"), // $NON-NLS-1$
JOptionPane.QUESTION_MESSAGE);
System.setProperty(KEY_STORE_PASSWORD, this.defaultpw);
password = this.defaultpw;
}
} else {
log.warn("No password provided, and no GUI present so cannot prompt");
}
}
return password;
}
因为 Jmeter 是从系统系统变量里面获取的路径所以我们要 System.property,采取 Beanshell 设置
import org.apache.jmeter.util.SSLManager;
System.setProperty("javax.net.ssl.keyStore", "D:\\key\\client.p12");
System.setProperty("javax.net.ssl.keyStorePassword", "123456");
System.setProperty("javax.net.ssl.trustStore", "D:\\key\\client.truststore");
SSLManager.reset();
SSLManager.getInstance();
如上:里面执行了 SSLManager 的两个方法,这两个方式是在页面 SSL 管理器导入证书的时候触发,属于初始化的操作,因为我们不用他了,我们要主动去触发执行。
BeanShell 里面必须要用 System.setProperty 去设置,用他自带的 props 去设置,只代表是当前上下文的变量,不代表系统变量,${__serProperty("","")});也一样失效。
因为 Jmeter 是自带缓存机制的所以这个 Beanshell 执行一次就行了,我们采取仅一次执行器,如果放在前置处理器里面的话会每次都执行,所以要单独创建 beanshell 取样器
如下: