Keytool 自签名证书,让浏览器信任证书

发布时间 2023-07-05 17:09:02作者: SuperML

背景:CA机构的证书要花钱,客户不想花钱又需要ssl。

相关工具:keytool,openssl 可以生成自签名证书,个人使用的是 keytool

操作系统:Mac,Chrome (版本 114.0.5735.198(正式版本) (arm64)),Safari(版本16.5.1 (18615.2.9.11.7)),FireFox(115.0(64位))

需求:多IP集群情况下,能够使用一份自签名证书。

结果:总体能够接受,除了FireFox 麻烦一些,Chrome和Safari 都只需要信任证书一次即可

参考文档:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html

# 添加多个DNS和IP 适配双管节点+VIP
/usr/lib/jvm/java-1.8.0-openjdk/bin/keytool -genkey -alias tomcat  -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 365 -dname "CN=172.24.*,OU=ZStack,O=ZOPS,L=SH,ST=SH,C=CN" -ext san=dns:172.24.243.182,dns:172.24.245.171,dns:172.24.111.194,ip:172.24.243.182,ip:172.24.245.171,ip:172.24.111.194

# -dname "CN=172.24.*,OU=ZStack,O=ZOPS,L=SH,ST=SH,C=CN"  这个是方便跳过手动输入 名称 组织 城市等信息
# -ext san=dns:172.24.243.182,dns:172.24.245.171,dns:172.24.111.194,ip:172.24.243.182,ip:172.24.245.171,ip:172.24.111.194 将多DNS打包一起,在Chrome和Safari能够避免手动信任多份证书

遇到的问题

  1. 下载证书加入钥匙串(Mac)

  2. Safari 此连接非私人连接
    通过下载证书并且添加到本地证书库并且设置为始终保持允许

  3. Chrome 您的连接不是私密连接 NET::ERR_CERT_AUTHORITY_INVALID
    通过下载证书并且添加到本地证书库并且设置为始终保持允许

  4. Chrome net::err_cert_common_name_invalid
    这个是在前一步本机添加完证书的情况下出现的。这个挺难搞,线索太少。经过资料查询是证书本身的DNS出现错误导致

# 重新生成证书,添加 -ext san=dns:172.24.194.238,ip:172.24.194.238 设置dns(如果是域名还可以用*.zstack.io这种方式配置解决子域名重复配置问题)
/usr/lib/jvm/java-1.8.0-openjdk/bin/keytool -genkey -alias tomcat  -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 365 -ext san=dns:172.24.194.238,ip:172.24.194.238
  1. FireFox MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT
    添加完证书后依然出现这个错误

手动将这个证书设置为例外

  1. 证书重新生成后发现证书链接还是之前的
    建议实验阶段每个证书名都加个编号方便发现证书没变,不然挺难发现这个问题。

通过清除浏览器缓存,和重启服务解决。

  1. 集群怎么只用一份证书
# 添加多个DNS和IP 适配双管节点+VIP
/usr/lib/jvm/java-1.8.0-openjdk/bin/keytool -genkey -alias tomcat  -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 365 -dname "CN=172.24.*,OU=ZStack,O=ZOPS,L=SH,ST=SH,C=CN" -ext san=dns:172.24.243.182,dns:172.24.245.171,dns:172.24.111.194,ip:172.24.243.182,ip:172.24.245.171,ip:172.24.111.194

# -dname "CN=172.24.*,OU=ZStack,O=ZOPS,L=SH,ST=SH,C=CN"  这个是方便跳过手动输入 名称 组织 城市等信息
# -ext san=dns:172.24.243.182,dns:172.24.245.171,dns:172.24.111.194,ip:172.24.243.182,ip:172.24.245.171,ip:172.24.111.194 将多DNS打包一起,在Chrome和Safari能够避免手动信任多份证书