自己做的app需要访问网站以获取数据,然后考虑到安全,觉得还是应该使用https安全链接,但是奈何https证书需要每年上千甚至几千的费用.进而想到,既然是自己的app访问自己的网址,那么完全可以使用自签名证书,这样app可以用自制的根证书来验证,免费方便且不用花一分钱.
说干就干,第一步,就是先生成自己的证书.等等...突然想起来, 现在国内网站都开始支持汉字了, 证书的信息直接使用汉字,那不是更友好吗?
查一下,看看别人都是怎么干的.然后发现很简单, openssl已经支持utf-8了, 生成请求证书的时候,只要加上参数-utf8就可以支持utf-8(中文)了,那就开始吧
第一步, 生成根证书用于后面自签名:
#生成根证书私钥,文件名rootCA.key
$openssl genrsa -des3 -out rootCA.key 2048
#生成根证书$openssl req -x509 -sha256 -new -nodes -key rootCA.key -days 3650 -out rootCA.crt
第二步,生成服务器证书并自签名
#生成服务证书私钥
$openssl genrsa -out dhxy_net.key 2048
#生成服务请求证书
$openssl req -new -key dhxy_net.key -out dhxy_net.csr -utf8
#用自己的根证书签名
$openssl x509 -req -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -in dhxy_net.csr -out dhxy_net.crt -days 3650
好了,现在已经生成了服务器用的证书了,但是因为使用的tomcat,所以还要进一步生成pfx格式的证书
$openssl pkcs12 -export -out dhxy_net.pfx -inkey dhxy_net.key -in dhxy_net.crt -password pass:<密码>
<密码>改成自己需要得密码即可生成pfx格式的证书了.
将生成得证书文件dhxy_net.pfx配置到tomcat,重启服务, 证书就可以生效了.
然后把ca根证书存到浏览器的受信根证书区域.然后访问网站, 哎? 不对啊, 证书无效?
提示: net::ERR_CERT_COMMON_NAME_INVALID, 这种错误,我印象中,就是域名不匹配造成,但是自己检查了输入的参数,没问题啊,确实对上了.
好吧,遇事不决,网络搜索,我相信我遇到的所有问题,肯定前面已经有无数人遇到过了.
嗯..果然, 原来是最近今年浏览器升级了对证书的要求, 需要v3版的证书才能正常工作,找到问题就好解决了.
按照网上搜索的结果,修改配置文件,其实就是增加了几个参数.
#openssl.cnf 文件,
1.找到req_extensions,把前面得#删除,变成这样:
req_extensions = v3_req # The extensions to add to a certificate request
2.合适得位置,增加一行:subjectAltName = @alt_names
DNS.1 = dhxy.net
DNS.2 = *.dhxy.net
IP.3 = 47.101.138.100
$openssl x509 -req -CA ../rootCA/rootCA.crt -CAkey ../rootCA/rootCA.key -CAcreateserial -extfile /etc/pki/tls/openssl.cnf -extensions v3_req -in dhxy_net.csr -out dhxy_net.crt -days 3650
这时候生成得服务证书,已经是v3版的了,有了扩展属性
重新生成pfx证书并配置到tomcat, 重启服务, 终于, 浏览器已经可信任我的服务证书了.
但是当我换成mac系统的safari浏览器时,新的问题出现了, 直接提示证书无效,怎么回事呢,继续网络搜索,哦...原来苹果自2019年开始,就强制证书有效期为一年了,有效期超过368天的证书,直接不认可.找到问题原因,那就简单了, 重新前面把-days参数由3650改成365,并重新生成pfx格式,
重启服务后,safari终于也识别成了.
完美解决
3.增加alt_names段
[ alt_names ]
#增加了-extfile /etc/pki/tls/openssl.cnf -extensions v3_req,