RHEL:HTTPS 内部仓库与 update-ca-trust
目标
在 RHEL 系列上用 HTTPS 搭建内部 dnf 仓库,把私有 CA 放入系统信任并完成安装。还要用到把信任范围缩小到一个仓库的 sslcacert。
为什么重要
把内部仓库改为 HTTPS 后,dnf 会在证书验证处停住,最常见的应对就是 sslverify=0。仓库元数据是决定安装什么的文档,不能关闭来源确认。只要会在系统级信任(update-ca-trust)和按仓库的信任(sslcacert)之间择一使用,就能不靠权宜之计解决问题。这个 Pod 连不上外部(只有 DNS)。软件包取自镜像内的 /opt/localrepo。
步骤
- 把
/opt/localrepo中的 tree rpm 复制到/srv/rpmrepo,并用createrepo_c创建仓库。 - 在
/root/pki中创建根证书(ca.crt、ca.key,CN 为Airgap Internal Root CA)和repo.airgap.internal证书(repo.crt、repo.key,带 SAN),并把该名称加入/etc/hosts。 - 用
/root/pki/serve.py在https://repo.airgap.internal:8443/提供/srv/rpmrepo。 - 在
/etc/yum.repos.d/airgap.repo中写入仓库airgap(开启签名检查,发行版密钥为/etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-9)。 - 关闭其他仓库,只用
airgap运行dnf makecache,把失败的输出保存到/root/rhel/tls-fail.txt。 - 把根证书以
airgap-root.crt放入系统信任,并重新提取。 - 只用
airgap仓库安装 tree。 - 用合作方 CA(
/root/pki/team-ca.crt,CN 为Partner Team CA)签发team.airgap.internal证书,在 9443 端口启动同样的仓库,并通过/etc/yum.repos.d/airgap-team.repo的sslcacert,让只有那个仓库信任这个 CA。合作方 CA 不放进系统信任。
参考
- 只用一个仓库:
dnf --disablerepo='*' --enablerepo=airgap makecache - 查看系统信任:
trust list | grep -A3 Airgap、提取:update-ca-trust extract - 是从哪里安装的:
dnf info --installed tree的From repo - 常见错误 1:用
sslverify=0蒙混过关。评分器会拒绝这个设置。 - 常见错误 2:连合作方 CA 也放进 anchors。那一刻,服务器上所有程序都会信任这个 CA。
用 createrepo_c 创建内部仓库
把 /opt/localrepo 中的 tree rpm 复制到 /srv/rpmrepo,并用 createrepo_c 创建仓库。
仓库由 rpm 文件和描述它们的 repodata 目录构成。给 createrepo_c 一个目录,它会生成 repomd.xml 和各个列表文件。
私有 CA 与仓库证书
在 /root/pki 中创建根证书(ca.crt、ca.key)和 repo.airgap.internal 证书(repo.crt、repo.key,带 SAN),并把该名称加入 /etc/hosts。
根证书是 CA:TRUE 的自签名,服务器证书则用根证书签名,同时通过扩展文件给出 SAN。流程与私有 CA 模块相同。
用 HTTPS 提供仓库
用 /root/pki/serve.py 在 https://repo.airgap.internal:8443/ 提供 /srv/rpmrepo。
用 ssl 上下文包装 Python 标准库的 http.server。这个镜像中的 Python 是 3.9。请放到后台启动,并用带 --cacert 的 curl 下载 repomd.xml 试试。
编写 .repo 文件
在 /etc/yum.repos.d/airgap.repo 中写入仓库 airgap(开启签名检查,指定发行版密钥)。
段名就是仓库 id。baseurl 是 repodata 所在目录的地址,同时要写上签名检查和公钥文件路径。不要写关闭证书验证的行。
记录证书验证失败
关闭其他仓库,只用 airgap 运行 dnf makecache,把失败的输出保存到 /root/rhel/tls-fail.txt。
同时使用 --disablerepo 和 --enablerepo,就可以只看一个仓库。请保存完整的输出(包括标准错误)。
把根证书放入系统信任
把根证书以 airgap-root.crt 放入系统信任,并重新提取。
RHEL 系列是放在 anchors 目录中,再运行提取命令。请用 trust list 确认标签和信任类型。
从内部仓库安装
只用 airgap 仓库安装 tree。
只开启一个仓库进行安装,就不可能来自其他地方。安装之后,请用 dnf info --installed 查看它来自哪个仓库。
只让一个仓库使用另一个 CA
用合作方 CA(/root/pki/team-ca.crt,CN 为 Partner Team CA)签发 team.airgap.internal 证书,在 9443 端口启动同样的仓库,并通过 /etc/yum.repos.d/airgap-team.repo 的 sslcacert,让只有那个仓库信任这个 CA。
合作方 CA 不放进 anchors。.repo 中有按仓库指定 CA 文件的选项。请用只开启该仓库的 makecache 来确认,并确认系统 curl 是否仍然拒绝。