关于Keytool创建服务器自签名证书

原创
2017/01/17 21:33
阅读数 1.9K

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

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中

2.添加中间人证书

3.生成请求密钥文件csr

3.生成请求密钥文件csr

4.使用root ca对中间人证书签名

4.生成服务端信任证书

5.将中间人cer中的密钥对导入到keystore

5.将服务端信任证书导入keystore中

6.导出客户端信任证书

6.导出客户端信任证书

7.查看证书库信息

7.查看证书库信息

通过如上步骤,我们生成如下文件

8.所有证书文件

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,比较标准验证的实现方式请参

【 

服务器使用https,自签名证书

iOS, 使用自签名证书https请求,(NSURLSession)

 

参考:

Java 实现TLS/SSL证书的自动安装校验

jmeter源码 jorpha.jar ,ApacheJMeter_http.jar

J2SE Socket SSL/TLS C/S模式编程

iOS使用自签名证书实现HTTPS请求

iOS开发HTTPS实现之信任SSL证书和自签名证书

JDK中利用keytool创建自签名证书

iOS 10 适配 ATS(app支持https通过App Store审核)

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部