自建 https 证书
自建 https 证书
生成 nginx 的证书与配置 chrome 安全告警的问题
安装 openssl
生成根证书
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
|
生成私钥
openssl genrsa -out private.key 2048
|
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 的形式。
[ 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 执行命令,生成证书
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 中配置如下:
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 快捷安装根证书脚本如下 (需要管理员权限):
certutil -addstore -f -enterprise -user root ".\CA-certificate.crt"
|
在 window 或者 mac 上安装 private.crt 文件后,nginx 上页面或者接口就可以正常访问了。