传输层安全性
根据 维基百科
- 传输层安全性 (TLS) 及其已弃用的前身 安全套接字层 (SSL) 是旨在通过计算机网络提供通信安全的加密协议。该协议的多个版本广泛应用于网页浏览、电子邮件、即时消息和网络电话 (VoIP) 等应用中。网站可以使用 TLS 来保护其服务器与网页浏览器之间的所有通信安全。
实现
有多种 TLS 实现可用。OpenSSL 应该已经安装在您的系统上,因为它是 base 元软件包 (base > coreutils > openssl) 的间接依赖项。GnuTLS 可能已经安装在您的系统上,因为它是许多软件包必需的。
- OpenSSL — 一个强大、商用级、功能齐全的 TLS 和 SSL 协议工具包;也是一个通用加密库。
- GnuTLS — TLS、SSL 和 DTLS 协议的自由软件实现。提供 X.509、PKCS #12 和其他结构的 API。
- Network Security Services (NSS) — 支持 TLS/SSL 和 S/MIME 的加密库实现。还支持 TLS 加速和智能卡。
- mbed TLS — 可移植的 SSL/TLS 实现,又名 PolarSSL。
- LibreSSL — OpenBSD 项目于 2014 年从 OpenSSL 分叉出来的 TLS/加密堆栈的一个版本,旨在现代化代码库并提高安全性。
证书颁发机构
在 TLS 中,一组 证书颁发机构 (CA) 中的一个会检查并签署服务器的 公钥证书 的真实性。通过 TLS 连接到服务器的客户端可以通过依赖 CA 的数字签名来验证其证书的真实性。要检查数字签名,客户端必须拥有 CA 的公钥,该公钥是通过单独的路径获得的,并存储为自签名证书。在 Arch Linux 上,默认的 CA 证书集由 ca-certificates 包提供。
Arch Linux 为管理 CA 证书提供了一个集中的系统范围接口。该接口是 libp11-kit 包中的库 /usr/lib/pkcs11/p11-kit-trust.so,它为证书提供 PKCS #11 API,存储在 /usr/share/ca-certificates/trust-source/ (令牌 "Default Trust") 和 /etc/ca-certificates/trust-source/ (令牌 "System Trust") 中。
为了从命令行使用该接口,p11-kit 包提供了 trust(1) 工具。
对于尚未移植到 PKCS #11 并使用自定义逻辑管理 CA 证书的库,ca-certificates-utils 包提供了 update-ca-trust(8) 脚本。它将通过集中式接口获得的 CA 证书复制到 /etc/ca-certificates/extracted/ 和 /etc/ssl/certs/。
加载默认 CA 证书集机制概述
| 实现 | 机制 | Arch Linux 配置 |
|---|---|---|
| OpenSSL | 提供 API 函数,从硬编码的目录或文件中加载证书。SSL_CTX_set_default_verify_paths(3)。 | 默认文件是 /etc/ssl/cert.pem,默认目录是 /etc/ssl/certs/。 |
| GnuTLS | 提供 API 函数,从硬编码的目录、文件或 配置的 PKCS #11 模块加载证书。在后一种情况下,硬编码的 URL 允许加载任意受信任的证书,或者加载模块中标记为 trust-policy: yes 的受信任 CA 证书,并可选择附加过滤条件。[1], [2]。 |
从 配置的 PKCS #11 模块加载所有受信任的 CA 证书,并标记为 trust-policy: yes。 |
| Network Security Services | 自动从由专用 API 管理的动态配置的 PKCS #11 模块列表中加载证书。配置可以存储在用户指定的任何目录中。列表始终包含内置模块,该模块将对象存储在用户提供的同一目录中。[3], modutil(1)。 | |
| mbed TLS | 用户应加载证书。[4]。 | |
| LibreSSL | 提供 API 函数,从硬编码的目录或文件中加载证书。libressl-SSL_CTX_load_verify_locations(3)。 | 默认文件是 /etc/libressl/cert.pem,默认目录是 /etc/libressl/certs/。 |
信任管理
对于信任管理,提供了 trust(1) 工具。该工具操作一个列表,其中包含设置了 trust-policy: yes 的 PKCS #11 模块,这些模块按 priority: 设置排序。有关模块配置的详细信息,请参阅 pkcs11.conf(5)。
列出信任存储项
$ trust list
将证书添加到信任存储
# trust anchor certificate.crt
证书应为 持久性、DER 或 PEM 格式(包括 OpenSSL 特有的受信任证书格式)。此命令将证书存储在查询模块列表时找到的第一个可写令牌中。
从信任存储中移除证书
$ trust anchor --remove 'pkcs11:id=%00%11%22%33%44%55%66%77%88%99%AA%BB%CC%DD%EE%FF%00%11%22%33;type=cert'
覆盖默认信任
默认信任存储 p11-kit-trust.so 包含一个位于 /etc/ca-certificates/trust-source/blocklist/ 的黑名单目录,其中的证书将对所有用途都被视为不可信。
代表 /usr/share/ca-certificates/trust-source/ 中证书的令牌始终是写保护的。要使默认证书颁发机构不可信,可以将其提取到系统的黑名单中。
$ trust extract --format=pem-bundle --filter='pkcs11:id=%00%11%22%33%44%55%66%77%88%99%AA%BB%CC%DD%EE%FF%00%11%22%33;type=cert' /etc/ca-certificates/trust-source/blocklist/untrusted_authority.pem
或者,也可以从 /etc/ca-certificates/extracted/cadir/ 路径将已提取的证书复制到黑名单。有关更多信息,请参阅 update-ca-trust(8) § SOURCE CONFIGURATION。
获取证书
第一步是生成私钥。在生成密钥之前,使用 umask 设置一个限制性的文件模式创建掩码(例如 077)。这确保 openssl 写入的密钥是受保护的。
/etc/ssl/private 目录,因此需要 umask。请参阅 archlinux/packaging/packages/openssl#1。椭圆曲线是较新的算法,并在现代系统中越来越被采用。预估一个 256 位椭圆曲线密钥在 2030 年之前都能提供足够的安全性[5]。Curve25519 是一种椭圆曲线算法,具有良好的安全性和性能特性。
RSA 是一种较老的密码系统,兼容性更高,尤其适用于不支持最新 TLS 版本的客户端。然而,RSA 依赖于因子分解,这是密码学中一个可能因更快的因子分解算法的发展而逐渐变弱的领域[6]。预计 2048 位 RSA 私钥在 2020 年代的大部分时间里都能提供安全性[7]。预计 4096 位 RSA 私钥能提供更持久的安全性(除非在因子分解方面有重大突破),但性能影响非常大。可以使用 openssl speed rsa2048 rsa4096 来衡量性能差异[8]。
生成密钥后,可以通过 证书签名请求 (CSR) 从证书颁发机构获取证书,或者证书也可以是 自签名 的。虽然自签名证书可以轻松生成,但客户端默认会拒绝它们,这意味着每个客户端都需要配置为信任该自签名证书。
实际生成命令请参考所用实现的文章
- 您可以从 Let's Encrypt 证书颁发机构获取免费的可信证书,通过 ACME。
- 您可以使用 mkcert 工具创建本地可信的开发证书。另请参阅 localhost 证书。
服务器端建议
由于存在 针对 TLS 的各种攻击,应考虑最佳实践。
- 禁用 SSLv3 以防止 POODLE 攻击。
- weakdh.org 的 TLS 部署 Diffie-Hellman 指南
- Mozilla 的服务器端 TLS 文章
- SSL Labs 的 SSL 和 TLS 部署最佳实践
- 推荐的流行服务的 TLS/SSL 配置
检查 TLS
检查 TLS 的程序
检查 TLS 的网站
- https://dev.ssllabs.com/ssltest/ (仅限 HTTPS)
- https://www.checktls.com/ (仅限电子邮件)
- https://www.immuniweb.com/ssl/ (任何端口)
- https://tls.imirhil.fr/tls (任何端口)
杂项
ACME 客户端
《自动化证书管理环境》(ACME) 协议允许您从 证书颁发机构(如 Let's Encrypt)请求有效的 X.509 证书。
另请参阅 ACME 客户端列表。
- acme-cli — 使用 Ruby 的另一个 Letsencrypt (ACME) 客户端。
- acme-tiny — 一个 200 行的 Python 脚本,用于从 Let's Encrypt 发行和续订 TLS 证书。
- acme.sh — 一个纯 Unix shell 脚本 ACME 客户端。
- acmetool — 一个易于使用的 ACME CLI,用 Go 编写。
- Certbot — Let's Encrypt 推荐的 ACME 客户端,用 Python 编写。
- dehydrated — ACME 客户端,包括对通配符证书的支持!用 Bash 编写。
- getssl — ACME 客户端,用 Bash 编写。
- lego — Lets Encrypt 客户端和 ACME 库,用 Go 编写。
- manuale — 一个完全手动操作的 Let's Encrypt 客户端,用 Python 编写。
- ruby-acme-client — Let's Encrypt 的 ACME 协议的 Ruby 客户端。
- simp_le — 简单的 Let's Encrypt 客户端,用 Python 编写。
OCSP
《在线证书状态协议》(OCSP) 由 Firefox 支持。Chromium 有自己的机制[9]。
另请参阅 GnuTLS 的 ocsptool(1) 和 OpenSSL 的 ocsp(1ssl)。
HSTS
《HTTP 严格传输安全》(HSTS) 机制由 Firefox、Chromium 和 wget (~/.wget-hsts) 支持。