传输层安全

出自 ArchWiki
(重定向自 LibreSSL

根据 维基百科

传输层安全TLS)及其现已弃用的前身 安全套接层SSL)是旨在提供计算机网络通信安全的密码协议。 这些协议的多个版本被广泛应用于网络浏览、电子邮件、即时消息和互联网语音通话(VoIP)等应用程序中。 网站可以使用 TLS 来保护其服务器和 Web 浏览器之间的所有通信。

实现

此文章或章节需要扩充。

原因: 提及 NSS 与其他实现不同,使用数据库。(在 Talk:Transport Layer Security 中讨论)

有多种 TLS 实现可用。 OpenSSL 应该已经安装在您的系统上,因为它是 base 元软件包base > coreutils > openssl)的间接依赖项。 GnuTLS 可能已经安装在您的系统上,因为它被许多软件包所需要。

  • OpenSSL — 强大、商业级且功能齐全的 TLS 和 SSL 协议工具包; 也是一个通用的密码学库。
https://www.openssl.org/ || openssl
  • GnuTLS — TLS、SSL 和 DTLS 协议的自由软件实现。 提供用于 X.509、PKCS #12 和其他结构的 API。
https://www.gnutls.org/ || gnutls
https://mdn.org.cn/en-US/docs/Mozilla/Projects/NSS || nss
  • mbed TLS — 便携式 SSL/TLS 实现,又名 PolarSSL。
https://tls.mbed.org/ || mbedtls
  • LibreSSL — OpenBSD 项目于 2014 年从 OpenSSL 分叉出来的 TLS/crypto 堆栈版本,旨在使代码库现代化并提高安全性。
https://www.libressl.org/ || libressl

证书颁发机构

使用 TLS 时,一组 证书颁发机构 (CA) 检查并签署服务器 公钥证书 的真实性。 通过 TLS 连接到服务器的客户端可以通过依赖 CA 的数字签名来验证其证书的真实性。 为了检查数字签名,客户端必须拥有 CA 的公钥,该公钥通过单独的路径获得并存储为自签名证书。 在 Arch Linux 上,默认的 CA 证书集由 ca-certificates 软件包提供。

注意: 目前,Arch Linux 使用来自 Mozilla CA 证书存储 的 CA 证书作为默认集。

Arch Linux 提供了一个集中的系统范围接口来管理 CA 证书。 此接口是来自 libp11-kit 软件包的库 /usr/lib/pkcs11/p11-kit-trust.so,它为存储在 /usr/share/ca-certificates/trust-source/(令牌“Default Trust”)和 /etc/ca-certificates/trust-source/(令牌“System Trust”)中的证书提供了 PKCS #11 API。

为了从命令行使用该接口,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] 从标记为 trust-policy: yes配置的 PKCS #11 模块加载所有受信任的 CA 证书。
网络安全服务 自动从动态配置的 PKCS #11 模块列表中加载证书,该列表通过专用 API 管理。 配置可以存储在用户提供的任何目录中。 该列表始终包含内置模块,该模块将对象存储在同一用户提供的目录中。 [3], modutil(1)
mbed TLS 用户应加载证书。 [4]
LibreSSL 提供 API 函数,用于从硬编码的目录或文件中加载证书。 libressl-SSL_CTX_load_verify_locations(3) 默认文件是 /etc/libressl/cert.pem,默认目录是 /etc/libressl/certs/
注意: 目前,LibreSSL 使用自己的 CA 证书集。 请参阅 FS#69298

信任管理

对于信任管理,提供了 trust(1) 实用程序。 该实用程序对具有 trust-policy: yes 设置的 PKCS #11 模块列表进行操作,该列表按 priority: 设置排序。 有关模块配置的详细信息,请参阅 pkcs11.conf(5)

注意: 在更改信任存储后,您应始终运行 update-ca-trust(8),以使更改对不支持 PKCS #11 接口的库可见。
提示: 您还可以使用通用工具来处理 PKCS #11 模块,例如 p11tool(1)pkcs11-tool(1)

列出信任存储项目

$ trust list

向信任存储添加证书

# trust anchor certificate.crt

证书应采用 持久性、DER 或 PEM 格式(包括 OpenSSL 特定的受信任证书格式)。 此命令将证书存储在通过查询模块列表找到的第一个可写令牌中。

警告: 这允许任何有权访问私钥的人拦截您的所有 TLS 流量。 请参阅 HTTPS MITM 代理

从信任存储中删除证书

$ 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 写入的密钥受到读取保护。

注意: 与其他 Linux 发行版不同,Arch 中的 openssl 软件包没有正确保护 /etc/ssl/private 目录,因此需要 umask。 请参阅 FS#43059

密钥可以使用 椭圆曲线RSA 算法。

椭圆曲线是较新的算法,并且正越来越多地被现代系统采用。 预计 256 位椭圆曲线密钥将在 2030 年之前提供足够的安全性 [5]Curve25519 是一种具有良好安全性和性能特性的椭圆曲线算法。

RSA 是一种较旧的密码系统,具有更高的兼容性,尤其是对于不支持最新 TLS 版本的客户端。 但是,RSA 依赖于 因式分解,这是一个密码学领域,由于更快的因式分解算法的开发,该领域可能正在变得越来越弱 [6]。 预计 2048 位 RSA 私钥将在 2020 年代的大部分时间里提供安全性 [7]。 4096 位 RSA 私钥预计会提供更长时间的安全性(除非因式分解取得重大进展),但会对性能产生非常大的影响。 可以使用 openssl speed rsa2048 rsa4096 [8] 对性能差异进行基准测试。

密钥生成后,可以从证书颁发机构获取证书以及 证书签名请求 (CSR),或者证书可以是自签名的。 虽然自签名证书可以轻松生成,但客户端默认会拒绝它们,这意味着每个客户端都需要配置为信任自签名证书。

有关实际生成命令,请参阅所用实现的文章

提示

服务器端建议

由于存在 针对 TLS 的各种攻击,因此应考虑最佳实践

检查 TLS

检查 TLS 的程序

检查 TLS 的网站

杂项

ACME 客户端

自动化证书管理环境 (ACME) 协议允许您从 证书颁发机构(如 Let's Encrypt)请求有效的 X.509 证书。

另请参阅 ACME 客户端列表

  • acme-cli — 又一个使用 Ruby 的 Letsencrypt (ACME) 客户端。
https://github.com/zealot128/ruby-acme-cli || acme-cliAUR
  • acme-tiny — 一个 200 行的 Python 脚本,用于从 Let's Encrypt 颁发和续订 TLS 证书。
https://github.com/diafygi/acme-tiny || acme-tiny
  • acme.sh — 一个纯 Unix shell 脚本 ACME 客户端。
https://github.com/acmesh-official/acme.sh || acme.sh
  • acmetool — 一个易于使用的 ACME CLI,用 Go 编写。
https://github.com/hlandau/acme || acmetoolAUR
  • Certbot — Let's Encrypt 推荐的 ACME 客户端,用 Python 编写。
https://github.com/certbot/certbot || certbot
  • dehydrated — ACME 客户端,包括对通配符证书的支持! 用 Bash 编写。
https://github.com/lukas2511/dehydrated || dehydrated
  • getssl — ACME 客户端,用 Bash 编写。
https://github.com/srvrco/getssl || getsslAUR
  • lego — Lets Encrypt 客户端和 ACME 库,用 Go 编写。
https://github.com/go-acme/lego || lego
  • manuale — 一个完全手动的 Let's Encrypt 客户端,用 Python 编写。
https://github.com/veeti/manuale || manualeAUR
  • ruby-acme-client — 一个用于 letsencrypt 的 ACME 协议的 Ruby 客户端。
https://github.com/unixcharles/acme-client || ruby-acme-clientAUR
  • simp_le — 简单的 Let's Encrypt 客户端,用 Python 编写。
https://github.com/zenhack/simp_le || simp_le-gitAUR

OCSP

在线证书状态协议 (OCSP) 受 Firefox 支持。 Chromium 有其自己的机制[9]

另请参阅 GnuTLS 的 ocsptool(1) 和 OpenSSL 的 ocsp(1ssl)

HSTS

HTTP 严格传输安全 (HSTS) 机制受 Firefox、Chromium 和 wget (~/.wget-hsts) 支持。

DNS CAA

请参阅 Wikipedia:DNS 证书颁发机构授权

参见