keytool命令的基本信息
#keytool --help密钥和证书管理工具命令: -certreq 生成证书请求 -changealias 更改条目的别名 -delete 删除条目 -exportcert 导出证书 -genkeypair 生成密钥对 -genseckey 生成密钥 -gencert 根据证书请求生成证书 -importcert 导入证书或证书链 -importpass 导入口令 -importkeystore 从其他密钥库导入一个或所有条目 -keypasswd 更改条目的密钥口令 -list 列出密钥库中的条目 -printcert 打印证书内容 -printcertreq 打印证书请求的内容 -printcrl 打印 CRL 文件的内容 -storepasswd 更改密钥库的存储口令使用 "keytool -command_name -help" 获取 command_name 的用法
当然,由于某些原因,一些参数被隐藏了,请参考如下数据
Option | 默认值 |
-alias | “mykey” |
-keyalg | “DSA” 使用-genkeypair命令时 |
“DES” 使用-genseckey命令时 | |
-keysize | 2048 使用 –genkeypair命令,并且-keyalg选项是”RSA”时 |
1024 使用 –genkeypair命令,并且-keyalg选项是”DSA”时 | |
256 使用 –genkeypair命令,并且-keyalg选项是”EC”时 | |
56 使用 –genseckey 命令,并且-keyalg选项是”DES”时 | |
168 使用 –genseckey 命令,并且-keyalg选项是”DESede”时 | |
-validity | 90 |
-keystore | 默认的的文件名是 .keystore ,是一个隐藏文件。 |
-storetype | 默认值java.security中配置的,SUN指定的是JKS,可以人为修改 |
-file | 如果是写,值为stout,如果是读,值为stdin |
-protected | false |
-sigalg | SHA1withDSA 如果生成KeyPair使用的时DSA算法 |
SHA256withRSA 如果生成KeyPair使用的时RSA算法 | |
SHA256withECDSA 如果生成KeyPair使用的时EC算法 |
1.生成根证书keystore
注意,如果是iOS使用的证书
必须导出iOS端需要的p12文件
-keysize 2048[苹果要求证书至少2048]
-sigalg必须符合
- TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
- TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
- TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
- TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
- TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
- TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
服务器必须支持TLSv1.2及以上版本
2.添加中间人证书密钥对到keystore中
3.生成请求密钥文件csr
4.使用root ca对中间人证书签名
5.将中间人cer中的密钥对导入到keystore
6.导出客户端信任证书
7.查看证书库信息
通过如上步骤,我们生成如下文件
8.所有证书文件
一般用法,请参考上一篇博客《》
但是,我们这里需要再进行几个步骤
9.生成指定域名的证书密钥对到keystore中
10.生成指定域名的请求CSR文件
11.使用中间人对生成指定域名的证书签名
12.将指定域名的cer中的密钥导入keystore中
13.我们需要重新初始化重新加载keystore,并且重新初始化SSLSocket
KeyStore updateKeyStore(String port, String host) throws IOException, GeneralSecurityException{ synchronized (CERT_PATH) { if (!this.keyStore.containsAlias(host)) { log.info(port + "Creating entry " + host + " in " + CERT_PATH_ABS); KeyToolUtils.generateHostCert(CERT_PATH, this.storePassword, host, CERT_VALIDITY); } this.keyStore = getKeyStore(this.storePassword.toCharArray()); } return this.keyStore;}
对于这些过程,我们推荐使用jorpha.jar工具包来完成。
如果是iOS,比较标准验证的实现方式请参
【
】
参考:
jmeter源码 jorpha.jar ,ApacheJMeter_http.jar