生成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 | [ req ] |
将上述内容放到一个文件中,命名为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 | server { |
使用证书
生成的具体域名证书和私钥可在 nginx 中使用,然后再客户端所在电脑导入根证书:
Windows 需要添加根证书至 受信任的根证书颁发机构
macOS 将其导入 钥匙串访问 并选择信任
另外 Windows 快捷安装根证书脚本如下(需要管理员权限):
1 | certutil -addstore -f -enterprise -user root ".\CA-certificate.crt" |
在window或者mac上安装private.crt文件后,nginx上页面或者接口就可以正常访问了。