在Ubuntu系统中,apt源默认使用HTTP协议传输软件包和元数据,这可能导致数据在传输过程中被窃听或篡改。为了提升安全性,我们可以强制apt使用HTTPS源,并结合证书固定技术来验证服务器身份,防止中间人攻击。具体操作包括:配置apt使用HTTPS源、安装必要的证书包、启用apt的证书固定功能,以及手动固定证书公钥。下面将详细展开每一步的实现方法。

为什么需要强制HTTPS和证书固定?

HTTP协议是明文传输的,这意味着在软件更新过程中,攻击者可以拦截并修改数据,甚至注入恶意软件包。HTTPS通过TLS/SSL加密解决了窃听问题,但仅使用HTTPS还不够——如果证书验证不严格,攻击者可能使用伪造证书进行中间人攻击。证书固定则是一种额外安全层,它将服务器证书的公钥哈希值存储在本地,apt在连接时会比对哈希值,只有匹配才信任连接。这确保了即使系统证书库被篡改,apt也只连接可信的源。

第一步:配置apt使用HTTPS源

首先,检查当前系统的源列表。Ubuntu的源配置文件位于/etc/apt/sources.list,以及/etc/apt/sources.list.d/目录下的独立文件。我们需要将所有HTTP URL替换为HTTPS。例如,默认的Ubuntu官方源可能类似"http://archive.ubuntu.com/ubuntu"。你可以使用sed命令批量替换:

sudo sed -i 's/http:/https:/g' /etc/apt/sources.list

然后,更新软件包列表以测试HTTPS连接是否正常:

sudo apt update

如果遇到证书错误,可能是因为系统缺少根证书包。安装ca-certificates包来修复:

sudo apt install ca-certificates

安装后再次运行apt update,应该能成功通过HTTPS获取数据。

第二步:启用apt的证书固定功能

Ubuntu的apt工具内置了证书固定支持,但默认可能未启用。证书固定通过"Acquire::https::Verify-Peer"和"Acquire::https::Verify-Host"选项控制。我们可以创建配置文件来强制启用。在/etc/apt/apt.conf.d/目录下新建一个文件,例如99cert-pinning:

sudo nano /etc/apt/apt.conf.d/99cert-pinning

添加以下内容:

Acquire::https::Verify-Peer "true";
Acquire::https::Verify-Host "true";

这两个选项确保apt验证服务器证书的完整性和主机名。保存后,apt将严格执行TLS验证。

第三步:手动固定证书公钥哈希

对于更高安全需求,我们可以固定特定源证书的公钥。首先,获取服务器证书的公钥哈希值。使用openssl命令从源URL提取:

openssl s_client -connect archive.ubuntu.com:443 </dev/null 2>/dev/null | openssl x509 -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256

这会输出一个SHA256哈希值。然后,在/etc/apt/apt.conf.d/目录下创建另一个配置文件,例如100pin-cert,并添加固定规则。例如,针对archive.ubuntu.com:

Acquire::https::archive.ubuntu.com::CaInfo "/etc/ssl/certs/ca-certificates.crt";
Acquire::https::archive.ubuntu.com::SslCert "/path/to/client/cert.pem";
Acquire::https::archive.ubuntu.com::SslKey "/path/to/client/key.pem";
Acquire::https::archive.ubuntu.com::Verify-Peer "true";
Acquire::https::archive.ubuntu.com::Verify-Host "true";
Acquire::https::archive.ubuntu.com::Pin-Sha256 "哈希值";

将"哈希值"替换为实际输出。这样,apt只会接受匹配该哈希的证书。

第四步:处理第三方和自定义源

对于第三方源,如PPA或企业内网源,步骤类似。首先确保源提供HTTPS支持,然后固定其证书。如果第三方源使用自签名证书,你需要将证书添加到本地信任库。将证书文件复制到/usr/local/share/ca-certificates/,然后运行:

sudo update-ca-certificates

之后,再按照上述方法固定哈希值。注意,自签名证书的安全风险较高,建议仅在受控环境中使用。

第五步:测试和故障排除

配置完成后,运行sudo apt update测试。如果出现证书错误,检查以下几点:证书是否过期、系统时间是否正确、防火墙是否阻塞TLS端口。可以使用调试模式查看详细错误:

sudo apt -o Debug::Acquire::https=true update

常见错误包括"Certificate verification failed"或"Handshake failed"。确保ca-certificates包为最新,并检查固定哈希值是否与服务器当前证书匹配——证书续期后哈希可能变化,需要更新。

进阶安全建议

除了证书固定,还可以结合其他措施提升整体安全:使用apt的镜像签名验证(通过apt-secure和Release.gpg文件),这独立于传输层加密;定期审计源列表,移除不必要或不可信的源;在防火墙规则中限制apt仅访问可信IP范围。对于企业部署,考虑设置本地APT镜像,并在镜像服务器上实施严格证书固定,这样客户端只需固定内部镜像证书即可。

总结与最佳实践

强制HTTPS和证书固定是Ubuntu系统安全的关键一环。它从传输层面防御了数据篡改和中间人攻击,特别适合高安全环境如服务器或开发工作站。建议在生产系统中默认启用,并定期审查证书状态。同时,记住安全是多层的——保持系统更新、使用强身份验证和最小权限原则同样重要。通过这些步骤,你可以显著增强Ubuntu软件管理的完整性和可信度。