0%

自建Https证书

生成nginx的证书与配置chrome安全告警的问题

安装openssl

生成根证书

1
openssl req -x509 -nodes -days 1461 -newkey rsa:2048 -subj "/C=CN/ST=MyProvince/L=MyCity/O=MyOrganization" -keyout CA-private.key -out CA-certificate.crt -reqexts v3_req -extensions v3_ca

生成私钥

1
openssl genrsa -out private.key 2048
1
openssl req -new -key private.key -subj "/C=CN/ST=MyProvince/L=MyCity/O=MyOrganization/CN=xxx.xxx.xxx.xxx" -sha256 -out private.csr

解决 Chrome 安全警告

按照上面的流程,需要注意的是,在默认情况下生成的证书一旦选择信任,在 Edge, Firefox 等浏览器都显示为安全,但是 Chrome 仍然会标记为不安全并警告拦截,这是因为 Chrome 需要证书支持扩展 Subject Alternative Name, 因此生成时需要特别指定 SAN 扩展并添加相关参数。
SAN Extension 所需配置文件关键属性:

req_distinguished_name: 一节的内容与上面 -subj 一样都是证书的附加信息
subjectAltName: 是最关键的属性,取值有两种情况,除前缀外值应与上一步 -subj 中指定的 CN 参数值相同:
如果是为某一域名签发证书,则其值可为 DNS:www.example.com 或者使用通配符 DNS:*.example.com;
如果为 IP 地址颁发证书,则应该使用 IP:xxx.xxx.xxx.xxx 的形式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = san
extensions = san
[ req_distinguished_name ]
countryName = CN
stateOrProvinceName = MyProvince
localityName = MyCity
organizationName = MyOrganization
[SAN]
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = IP:xxx.xxx.xxx.xxx

将上述内容放到一个文件中,命名为private.ext执行命令,生成证书

1
openssl x509 -req -days 1461 -in private.csr -CA CA-certificate.crt -CAkey CA-private.key -CAcreateserial -sha256 -out private.crt -extfile private.ext -extensions SAN

nginx中配置如下:

1
2
3
4
5
6
7
server {
listen 443;
server_name localhost;
ssl on;
ssl_certificate /alidata/ssl/private.crt;
ssl_certificate_key /alidata/ssl/private.key;
}

使用证书

生成的具体域名证书和私钥可在 nginx 中使用,然后再客户端所在电脑导入根证书:

Windows 需要添加根证书至 受信任的根证书颁发机构
macOS 将其导入 钥匙串访问 并选择信任
另外 Windows 快捷安装根证书脚本如下(需要管理员权限):

1
certutil -addstore -f -enterprise -user root ".\CA-certificate.crt"

在window或者mac上安装private.crt文件后,nginx上页面或者接口就可以正常访问了。

写文不易,感谢支持!
Writing is not easy. Thank you for your support.