在新版的chrome中会出现这么一个问题:自签ca可以识别,但是证书仍然会判断不安全。

有时候需要在局域网上访问IP地址,但是由于操作系统或者浏览器的原因(苹果,小程序不允许在app中访问http接口),会给弹出警告,如下:

此问题可用openssl生成证书,并在浏览器中或者安卓苹果设备上安装证书来解决。

一.创建根证书

新建CA.cnf文件并输入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
cat >CA.cnf<<EOF
[ req ]
distinguished_name = req_distinguished_name
x509_extensions = root_ca

[ req_distinguished_name ]

countryName = CN (2 letter code)
countryName_min = 2
countryName_max = 2
stateOrProvinceName = ZheJiang
localityName = HangZhou
0.organizationName = Mycompany
organizationalUnitName = technology
commonName = develop
commonName_max = 64
emailAddress = admin@nnv5.cn
emailAddress_max = 64

[ root_ca ]
basicConstraints = critical, CA:true
EOF

新建ext.ext文件并输入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cat >ext.ext<<EOF
subjectAltName = @alt_names
extendedKeyUsage = serverAuth, clientAuth

[alt_names]

# 域名,如有多个用DNS.2,DNS.3…来增加
DNS.1 = test.nnv5.cn
DNS.2 = *.nnv5.cn
DNS.3 = nnv5.cn
# IP地址
IP.1 = 172.23.5.171
IP.2 = 127.0.0.1
IP.3 = 172.23.5.176
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.cerserver.key是放在服务端的证书和key文件,在Nginx中配置即可.

三. 一个CA生成多个证书

省略2.1步骤中的生成CA中心

重复2.22.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
2
3
openssl pkcs12 -export -clcerts -in client.cer -inkey client.key -out client.p12
Enter Export Password: 直接回车
Verifying - Enter Export Password: 直接回车

配置https双向认证时其中CA.cer是用来安装在浏览器、安卓和苹果设备上的根CA信任证书,server.cerserver.key以及CA.cer是放在服务端的证书和key文件以及CA证书,在Nginx中配置即可。client.p12导入到浏览器的个人证书里,重启浏览器,导入正常就能正常访问,否则返回400没有证书被发送错误。

nginx的https双向认证配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server {
listen 80;
server_name test.nnv5.cn;
location / {
rewrite ^(.*)$ https://$host$1 permanent;
}
}

server {
listen 443 ssl;
server_name test.nnv5.cn;
index index.html;
root /data/web/test;
ssl_certificate ssl/test.cer;
ssl_certificate_key ssl/test.key;
# 指定CA的公钥
ssl_client_certificate ssl/CA.cer;
# 开启验证客户端证书
ssl_verify_client on;

location / {

}
}