【笔记】使用 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"))

参考资料

相关推荐
Nu11PointerException1 小时前
JAVA笔记 | ResponseBodyEmitter等异步流式接口快速学习
笔记·学习
_.Switch2 小时前
高级Python自动化运维:容器安全与网络策略的深度解析
运维·网络·python·安全·自动化·devops
2401_850410832 小时前
文件系统和日志管理
linux·运维·服务器
JokerSZ.2 小时前
【基于LSM的ELF文件安全模块设计】参考
运维·网络·安全
芯盾时代2 小时前
数字身份发展趋势前瞻:身份韧性与安全
运维·安全·网络安全·密码学·信息与通信
亦枫Leonlew3 小时前
三维测量与建模笔记 - 3.3 张正友标定法
笔记·相机标定·三维重建·张正友标定法
考试宝3 小时前
国家宠物美容师职业技能等级评价(高级)理论考试题
经验分享·笔记·职场和发展·学习方法·业界资讯·宠物
心灵彼岸-诗和远方3 小时前
DevOps业务价值流:架构设计最佳实践
运维·产品经理·devops
一只哒布刘3 小时前
NFS服务器
运维·服务器
苹果醋34 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx