首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >使用openssl生成域名证书

使用openssl生成域名证书

原创
作者头像
保持热爱奔赴山海
修改2025-07-01 07:48:22
修改2025-07-01 07:48:22
9380
举报
文章被收录于专栏:DevOpsDevOps

日常运维中,有需要使用私有证书的场景,这里记录下操作方法。

1 生成 CA 私钥

代码语言:txt
复制
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.crt

2 生成中间证书

代码语言:txt
复制
1 生成 中间证书 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.crt

3 生成域名证书

代码语言:txt
复制
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
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 需要妥善保管,后续签发证书都是用的中间证书来操作的!

4 在Nginx上配置域名证书

代码语言:txt
复制
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;

	}
}

5 在windows客户端导入证书文件

操作如下:

先导入 ca.crt 根证书,选择“受信任的根证书颁发机构”。

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

6 浏览器访问测试

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

补充

如果后续有新的域名证书需求签发,例如 es.demo.com ,操作步骤如下:

代码语言:txt
复制
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 拷贝走进行分发即可。

此外,也支持通配符域名,操作如下:

代码语言:txt
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 生成 CA 私钥
  • 2 生成中间证书
  • 3 生成域名证书
  • 4 在Nginx上配置域名证书
  • 5 在windows客户端导入证书文件
  • 6 浏览器访问测试
  • 补充
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档