使用 OpenSSL 生成服务端和客户端证书签发根证书的流程
本文介绍如何使用 OpenSSL 生成自签名的根证书 (CA),并使用该根证书为服务端和客户端签发证书。此流程适用于测试目的或者在内部网络环境中为服务和客户端提供 SSL/TLS 保护。
1. 生成根证书 (CA)
首先,生成一个自签名的根证书,用于为服务端和客户端签发证书。
步骤 1.1: 生成 CA 私钥
生成 CA 的私钥,使用 RSA 2048 位加密算法:
openssl genpkey -algorithm RSA -out ca.key -pkeyopt rsa_keygen_bits:2048
这将生成一个名为 ca.key
的私钥文件。
步骤 1.2: 创建配置文件
在这里,我们可以通过创建 OpenSSL 配置文件,避免命令行传递复杂的 -subj
参数。
创建一个 openssl.cnf
配置文件,内容如下:
[ req ]
distinguished_name = req_distinguished_name
prompt = no
[ req_distinguished_name ]
C = US
ST = California
L = San Francisco
O = MyCompany
OU = Org
CN = MyRootCA
步骤 1.3: 生成 CA 自签名证书 (ca.crt)
使用刚生成的 CA 私钥和配置文件创建一个自签名的根证书,设置证书有效期为 10 年(3650 天):
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt -config openssl.cnf
-x509
: 创建自签名证书。
-new
: 创建新的证书请求。
-nodes
: 不加密私钥。
-key ca.key
: 使用刚生成的 CA 私钥。
-sha256
: 使用 SHA-256 进行哈希。
-days 3650
: 设置证书有效期为 3650 天(10 年)。
-out ca.crt
: 输出根证书文件 ca.crt
。
-config openssl.cnf
: 使用配置文件生成证书。
2. 生成服务端证书
接下来,使用根证书 (CA) 签发服务端证书。
步骤 2.1: 生成服务端私钥
生成服务端的私钥:
openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:2048
步骤 2.2: 生成服务端证书签名请求 (CSR)
使用服务端私钥和配置文件生成证书签名请求 (CSR):
将 openssl.cnf
配置文件修改为如下内容:
[ req ]
distinguished_name = req_distinguished_name
prompt = no
[ req_distinguished_name ]
C = US
ST = California
L = San Francisco
O = MyCompany
OU = Org
CN = server.example.com
然后生成 CSR:
openssl req -new -key server.key -out server.csr -config openssl.cnf
此命令生成服务端的 server.csr
文件,包含服务端证书的请求信息。
步骤 2.3: 使用 CA 签署服务端证书
使用 CA 的根证书和私钥对服务端的 CSR 进行签名,生成服务端证书:
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -sha256
-req
: 处理 CSR 文件。
-CA ca.crt
: 使用 CA 证书签署服务端证书。
-CAkey ca.key
: 使用 CA 私钥进行签名。
-CAcreateserial
: 生成 CA 的序列号文件 ca.srl
。
-out server.crt
: 输出生成的服务端证书。
-days 365
: 设置证书有效期为 1 年。
3. 生成客户端证书
客户端证书的生成过程与服务端类似。
步骤 3.1: 生成客户端私钥
为客户端生成一个私钥:
openssl genpkey -algorithm RSA -out client.key -pkeyopt rsa_keygen_bits:2048
步骤 3.2: 生成客户端证书签名请求 (CSR)
将 openssl.cnf
配置文件修改为如下内容:
[ req ]
distinguished_name = req_distinguished_name
prompt = no
[ req_distinguished_name ]
C = US
ST = California
L = San Francisco
O = MyCompany
OU = Org
CN = client.example.com
生成客户端的证书签名请求:
openssl req -new -key client.key -out client.csr -config openssl.cnf
步骤 3.3: 使用 CA 签署客户端证书
使用 CA 签署客户端的 CSR,生成客户端证书:
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 365 -sha256
4. 验证证书
可以通过 OpenSSL 验证生成的证书是否有效,并检查其是否由指定的 CA 签发。
验证服务端证书
验证服务端证书是否由 CA 正确签发:
openssl verify -CAfile ca.crt server.crt
验证客户端证书
验证客户端证书是否由 CA 正确签发:
openssl verify -CAfile ca.crt client.crt
5. 使用 OpenSSL 进行 TLS 测试
你可以使用 OpenSSL 的 s_server
和 s_client
来测试生成的证书是否可以正常工作。
启动 TLS 服务器
使用生成的服务端证书和私钥,启动一个简单的 TLS 服务器:
openssl s_server -accept 4433 -cert server.crt -key server.key -CAfile ca.crt -verify 1
此命令将在本地端口 4433 上启动一个使用 TLS 加密的服务器,要求客户端提供并验证客户端证书。
启动 TLS 客户端
使用客户端证书和私钥,连接到服务器进行 TLS 通信测试:
openssl s_client -connect localhost:4433 -cert client.crt -key client.key -CAfile ca.crt
6. 总结
通过以上步骤,你可以生成根证书 (CA),并使用该根证书为服务端和客户端签发证书。在生成并验证证书后,你可以使用 OpenSSL 启动简单的 TLS 测试服务器和客户端,确保证书工作正常。
步骤包括:
- 生成自签名的根证书 (CA)。
- 使用根证书为服务端生成证书。
- 使用根证书为客户端生成证书。
- 验证证书是否正确签发。
- 使用 OpenSSL 进行 TLS 测试。
该流程适用于测试环境中的 SSL/TLS 通信配置。