Keytool 自签名证书,让浏览器信任证书
背景: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能够避免手动信任多份证书
遇到的问题
-
下载证书加入钥匙串(Mac)
-
Safari 此连接非私人连接
通过下载证书并且添加到本地证书库并且设置为始终保持允许
-
Chrome 您的连接不是私密连接 NET::ERR_CERT_AUTHORITY_INVALID
通过下载证书并且添加到本地证书库并且设置为始终保持允许
-
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
- FireFox MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT
添加完证书后依然出现这个错误
手动将这个证书设置为例外
- FireFox 添加例外后还是报告证书不安全
输入 about:config,将 browser.xul的两个false修改为true, security.enterprise_roots.enabled 修改为true
只需要将 security.enterprise_roots.enabled 修改为true 并且删除添加的例外,同时将证书在操作系统设置为始终信任
- 证书重新生成后发现证书链接还是之前的
建议实验阶段每个证书名都加个编号方便发现证书没变,不然挺难发现这个问题。
通过清除浏览器缓存,和重启服务解决。
- 集群怎么只用一份证书
# 添加多个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能够避免手动信任多份证书