🔗 动态 SSL 证书生成
- 目标:使用 SslBump 功能模拟网站时,减少“证书不匹配”浏览器警告的数量
- 状态:完成
- 版本: 3.2
- 开发者:AlexRousskov, Andrew Balabohin
- 更多:Squid v3.1 (r9820) 实现;需要 SslBump
🔗 详细信息
本文档介绍了用于 SslBump 环境的动态 SSL 证书生成功能。
🔗 动机
SslBump 用户知道,一个复杂的网站(使用专用的图像、样式和/或广告服务器来嵌入内容)会产生多少证书警告。这些警告是合法的,并且是由 Squid 提供的网站证书引起的。该证书可能有两方面问题:
- Squid 证书未由受信任的权威机构签名。
- Squid 证书名称与网站域名不匹配。
Squid 无法解决(A)问题,但在大多数目标环境中,用户会信任“中间人”权威机构并安装相应的根证书。
为避免(B)不匹配,DynamicSslCert 功能专注于生成与请求的网站域名匹配的网站证书。请注意,在用户已信任“中间人”的 SslBump 环境中,浏览器网站名称检查实际上并未增加太多安全性。该检查只会添加警告,并导致尝试减少警告数量(通过阻止某些嵌入式内容)的浏览器出现页面渲染问题。
🔗 使用技巧
以下是让动态 SSL 证书生成功能与您的 Squid 安装配合使用的快速指南。本简要文档不包含所有可能的配置。
🔗 构建 Squid
在构建 Squid 时添加 SSL Bump 和证书生成选项。动态生成 SSL 证书默认不启用。
./configure --enable-ssl --enable-ssl-crtd ...
make all
make install
注意:Squid-3.5 需要 –with-openssl 而不是 –enable-ssl
🔗 创建自签名根 CA 证书
此证书将由 Squid 用于为代理的网站生成动态证书。实际上,此证书将成为 根证书,您将成为根 CA。
如果您的证书被泄露,任何信任(有意或无意)您的根证书的用户可能无法检测到其他人策划的中间人攻击。
创建用于存储证书的目录(确切位置不重要)
cd /etc/squid
mkdir ssl_cert
chown squid:squid ssl_cert
chmod 700 ssl_cert
cd ssl_cert
创建自签名证书(系统会要求您提供将包含在证书中的信息)
使用 OpenSSL
openssl req -new -newkey rsa:2048 -sha256 -days 365 -nodes -x509 -extensions v3_ca -keyout myCA.pem -out myCA.pem
使用 GnuTLS certtool
certtool --generate-privkey --outfile ca-key.pem
certtool --generate-self-signed --load-privkey ca-key.pem --outfile myCA.pem
您也可以在 openssl.cfg 中指定一些必需的附加 CA 属性来减少提问。
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
[ v3_ca ]
keyUsage = cRLSign, keyCertSign
🔗 创建 DER 编码证书以导入用户浏览器
openssl x509 -in myCA.pem -outform DER -out myCA.der
结果文件(myCA.der)应导入到用户浏览器的“证书颁发机构”部分。
例如,在 FireFox 中
- 打开“首选项”
- 转到“高级”部分,“加密”选项卡
- 按“查看证书”按钮,然后转到“证书颁发机构”选项卡
- 按“导入”按钮,选择之前创建的 .der 文件,然后按“确定”
理论上,您必须将根证书导入到浏览器中,或者指导用户如何导入。不幸的是,众所周知的根 CA 机构将子根证书颁发给其他机构的做法似乎是 一种普遍做法。如果您从用户已信任的根 CA 机构获得了此类子根证书,则无需将您的证书导入到浏览器中。但是,走这条路可能会导致全球浏览器中删除知名的根 CA 证书。此类删除将使您的本地 SslBump 基础设施在您导入证书之前无法运行,但这可能只是您麻烦的开始。受影响的根 CA 机构会找上您来弥补其全球损失吗?当您的用户得知您未经他们同意解密了他们的流量时,他们会怎么做?
🔗 配置 Squid
打开 squid.conf 进行编辑,找到 http_port 选项并添加与证书相关的选项。例如:
http_port 3128 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/squid/ssl_cert/myCA.pem
您还需要添加 ssl_bump 规则以启用 HTTPS 解密。有关 Squid-3.5 的 peek-n-splice,请参阅。
其他配置选项(见下文)可以添加到 squid.conf 中来调整证书辅助配置,但不是必需的。如果省略,将使用默认值。
sslcrtd_program /usr/local/squid/libexec/ssl_crtd -s /usr/local/squid/var/lib/ssl_db -M 4MB
sslcrtd_children 5
sslcrtd_program 的默认磁盘缓存大小为 4MB(上方为 ‘-M 4MB’),这通常足以存储约 1000 个证书。如果在繁忙环境中使用 Squid,这可能需要增加,sslcrtd_children 的数量也可能需要增加。
准备用于缓存证书的目录
/usr/local/squid/libexec/ssl_crtd -c -s /usr/local/squid/var/lib/ssl_db
上述命令初始化 SSL 数据库以存储缓存的证书。有关 ssl_ctrld 程序的更多信息,请参阅 /usr/local/squid/libexec/ssl_crtd -h 的输出。
如果您运行的是具有多个证书缓存位置的多 Squid 环境,您可能还需要在初始化 ssl_db 时使用 '-n' 选项。该选项设置初始数据库序列号,该序列号在每个新证书中递增并使用。为避免实例之间的序列号重叠,可能需要手动设置初始序列号。
注意:无论何时更改签名 CA,请务必删除并重新初始化证书数据库。它包含已签名的证书,如果签名 CA 不再与您配置的 CA 匹配,客户端可能会遇到连接问题。
SSL 数据库初始化后,将目录设置为 squid 用户(例如 ‘nobody’)可写。
chown -R nobody /usr/local/squid/var/lib/ssl_db
现在您可以启动 Squid,修改用户浏览器设置以使用代理(如果需要),并确保签名证书已正确导入到浏览器中。如果一切都已正确完成,Squid 应该能够处理 HTTPS 网站而没有任何警告。
类别:功能
导航:站点搜索,站点页面,类别,🔼 向上