自签https证书(解决chrome显示不安全)
在新版的chrome中会出现这么一个问题:自签ca可以识别,但是证书仍然会判断不安全。
有时候需要在局域网上访问IP地址,但是由于操作系统或者浏览器的原因(苹果,小程序不允许在app中访问http接口),会给弹出警告,如下:
此问题可用openssl生成证书,并在浏览器中或者安卓苹果设备上安装证书来解决。
一.创建根证书
新建CA.cnf文件并输入以下内容:
1 | cat >CA.cnf<<EOF |
新建ext.ext文件并输入以下内容:
1 | cat >ext.ext<<EOF |
ext.ext文件参数解释
extendedKeyUsage 可以指定证书目的,即用途,一般有:
serverAuth:保证远程计算机的身份
clientAuth:向远程计算机证明你的身份
codeSigning:确保软件来自软件发布者,保护软件在发行后不被更改
emailProtection:保护电子邮件消息
timeStamping:允许用当前时间签名数据
如果不指定,则默认为 所有应用程序策略
说明:
CA.cnf文件是为申请CA根证书的配置文件;
ext.ext是生成服务器证书的扩展配置文件;
二. 生成证书
2.1 生成CA证书机构的公钥和私钥
1 | openssl req -x509 -newkey rsa:2048 -out CA.cer -outform PEM -keyout CA.key -days 3650 -verbose -config CA.cnf -nodes -sha256 -subj "/CN=MyCompany CA" |
2.2 生成nginx服务端使用的私钥以及证书颁发请求
注意:这里要修改-subj /CN=${你的域名}
1 | openssl req -newkey rsa:2048 -keyout server.key -out server.req -subj /CN=nnv5.cn,test.nnv5.cn,*.nnv5.cn -sha256 -nodes |
2.3 通过CA证书中心为刚刚生成的server证书颁发请求生成公钥
1 | openssl x509 -req -CA CA.cer -CAkey CA.key -in server.req -out server.cer -days 365 -extfile ext.ext -sha256 -set_serial 0x1111 |
执行完成后,会得到,其中
CA.cer
是用来安装在浏览器、安卓和苹果设备上,server.cer
和server.key
是放在服务端的证书和key文件,在Nginx中配置即可.
三. 一个CA生成多个证书
省略2.1步骤中的生成CA中心
重复2.2
和2.3
步骤生成新的证书(2.2
执行前需要修改-subj /CN=${你的域名}
,2.3执行前需要修改ext.ext
文件里面的DNS
或者IP
为新申请证书的信息)
四、生成client证书 配置nginx双向认证
4.1 生成CA(这一步忽略,使用2.1中生成的CA对server以及client进行签名)
4.2 生成client客户端认证使用的私钥以及证书颁发请求
1 | openssl req -newkey rsa:2048 -keyout client.key -out client.req -subj /CN=client -sha256 -nodes |
4.3 通过CA证书中心为刚刚生成的client证书颁发请求生成公钥
注意ext.ext文件中的域名或者ip和server一致
1 | openssl x509 -req -CA CA.cer -CAkey CA.key -in client.req -out client.cer -days 365 -extfile ext.ext -sha256 -set_serial 0x1111 |
4.4 将客户端证书转换为浏览器使用的.p12
证书
1 | openssl pkcs12 -export -clcerts -in client.cer -inkey client.key -out client.p12 |
配置https双向认证时其中
CA.cer
是用来安装在浏览器、安卓和苹果设备上的根CA信任证书,server.cer
和server.key
以及CA.cer
是放在服务端的证书和key文件以及CA证书,在Nginx中配置即可。client.p12导入到浏览器的个人证书里,重启浏览器,导入正常就能正常访问,否则返回400没有证书被发送错误。
nginx的https双向认证配置
1 | server { |