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

参考资料

相关推荐
我命由我123451 分钟前
SSL 协议(HTTPS 协议的关键)
网络·经验分享·笔记·学习·https·ssl·学习方法
cuisidong199720 分钟前
如何在 Kali Linux 上安装 Google Chrome 浏览器
linux·运维·chrome
凌云行者27 分钟前
使用rust写一个Web服务器——单线程版本
服务器·前端·rust
丶Darling.41 分钟前
代码随想录 | Day26 | 二叉树:二叉搜索树中的插入操作&&删除二叉搜索树中的节点&&修剪二叉搜索树
开发语言·数据结构·c++·笔记·学习·算法
光通信学徒1 小时前
ubuntu图形界面右上角网络图标找回解决办法
linux·服务器·ubuntu·信息与通信·模块测试
wusam1 小时前
螺蛳壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习03(网络及IP规划)
运维·服务器·网络·docker·容器
你会发光哎u1 小时前
Webpack模式-Resolve-本地服务器
服务器·前端·webpack
南种北李1 小时前
Linux自动化构建工具Make/Makefile
linux·运维·自动化
一直在进步的派大星1 小时前
Docker 从安装到实战
java·运维·docker·微服务·容器
小飞猪Jay1 小时前
面试速通宝典——10
linux·服务器·c++·面试