Ubuntu系统默认使用的apt源地址大多是http开头的,这意味着你在执行apt update、apt install等操作时,软件包列表和下载内容都是以明文方式在网络上传输的。任何人只要在同一网络链路中进行抓包,就能看到你在安装什么软件、从哪个镜像站下载了什么版本的包,甚至可以篡改传输内容植入恶意代码。解决这个问题的核心方法就是把sources.list里的http全部替换成https,让整个传输过程走TLS加密通道。下面我会从原理、操作步骤、常见问题到进阶配置,把这件事讲透。

为什么apt源必须用HTTPS

HTTP协议本身不加密,数据在传输过程中就是裸奔状态。apt包管理器在更新源的时候,会先下载一个Release文件和Release.gpg签名文件来验证源的合法性。如果你用的是http,虽然有GPG签名校验机制,但攻击者可以在传输过程中进行中间人攻击(MITM),比如在你和镜像站之间拦截并替换Release文件,让你的系统信任一个被篡改的恶意源。换成HTTPS之后,TLS证书验证机制会确保你连接的确实是官方镜像服务器,而不是某个伪造的中间节点。这不是可选的安全加固,而是生产环境和个人服务器都应该默认启用的基础配置。

另外还有一个容易被忽略的点:Ubuntu 22.04 LTS及以后的版本,官方源地址本身就已经默认支持https了。但如果你手动添加了第三方源,或者从旧版本升级上来,很可能还残留着http地址。所以不管你用的是哪个版本,都建议统一检查一遍。

查看当前apt源是否使用HTTPS

在动手改之前,先看看你现在的源配置是什么状态。Ubuntu的apt源配置文件主要在两个地方:

/etc/apt/sources.list
/etc/apt/sources.list.d/ 目录下的所有 .list 和 .sources 文件

你可以用以下命令快速查看所有源地址:

grep -r "http://" /etc/apt/sources.list /etc/apt/sources.list.d/

如果输出为空,说明你的源已经全部是https了。如果有输出,就会列出所有还在用http的源地址,接下来就需要逐一替换。

手动修改sources.list文件

最直接的方法就是编辑主配置文件。先备份再操作:

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

然后用编辑器打开:

sudo nano /etc/apt/sources.list

把所有的 http:// 替换成 https://。注意,不是所有http都要改,有些源可能确实不支持https,这种情况你需要换一个支持https的镜像站。Ubuntu官方源、阿里云、清华、中科大这些主流镜像都支持https。替换完成后保存退出,然后执行:

sudo apt update

如果没有报错,说明替换成功。如果出现证书错误或者连接失败,说明那个源不支持https或者证书有问题,需要换源。

使用sed命令批量替换

如果你不想手动一个个改,可以用sed一行命令搞定:

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

同样的,sources.list.d目录下的文件也需要处理:

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

改完之后记得执行apt update验证。

Ubuntu 24.04新格式的DEB822源文件处理

从Ubuntu 24.04开始,apt默认使用DEB822格式的源文件,文件扩展名是.sources而不是.list。这种格式的文件结构不一样,不能简单用sed替换,因为格式是这样的:

Types: deb
URIs: https://mirrors.aliyun.com/ubuntu/
Suites: noble
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

你需要确保URIs字段是https开头的。如果是http,手动改成https即可。可以用以下命令批量检查:

grep -r "URIs: http" /etc/apt/sources.list.d/*.sources

找到后用编辑器逐个修改URIs行。

第三方PPA源的HTTPS处理

很多用户会添加第三方PPA源,比如显卡驱动、特定软件等。PPA源默认也是http的。你需要先删除旧的再重新添加https版本,或者手动修改。查看已添加的PPA:

ls /etc/apt/sources.list.d/ | grep -i ppa

打开对应的文件,把http改成https。但要注意,不是所有PPA都支持https,有些老旧的PPA可能只提供http。这种情况下你有两个选择:一是找一个支持https的替代源,二是保留http但通过其他方式(比如在网络层做加密)来保护。不过从安全角度,我强烈建议只使用支持https的源。

验证HTTPS连接是否真正生效

改完之后不要以为就万事大吉了,你需要验证传输确实走了加密通道。可以用以下方法:

第一,执行apt update时观察输出,如果源地址显示的是https开头,说明配置正确。第二,用tcpdump抓包验证:

sudo tcpdump -i eth0 port 443 -c 10

如果能抓到443端口的流量,说明确实在走HTTPS。如果你发现还有80端口的流量,说明某个源还是http,需要继续排查。

第三,检查证书是否有效:

openssl s_client -connect mirrors.aliyun.com:443 -servername mirrors.aliyun.com

如果证书链完整且没有过期,说明TLS握手正常。

HTTPS源可能遇到的常见问题及解决

问题一:证书验证失败。表现为apt update时报类似"Certificate verification failed"的错误。解决方法是更新ca-certificates包:

sudo apt install --reinstall ca-certificates
sudo update-ca-certificates

问题二:某些镜像站https速度慢。这是正常的,因为TLS握手有额外开销。如果确实影响使用,可以选择离你物理距离近的镜像站,或者在公司内网部署本地缓存镜像。

问题三:旧版Ubuntu(如18.04)官方源不支持https。Ubuntu 18.04的官方源确实只有http,这种情况下建议升级系统版本,或者使用第三方提供https镜像的源。长期使用不加密的源在安全上是有风险的。

问题四:代理环境下HTTPS失败。如果你的网络环境需要通过代理访问外网,需要在apt代理配置中指定https代理:

echo 'Acquire::https::Proxy "http://proxy-server:port/";' | sudo tee /etc/apt/apt.conf.d/proxy.conf
进阶:配合其他安全措施形成完整防护

光把http改成https只是第一步。要真正保障apt源安全,还需要做到以下几点:

第一,确保GPG密钥完整。HTTPS保证传输不被篡改,GPG签名保证源本身没有被篡改,两者缺一不可。检查密钥是否存在:

ls /usr/share/keyrings/ | grep -i ubuntu

第二,定期更新密钥。密钥可能会轮换,过期的密钥会导致apt update报警告甚至失败:

sudo apt update
sudo apt install --reinstall ubuntu-keyring

第三,使用apt的安全特性。在apt.conf中可以强制启用一些安全选项:

echo 'Acquire::https::Verify-Peer "true";' | sudo tee -a /etc/apt/apt.conf.d/99security
echo 'Acquire::https::Verify-Host "true";' | sudo tee -a /etc/apt/apt.conf.d/99security

这两行配置确保apt在建立HTTPS连接时严格验证对方证书的合法性。

国内主流镜像站的HTTPS地址汇总

为了方便大家直接使用,这里列出几个常用的支持https的国内镜像源地址:

阿里云:

https://mirrors.aliyun.com/ubuntu/

清华大学:

https://mirrors.tuna.tsinghua.edu.cn/ubuntu/

中科大:

https://mirrors.ustc.edu.cn/ubuntu/

华为云:

https://mirrors.huaweicloud.com/ubuntu/

把这些地址替换到你的sources.list中即可。注意要根据你的Ubuntu版本代号(如noble、jammy、focal等)选择对应的目录。

总结与建议

把apt源从http迁移到https,操作本身不复杂,十分钟就能搞定,但意义重大。它堵住了中间人攻击这个最常见的网络安全漏洞之一,让你的系统更新过程从明文裸奔变成加密传输。对于服务器运维人员来说,这是基线安全配置的一部分;对于个人用户来说,这也是保护隐私和系统完整性的基本操作。建议每隔一段时间检查一次源配置,确保没有意外回退到http状态。安全不是一劳永逸的事,但把基础做对,就已经超过了大多数人。