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.所有证书文件
一般用法,请参考上一篇博客《J2SE Socket SSL/TLS C/S模式编程》
但是,我们这里需要再进行几个步骤
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,比较标准验证的实现方式请参
【
iOS, 使用自签名证书https请求,(NSURLSession)
】
参考:
jmeter源码 jorpha.jar ,ApacheJMeter_http.jar
iOS 10 适配 ATS(app支持https通过App Store审核)