一、 加密基础与原理

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)

  • 目的: 保证数据的完整性不可否认性
  • 原理:
    1. 对原始数据进行哈希得到摘要。
    2. 使用发送方的私钥对摘要进行加密(即签名)。
    3. 接收方使用发送方的公钥解密签名得到原始摘要。
    4. 接收方也对原始数据进行哈希得到新的摘要。
    5. 比较两个摘要,若相同则数据完整且未被篡改。

三、 可靠连接协议 (SSL/TLS)

1. 协议概述

  • SSL (Secure Sockets Layer): 较早期的安全协议,目前已废弃。
  • TLS (Transport Layer Security): SSL 的继任者,目前广泛使用的版本有 TLS 1.2TLS 1.3
  • HTTPS: 在 HTTP 协议之上加入了 TLS/SSL 层,提供加密和身份验证。

2. TLS 握手 (TLS Handshake) 过程

  • 目标: 在客户端和服务器之间安全地协商会话密钥加密算法
  • 关键步骤(简化):
    1. Client Hello: 客户端发送支持的 TLS 版本、加密套件 (Cipher Suites) 列表、客户端随机数。
    2. Server Hello & Certificate: 服务器选定最强的加密套件,发送服务器证书、服务器随机数。
    3. Certificate Verify: 客户端验证服务器证书(检查有效期、是否被吊销、是否被信任的 CA 签发)。
    4. Key Exchange: 客户端生成预主密钥 (Pre-Master Secret),用服务器公钥加密后发送给服务器。服务器用私钥解密
    5. Session Key Calculation: 双方利用客户端随机数服务器随机数预主密钥计算出最终的会话密钥
    6. 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
  • 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
  • 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