日常运维中,有需要使用私有证书的场景,这里记录下操作方法。
1 生成 CA 私钥
openssl genrsa -out ca.key 2048
注意: CA证书的私钥注意保管好,不要泄露!!
2 生成 CA 证书签名请求(CSR)
openssl req -new -key ca.key -out ca.csr
注意 Common Name 这里通常填写 一个能标识CA 的名称,例如 My Root CA
3 自签名生成 CA 根证书
openssl x509 -req -in ca.csr -days 3650 -signkey ca.key -out ca.crt
4 验证 CA 根证书
openssl x509 -noout -text -in ca.crt1 生成 中间证书 CA 私钥
openssl genrsa -out intermediate.key 2048
注意: 中间 CA证书的私钥注意保管好,不要泄露!!
2 生成中间 CA 证书签名请求(CSR)
openssl req -new -key intermediate.key -out intermediate.csr
注意 Common Name 这里填写一个能标识中间 CA 的名称,如 My Intermediate CA
3 配置中间 CA 证书的扩展属性
创建一个扩展属性配置文件
vim intermediate.ext,内容如下:
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:TRUE, pathlen:0
keyUsage = digitalSignature, keyCertSign, cRLSign
其中的参数的含义请参考google,大体意思就是这个限制这个中间CA证书不能用于签署其他证书。
4 使用根 CA 证书签署中间 CA 证书
openssl x509 -req -in intermediate.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -extfile intermediate.ext -out intermediate.crt1 生成域名(es.demo.com)私钥
openssl genrsa -out es.demo.com.key 2048
2生成域名(es.demo.com)证书签名请求(CSR)
openssl req -new -key es.demo.com.key -out es.demo.com.csr
注意 Common Name 务必填写 es.demo.com
3 配置域名证书的扩展属性
创建一个用于域名证书的扩展属性配置文件
vim domain.ext,内容如下:
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = es.demo.com
DNS.2 = def.demo.com
IP.1 = 192.168.1.100
IP.2 = 10.0.0.5
注意:
1 这里我们的alt_names 填了很多个,这种写法也是可以的,也就是一个域名证书可以支持多个域名的ssl。
2 传统上,Common Name 用于指定证书所关联的主要域名。然而,随着对多域名和 IP 支持需求的增加,subjectAltName(在 domain.ext 中配置)变得更为重要。现代浏览器和应用在验证证书时,会优先检查 subjectAltName 字段。
3 因此,即使 Common Name 只填写一个值,只要在 domain.ext 配置文件的 subjectAltName 中正确列出了所有需要支持的域名和 IP,生成的证书就能适用于这些目标。例如,你可以将 Common Name 设置为主要域名 es.demo.com,然后在 domain.ext 中列出其他相关域名和 IP:
4 生成域名证书:
openssl x509 -req -in es.demo.com.csr -CA intermediate.crt -CAkey intermediate.key -CAcreateserial -days 365 -extfile domain.ext -out es.demo.com.crt
5 最终生成的文件清单如下:
> ls -lhrt
total 52K
-rw------- 1 root root 1.7K 2025-06-29 17:04 ca.key
-rw-r--r-- 1 root root 985 2025-06-29 17:05 ca.csr
-rw-r--r-- 1 root root 1.2K 2025-06-29 17:05 ca.crt
-rw------- 1 root root 1.7K 2025-06-29 17:05 intermediate.key
-rw-r--r-- 1 root root 997 2025-06-29 17:06 intermediate.csr
-rw------- 1 root root 1.7K 2025-06-29 17:06 abc.demo.com.key
-rw-r--r-- 1 root root 989 2025-06-29 17:07 abc.demo.com.csr
-rw-r--r-- 1 root root 122 2025-06-29 17:07 intermediate.ext
-rw-r--r-- 1 root root 41 2025-06-29 17:08 ca.srl
-rw-r--r-- 1 root root 1.4K 2025-06-29 17:08 intermediate.crt
-rw-r--r-- 1 root root 228 2025-06-29 17:11 domain.ext
-rw-r--r-- 1 root root 41 2025-06-29 17:11 intermediate.srl
-rw-r--r-- 1 root root 1.5K 2025-06-29 17:11 abc.demo.com.crt
注意: ca.key 需要妥善保管,后续签发证书都是用的中间证书来操作的!nginx配置文件如下:
> cat /usr/local/software/nginx/conf.d/abc.demo.com.conf
server {
listen 443 ssl;
server_name abc.demo.com def.demo.com ;
ssl_certificate /etc/nginx/cert/abc.demo.com.crt;
ssl_certificate_key /etc/nginx/cert/abc.demo.com.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://192.168.31.181:8200;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
proxy_headers_hash_max_size 51200;
proxy_headers_hash_bucket_size 6400;
client_max_body_size 100m;
}
}操作如下:
先导入 ca.crt 根证书,选择“受信任的根证书颁发机构”。

然后,再导入 intermediate.crt 中间证书,选择“中间证书颁发机构”

可以看到访问 2个https域名都是没问题的,直接访问ip的方式也是可以的(因为我们上面申请证书的时候,用了alt_names方式)。



如果后续有新的域名证书需求签发,例如 es.demo.com ,操作步骤如下:
1 生成域名(es.demo.com)私钥
openssl genrsa -out es.demo.com.key 2048
2生成域名(es.demo.com)证书签名请求(CSR)
openssl req -new -key es.demo.com.key -out es.demo.com.csr # 注意 Common Name 务必填写 es.demo.com
3 配置域名证书的扩展属性,创建一个用于域名证书的扩展属性配置文件
vim domain.ext,内容如下:
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = es.demo.com
4 生成域名证书:
openssl x509 -req -in es.demo.com.csr -CA intermediate.crt -CAkey intermediate.key -CAcreateserial -days 365 -extfile domain.ext -out es.demo.com.crt
将生成的 es.demo.com.key 和 es.demo.com.crt 拷贝走进行分发即可。
此外,也支持通配符域名,操作如下:
1 生成域名(*.demo.com)私钥
openssl genrsa -out wildcard.demo.com.key 2048
2生成域名(*.demo.com)证书签名请求(CSR)
openssl req -new -key wildcard.demo.com.key -out wildcard.demo.com.csr # 注意 Common Name 务必填写 *.demo.com
或者直接一条命令 openssl req -new -key wildcard.demo.com.key -out wildcard.demo.com.csr -subj "/CN=*.example.com"
3 配置域名证书的扩展属性,创建一个用于域名证书的扩展属性配置文件
vim domain.ext,内容如下:
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = *.demo.com
4 生成域名证书:
openssl x509 -req -in wildcard.demo.com.csr -CA intermediate.crt -CAkey intermediate.key -CAcreateserial -days 365 -extfile domain.ext -out wildcard.demo.com.crt
将生成的 wildcard.demo.com.key 和 wildcard.demo.com.crt 拷贝走进行分发即可。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。