跳到主要内容

使用OpenSSL生成TLS证书和密钥

· 阅读需 7 分钟

阅读量

0

阅读人次

0

在实现安全通信时,TLS(传输层安全)是一个常用的协议。本文将介绍如何使用 OpenSSL 生成 TLS 证书和密钥文件,并解释每个步骤的关联和意义。

生成 CA 证书和密钥

首先,我们需要生成一个 CA(Certificate Authority,证书颁发机构)证书和私钥。CA 是信任链的根源,客户端和服务器都信任这个 CA。

# 生成 CA 私钥
openssl genpkey -algorithm RSA -out ca-key.pem

# 生成 CA 证书
openssl req -x509 -new -nodes -key ca-key.pem -sha256 -days 365 -out ca-cert.pem -subj "/C=US/ST=State/L=City/O=Organization/OU=Unit/CN=amass.fun"
  • 意义:CA 证书用于签署其他证书,确保它们的可信性。
  • 关联:生成的 ca-cert.pem 是根证书,ca-key.pem 是用于签署其他证书的私钥。
提示

为什么私钥和证书的文件扩展名为 .pem

.pem 后缀表示“Privacy Enhanced Mail”,是一种文件格式,用于存储证书、密钥和其他加密数据。它采用 Base64 编码,并使用特定的头尾标识(如 -----BEGIN CERTIFICATE----------END CERTIFICATE-----)。 使用 .pem 的原因:

  1. 可读性:Base64 编码使得内容可以在文本编辑器中查看和编辑。
  2. 兼容性:广泛支持,适用于多种加密工具和库(如 OpenSSL)。
  3. 多用途:可以存储证书、私钥、公钥和证书链。

因此,.pem 格式是一种灵活且普遍使用的加密数据存储格式。

生成服务器证书和密钥

接下来,生成服务器的证书和私钥,用于在服务器端建立安全连接。

# 生成服务器私钥
openssl genpkey -algorithm RSA -out server-key.pem

# 生成服务器证书签名请求(CSR)
openssl req -new -key server-key.pem -out server.csr -subj "/C=US/ST=State/L=City/O=Organization/OU=Unit/CN=server.amass.fun"

# 使用 CA 签署服务器证书
openssl x509 -req -in server.csr -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -days 365 -sha256
  • 意义:服务器证书证明服务器的身份,私钥用于加密通信。
  • 关联:服务器的证书请求(CSR,Certificate Signing Request)使用 server-key.pem 生成,然后由 CA (ca-key.pemca-cert.pem) 签署生成 server-cert.pem。这确保了服务器证书是由可信的 CA 签发的。

生成客户端证书和密钥

如果需要客户端证书验证,可以生成客户端证书。

# 生成客户端私钥
openssl genpkey -algorithm RSA -out client-key.pem

# 生成客户端证书签名请求(CSR)
openssl req -new -key client-key.pem -out client.csr -subj "/C=US/ST=State/L=City/O=Organization/OU=Unit/CN=client.amass.fun"

# 使用 CA 签署客户端证书
openssl x509 -req -in client.csr -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem -days 365 -sha256
  • 意义:客户端证书用于进行身份验证,确保客户端的可信性。
  • 关联:客户端的证书请求(CSR)使用 client-key.pem 生成,然后由 CA 签署生成 client-cert.pem。这确保了客户端证书也是由可信的 CA 签发的。
信息

通过 生成客户端证书和密钥 可以看出,步骤其实是一样的,本质上都只是需要CA签发证书以证明自己的身份而已。

合并证书和私钥

cat server-cert.pem server-key.pem > server-cert-key.pem

简单的通过如上命令就可以将证书和私钥合并,生成的文件 server-cert-key.pem 将包含服务器的证书和私钥。

确保合并后的文件格式正确,可以使用以下命令验证:

openssl x509 -in server-cert-key.pem -text -noout

如果输出显示证书的详细信息,说明合并成功。

确保合并后的文件是安全的,因为它包含私钥。仅在需要的环境中使用合并文件,避免泄露。

总结

通过以上步骤,我们生成了用于安全通信的必要证书和密钥:

  • CA 证书ca-cert.pem,用于验证服务器和客户端证书。
  • 服务器证书和密钥server-cert.pemserver-key.pem,用于服务器端的身份验证和加密。
  • 客户端证书和密钥client-cert.pemclient-key.pem,用于客户端的身份验证。

信任链和安全通信:

  • 信任链:CA 证书是信任链的根,服务器和客户端证书由 CA 签署,确保双方都能验证对方的身份。
  • 安全通信:私钥用于加密,证书用于验证身份,确保通信的保密性和完整性。
  • 双向认证(可选):通过客户端证书验证,进一步增强安全性,确保不仅服务器是可信的,客户端也是可信的。

CRL 和 OCSP 检查

CRL(证书吊销列表)和 OCSP(在线证书状态协议)是用于验证 TLS/SSL 证书状态的机制。

CRL(证书吊销列表)

  • 作用:CRL 是由证书颁发机构(CA)发布的一个列表,列出已被吊销的证书。
  • 工作原理:客户端在验证证书时,会下载并检查 CRL,以确保证书没有被吊销。
  • 缺点:CRL 可能会很大,导致下载和处理时间较长。

OCSP(在线证书状态协议)

  • 作用:OCSP 提供了一种实时检查证书状态的方法。
  • 工作原理:客户端向 OCSP 服务器发送请求,询问特定证书的状态(有效、吊销或未知)。
  • 优点:相比 CRL,OCSP 更加高效,因为它只检查特定证书的状态。
  • 缺点:需要依赖 OCSP 服务器的可用性。

使用场景

  • 安全性:CRL 和 OCSP 是确保证书仍然可信的重要手段。
  • 性能:OCSP 通常比 CRL 更快,但需要网络请求。

在开发和测试环境中,可能会禁用这些检查以简化配置和加快开发速度。然而,在生产环境中,建议启用这些检查以确保通信安全。