传输层安全

出自 ArchWiki
(重定向自 ACME

根据维基百科

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

实现

此条目或章节需要扩充。

原因:提及 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 中间人代理

从信任存储删除证书

$ 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 证书颁发机构授权

参见