按照[1]中的方式生成的证书为V1证书,适用于以下情况:(1) 已有域名,在域名注册商处配置了域名解析,可以解析到服务器的IP地址;(2) 修改了系统的hosts,添加了对应规则,如:

1.14.5.14 your.domain.name

无域名、使用IP地址访问的站点,配置https时需要V3证书。配置了正确签名的V3证书的站点,在导入了root CA的机器上访问时,效果应如下图所示:

创建根 CA 证书

使用 OpenSSL 创建根 CA 证书。

创建根密钥

登录到安装了OpenSSL的计算机并运行以下命令。 这会创建加密密钥。

openssl ecparam -out contoso.key -name prime256v1 -genkey

创建根证书并进行自签名

使用以下命令生成证书签名请求 (CSR)。

openssl req -new -sha256 -key contoso.key -out contoso.csr

出现提示时,请键入根密钥的密码,以及自定义CA的组织信息,例如国家/地区、省/市/自治区、组织、组织单位和完全限定的域名(颁发者的域)。

创建根证书

使用以下命令生成根证书。

openssl x509 -req -sha256 -days 36500 -in contoso.csr -signkey contoso.key -out contoso.crt

上述命令将创建根证书。 稍后你将使用此证书来为服务器证书签名。

创建服务器证书

接下来,使用OpenSSL创建服务器证书。

创建证书的密钥

使用以下命令生成服务器证书的密钥。

openssl ecparam -out 1.14.5.14.key -name prime256v1 -genkey

创建 CSR(证书签名请求)

CSR是请求证书时向CA提供的公钥。CA将针对此特定请求颁发证书。

使用以下命令生成 CSR:

openssl req -new -sha256 -key 1.14.5.14.key -out 1.14.5.14.csr

出现提示时,请键入根密钥的密码,以及自定义CA的组织信息:国家/地区、省/市/自治区、组织、组织单位和完全限定的域名。 这是网站的域,它应该不同于颁发者,如:

Subject: C = CN, ST = Jiangsu, L = Xuzhou, O = FantasyShawTest, OU = FantasyShawTest, CN = fantasyshawtest, emailAddress = example@gmail.com

准备openssl.cnfv3.ext

同级目录下新建openssl.cnf并写入以下内容:

[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req

[req_distinguished_name]
countryName = Country Name (2 letter code)
countryName_default = US
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = NY
localityName = Locality Name (eg, city)
localityName_default = NYC
organizationalUnitName  = Organizational Unit Name (eg, section)
organizationalUnitName_default  = xxx
commonName = xxx
commonName_max  = 64

[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:TRUE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names

[alt_names]
IP.1 = 1.14.5.14
IP.2 = 19.19.8.10

同级目录下新建v3.ext并写入以下内容:

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage=digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName=@alt_names
[alt_names]
IP.1 = 1.14.5.14
IP.2 = 19.19.8.10

两个文件的[alt_names]应为服务器的IP,且应相同。

生成V3证书,并使用CA的根密钥为该证书签名

openssl x509 -req -in 1.14.5.14.csr -CA  contoso.crt -CAkey contoso.key -CAcreateserial -out 1.14.5.14.crt -days 36500 -sha256 -extfile v3.ext

验证证书内容

openssl x509 -in 1.14.5.14.crt -text -noout

将显示类似下图的内容

在Windows上信任root CA

双击contoso.crt安装root CA,存储到受信任的根证书颁发机构

Nginx配置反向代理和SSL示例

server {
     listen 443 ssl default;

     ssl_certificate  /home/mycert/1.14.5.14.crt;
     ssl_certificate_key /home/mycert/1.14.5.14.key;

     location  /{
          client_max_body_size 1024m;
          proxy_pass http://localhost:5212;
     }
}

访问页面验证效果

References

[1] 使用自定义根 CA 生成自签名证书 - Azure Application Gateway | Microsoft Learn

[2] openssl生成V3 CA 证书 - 掘金 (juejin.cn)