openssl
一、 加密基础与原理
1. 加密技术分类
- 对称加密 (Symmetric Cryptography)
- 原理:加密和解密使用同一个密钥。
- 特点:速度快,适用于大量数据传输。
- 常见算法:AES, DES, 3DES。
- 非对称加密 (Asymmetric Cryptography / Public-Key Cryptography)
- 原理:使用一对密钥,即公钥 (Public Key) 和**私钥 (Private Key)**。公钥加密的内容只能用对应的私钥解密,反之亦然。
- 特点:速度慢,用于密钥协商和数字签名。
- 常见算法:RSA, ECC。
- 哈希/散列函数 (Hash Function)
- 原理:将任意长度输入通过算法转换为固定长度输出(哈希值/摘要)。
- 特点:不可逆;输入微小变化会导致输出巨大变化;用于数据完整性校验。
- 常见算法:SHA-256, MD5(已不推荐用于安全用途)。
2. 混合加密机制
- 目的: 结合非对称加密的安全性和对称加密的效率。
- 流程: 先用非对称加密协商/传输一个对称密钥 (Session Key),后续的数据传输全部使用对称加密进行加密和解密。
二、 数字证书 (Digital Certificate) 与 PKI
1. X.509 数字证书
- 定义: 一种标准格式(通常是 X.509 标准)的文件,绑定了一个公钥和一个主体身份(如域名、组织)。
- 内容: 公钥、主体信息(如通用名 CN)、颁发机构 (Issuer)、有效期、数字签名等。
- 作用: 身份验证(证明公钥确实属于特定实体)和传输公钥。
2. 公钥基础设施 (PKI - Public Key Infrastructure)
- 核心组成:
- 证书颁发机构 (CA - Certificate Authority): 负责签发、管理和撤销数字证书的受信任第三方。
- 注册机构 (RA - Registration Authority): 验证证书申请者的身份。
- 证书库 (Certificate Store): 存储已颁发证书。
- 根证书 (Root Certificate): CA 自己的自签名证书,被浏览器和操作系统内置信任。
- 证书链 (Certificate Chain): 用户证书 -> 中间证书 -> 根证书,用于验证信任关系。
3. 数字签名 (Digital Signature)
- 目的: 保证数据的完整性和不可否认性。
- 原理:
- 对原始数据进行哈希得到摘要。
- 使用发送方的私钥对摘要进行加密(即签名)。
- 接收方使用发送方的公钥解密签名得到原始摘要。
- 接收方也对原始数据进行哈希得到新的摘要。
- 比较两个摘要,若相同则数据完整且未被篡改。
三、 可靠连接协议 (SSL/TLS)
1. 协议概述
- SSL (Secure Sockets Layer): 较早期的安全协议,目前已废弃。
- TLS (Transport Layer Security): SSL 的继任者,目前广泛使用的版本有 TLS 1.2 和 TLS 1.3。
- HTTPS: 在 HTTP 协议之上加入了 TLS/SSL 层,提供加密和身份验证。
2. TLS 握手 (TLS Handshake) 过程
- 目标: 在客户端和服务器之间安全地协商会话密钥和加密算法。
- 关键步骤(简化):
- Client Hello: 客户端发送支持的 TLS 版本、加密套件 (Cipher Suites) 列表、客户端随机数。
- Server Hello & Certificate: 服务器选定最强的加密套件,发送服务器证书、服务器随机数。
- Certificate Verify: 客户端验证服务器证书(检查有效期、是否被吊销、是否被信任的 CA 签发)。
- Key Exchange: 客户端生成预主密钥 (Pre-Master Secret),用服务器公钥加密后发送给服务器。服务器用私钥解密。
- Session Key Calculation: 双方利用客户端随机数、服务器随机数和预主密钥计算出最终的会话密钥。
- Change Cipher Spec & Finished: 双方通知切换到加密模式,并发送一条用会话密钥加密的“完成”消息。
3. 加密套件 (Cipher Suites)
- 定义:一组算法的组合,包括密钥交换算法、数字签名算法、对称加密算法和哈希算法。
四、 OpenSSL 工具集
OpenSSL 的命令主要分为以下六大类:
一、 密钥和参数管理 (Key & Parameter Management)
这类命令用于生成、管理和转换私钥、公钥以及相关的参数。
genpkey(通用私钥/参数生成)- 作用: 推荐用于生成所有类型的密钥(RSA, EC, DH)。
- 常用用法:
- 生成 RSA 密钥:
openssl genpkey -algorithm RSA -out private.key - 指定 EC 曲线:
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:secp384r1 -out ec_key.pem
- 生成 RSA 密钥:
genrsa(生成 RSA 私钥)- 作用: 传统方式生成 RSA 私钥。
- 常用用法:
openssl genrsa -out private.key 2048
rsa(RSA 私钥管理)- 作用: 查看、检查 RSA 私钥并提取公钥。
- 常用用法:
- 提取公钥:
openssl rsa -in private.key -pubout -out public.key - 检查私钥:
openssl rsa -in private.key -check
- 提取公钥:
pkey(通用密钥管理)- 作用: 检查任何类型的公钥或私钥。
- 常用用法:
openssl pkey -in key.pem -text -noout
pkcs8(私钥 PKCS#8 格式转换)- 作用: 将私钥在不同编码格式之间转换,通常是转换为更安全的 PKCS#8 格式。
- 常用用法:
openssl pkcs8 -in private.key -topk8 -out pkcs8.key
二、 证书和请求管理 (Certificate & Request Management)
这类命令用于创建、查看和管理 X.509 证书、证书签名请求 (CSR) 和证书吊销列表 (CRL)。
req(证书签名请求/自签名证书)- 作用: 用于生成 CSR 文件,或直接生成自签名证书。
- 常用用法:
- 创建 CSR:
openssl req -new -key private.key -out csr.csr - 创建自签名证书:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout key.pem -out cert.pem
- 创建 CSR:
x509(X.509 证书处理和查看)- 作用: 用于查看、转换和处理 X.509 格式的数字证书。
- 常用用法:
- 查看证书详情:
openssl x509 -in cert.crt -text -noout - 查看指纹:
openssl x509 -in cert.crt -noout -fingerprint
- 查看证书详情:
ca(证书颁发机构)- 作用: 最小的 CA 工具,用于签署 CSR 文件。(主要用于内部或测试环境)。
verify(验证证书链)- 作用: 验证证书是否被信任的 CA 正确签名,并检查信任链是否完整。
- 常用用法:
openssl verify -CAfile root.pem cert.crt
三、 文件格式转换和打包 (Format Conversion)
这类命令用于在不同的证书和密钥存储格式之间进行转换。
pkcs12(PKCS#12 / PFX 文件处理)- 作用: 将私钥和证书打包到一个文件(
.pfx或.p12),或从其中提取内容。 - 常用用法:
- 打包:
openssl pkcs12 -export -out cert.pfx -inkey key.pem -in cert.crt - 提取:
openssl pkcs12 -in cert.pfx -out full.pem -nodes
- 打包:
- 作用: 将私钥和证书打包到一个文件(
x509(编码格式转换)- 作用: 转换证书的编码格式(如 PEM 和 DER)。
- 常用用法:
openssl x509 -in cert.der -inform DER -out cert.pem -outform PEM
四、 故障排除和诊断 (Troubleshooting & Diagnostics)
这类命令常用于检查 SSL/TLS 连接状态和验证文件的一致性。
s_client(SSL/TLS 客户端连接测试)- 作用: 模拟客户端连接远程服务器,用于调试 TLS/SSL 连接问题。
- 常用用法:
echo | openssl s_client -connect example.com:443 -showcerts
s_server(SSL/TLS 服务器测试)- 作用: 启动一个简单的 TLS/SSL 服务器进行本地测试。
modulus(检查模数一致性)- 作用: 通过计算公钥模数的哈希值,验证证书、私钥和 CSR 是否相互匹配。
- 常用用法:
openssl rsa -in key.pem -noout -modulus | openssl md5(与其他文件的模数哈希值进行比对)
ciphers(查看加密套件)- 作用: 列出 OpenSSL 支持的加密套件列表。
- 常用用法:
openssl ciphers -V
五、 加密和摘要运算 (Crypto Operations)
这类命令用于文件级别的对称加密、解密和哈希计算。
enc(对称加密/解密)- 作用: 使用各种对称算法(如 AES, DES)对文件进行加密或解密。
- 常用用法:
- 加密:
openssl enc -aes-256-cbc -salt -in file.txt -out file.enc - 解密:
openssl enc -d -aes-256-cbc -in file.enc -out file.txt
- 加密:
dgst(消息摘要/哈希计算)- 作用: 计算文件的哈希值(如 SHA256, MD5),用于数据完整性校验。
- 常用用法:
openssl dgst -sha256 file.txt
rand(随机数生成)- 作用: 生成伪随机字节。
- 常用用法:
openssl rand -base64 32
六、 低层和杂项命令 (Low-level & Miscellaneous)
asn1parse(ASN.1 结构解析)- 作用: 检查证书、密钥等加密文件的底层 ASN.1 结构。
version(版本信息)- 作用: 显示安装的 OpenSSL 版本和编译信息。
- 常用用法:
openssl version -a
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 满杯是幸福 空杯是自由!
评论
