【笔记】使用 openssl 生成服务器证书

CSR 即证书签名申请(Certificate Signing Request),获取 SSL 证书,需要先生成 CSR 文件并提交给证书颁发机构(CA)。CSR 包含了用于签发证书的公钥、用于辨识的名称信息(Distinguished Name)(例如域名)、真实性和完整性保护(例如数字签名),通常从 Web 服务器生成 CSR,同时创建加解密的公钥私钥对。

CSR 文件中包含的内容:

名称 说明
CN(通用名称) 服务器端证书验证时这里为域名(FQDN) 以 https://www.baidu.com 的证书这里填写的内容为 baidu.com
Email(邮箱) 证书申请主体的联系邮箱
O (组织/公司) 证书主体所在的公司
OU (部门/单位) 证书主体所在的部门
L (城市) 证书主体所在的城市
ST (省份) 证书主体所在的省份
C (国家) 证书主体所在的国家
哈希签名 以上内容在填写完成后,会生成一个 哈希签名,以防止篡改
公钥 证书公钥

在生成 CSR(证书签名请求文件) 后,就可以将这个文件提交到 CA 机构,由 CA 机构生成对应的证书,CA 机构会验证 CSR 中的信息,在确认信息可信后,会使用自己的私钥对其中的信息进行数字签名后生成实际的服务器证书。

如果是自签名证书,也就是不需要通过CA进行认证,或者自身就是一个 CA证书,则不需要由 CA 机构去颁发证书。

首先生成一个 CA 的自签名证书:

sh 复制代码
# 创建一个 私钥PEM文件和对应的私钥签名CSR文件
openssl req -new -nodes -sha256 -newkey rsa:2048 -keyout ca.key -out ca.csr \
-subj "/C=CN/ST=Zhejiang/L=Hangzhou/O=Ghimi Technology/OU=Ghimi Cloud/CN=ghimi.top"
# -nodes no des 的缩写,表示私钥PEM不需要设置密码
# -sha256 表示签名使用的算法为 sha256,256位共 32字节长度
# -newkey 表示会创建新的私钥 PEM 文件
# rsa:2048 表示非对称加密算法使用 rsa 算法,密钥长度 2048 位,256 字节长度
# -keyout 指定输出密钥文件名称,当前为 ca.key
# -out 指定输出签名文件名称,当前未 ca.csr
# -subj 用于设置 csr 签名文件中包含的信息

# 基于私钥签名创建证书
openssl x509 -req -in ca.csr -key ca.key -out ca.crt -days 3650
# -days 3650 有效期10年
# 查看证书信息
openssl x509 -text -noout -in ca.crt

然后基于上面的 ca 证书生成一个服务器证书:

sh 复制代码
# 创建一个 私钥PEM文件和对应的私钥签名CSR文件
openssl req -new -nodes -sha256 -newkey rsa:2048 -keyout server.key -out server.csr \
-subj "/C=CN/ST=Zhejiang/L=Hangzhou/O=Ghimi Technology/OU=Ghimi Blog/CN=blog.ghimi.top"
# -nodes no des 的缩写,表示私钥PEM不需要设置密码
# -sha256 表示签名使用的算法为 sha256,256位共 32字节长度
# -newkey 表示会创建新的私钥 PEM 文件
# rsa:2048 表示非对称加密算法使用 rsa 算法,密钥长度 2048 位,256 字节长度
# -keyout 指定输出密钥文件名称
# -out 指定输出签名文件名称
# -subj 用于设置 csr 签名文件中包含的信息

# 基于私钥签名创建证书
openssl x509 -req -in server.csr -out server.crt -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 \
-extensions SAN \
-extfile <(cat /etc/ssl/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:dns.ghimi.top,IP:127.0.0.1"))
# -days 3650 有效期10年
# -CA 用于指定 ca 证书
# -CAkey 用于指定 ca 证书私钥
# -CAcreateserial 如果 ca 序列号文件不存在,则创建一个
# 查看证书信息
openssl x509 -text -noout -in server.crt

我们在请求 https 网址的时候,服务器会将自己的服务器证书发送到客户端以客户端去验证,客户端会拿自己本地的 CA 证书去验证服务器证书是通过该CA颁发的,如果是则身份认证通过。如果本地的CA无法验证服务器发来的证书时则会提示不安全或者拒绝连接。

一下为请求百度主页后返回的服务器证书信息:

sh 复制代码
[root]# curl -kv https://www.baidu.com
* Host www.baidu.com:443 was resolved. # 域名解析完成
* IPv6: 240e:e9:6002:15a:0:ff:b05c:1278, 240e:e9:6002:15c:0:ff:b015:146f # 域名解析到 ipv6 地址
* IPv4: 180.101.50.242, 180.101.50.188 # 域名解析到 ipv4 地址
*   Trying 180.101.50.242:443... # 尝试用第一个 ipv4 地址建立连接
* Connected to www.baidu.com (180.101.50.242) port 443 # 与百度服务器建立连接
* ALPN: curl offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1): # tlsv1.3 客户端发起握手请求,包含一个随机数
* TLSv1.3 (IN), TLS handshake, Server hello (2): # tlsv1.2 服务器返回握手请求,包含一个服务器随机数,不兼容 tlsv1.3 协议降级为 tlsv1.2
* TLSv1.2 (IN), TLS handshake, Certificate (11): # tlsv1.2 服务器返回证书信息
* TLSv1.2 (IN), TLS handshake, Server key exchange (12): # tlsv1.2 服务器进行密钥交换
* TLSv1.2 (IN), TLS handshake, Server finished (14): # 服务器前期通信结束
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16): # 客户端交换密钥
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1): # 客户端修改加密算法
* TLSv1.2 (OUT), TLS handshake, Finished (20): # 客户端发起握手结束信息
* TLSv1.2 (IN), TLS handshake, Finished (20): # 服务器端发起握手结束信息
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256 / prime256v1 / RSASSA-PSS
# 加密连接建立,使用 tlsv1.2 通信 / 密钥交换协议:ECDHE 非对称加密协议:RSA 对称加密协议:AES128 哈希散列算法:SHA256(SHA-2)
* ALPN: server accepted http/1.1
* Server certificate:
# 服务器证书信息 C(国家):CN中国; ST(省份): beijing(北京);L(城市):北京 O(组织/公司): 北京百度网络科技有限公司 CN(域名): baidu.com
*  subject: C=CN; ST=beijing; L=beijing; O=Beijing Baidu Netcom Science Technology Co., Ltd; CN=baidu.com
*  start date: Jul  6 01:51:06 2023 GMT # 证书创建时间
*  expire date: Aug  6 01:51:05 2024 GMT # 证书过期时间
*  issuer: C=BE; O=GlobalSign nv-sa; CN=GlobalSign RSA OV SSL CA 2018 # 证书颁发机构(CA)
*  SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
*   Certificate level 0: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
*   Certificate level 1: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
*   Certificate level 2: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption

加密版本

上面的命令生成的私钥都是没有加密的,如果需要可以设置密码,这里设置密码为: 123456

sh 复制代码
# 生成 ca 私钥和自签名证书请求
openssl req -new -passout pass:123456 -sha256 -newkey rsa:2048 -keyout ca.key -out ca.csr \
-subj "/C=CN/ST=Zhejiang/L=Hangzhou/O=Ghimi Technology/OU=Ghimi Cloud/CN=ghimi.top"
# -passout pass:123456 , 指定私钥密码为 123456
# 生成 ca 自签名根证书
openssl x509 -req -in ca.csr -passin pass:123456 -key ca.key -out ca.crt -days 3650
# -passin pass:123456 , 指定ca 私钥密码为 123456
# 生成服务器私钥和服务器证书请求
openssl req -new -passout pass:123456 -nodes -sha256 -newkey rsa:2048 -keyout server.key -out server.csr \
-subj "/C=CN/ST=Zhejiang/L=Hangzhou/O=Ghimi Technology/OU=Ghimi Blog/CN=blog.ghimi.top"
# 使用 ca 自签名根证书和 服务器证书请求文件 生成服务器证书
openssl x509 -req -in server.csr -out server.crt \
-CA ca.crt -CAkey ca.key -passin pass:123456 -CAcreateserial -days 3650 \
-extensions SAN \
-extfile <(cat /etc/ssl/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:dns.ghimi.top,IP:127.0.0.1"))

参考资料

相关推荐
Leinwin1 小时前
OpenClaw 多 Agent 协作框架的并发限制与企业化规避方案痛点直击
java·运维·数据库
2401_865382501 小时前
信息化项目运维与运营的区别
运维·运营·信息化项目·政务信息化
漠北的哈士奇1 小时前
VMware Workstation导入ova文件时出现闪退但是没有报错信息
运维·vmware·虚拟机·闪退·ova
如意.7592 小时前
【Linux开发工具实战】Git、GDB与CGDB从入门到精通
linux·运维·git
运维小欣2 小时前
智能体选型实战指南
运维·人工智能
yy55272 小时前
Nginx 性能优化与监控
运维·nginx·性能优化
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ3 小时前
Linux 查询某进程文件所在路径 命令
linux·运维·服务器
左左右右左右摇晃3 小时前
计算机网络笔记整理
笔记·计算机网络
不吃西红柿的853 小时前
[职场] 内容运营求职简历范文 #笔记#职场发展
笔记·职场和发展·内容运营
似水明俊德4 小时前
02-C#.Net-反射-学习笔记
开发语言·笔记·学习·c#·.net