数字化技能提升教程,数字化时代生存宝典

FreeBSD证书信任管理

浏览:116

FreeBSD服务器访问内部管理站或业务API时,可能遇到证书验证失败。如果服务使用的是企业内部CA签发的证书,需要先核实该CA,再将其加入相应的信任库。certctl可以管理系统中的受信任证书,但应用是否采用这些证书,还取决于它使用的TLS库和配置。

一、确认版本和准备材料

以下步骤以FreeBSD 15.1及其默认certctl目录配置为例。不同版本的目录和子命令行为存在差异,不要将旧版示例与新版命令混用。

查看环境。

freebsd-version
command -v certctl
openssl version
man certctl

继续操作前,需要准备以下材料。

  • 通过可信渠道取得的内部根CA证书,采用PEM格式。
  • CA管理员提供的SHA-256指纹,用于独立核对。
  • 一个使用该CA签发证书的HTTPS服务。
  • 修改系统信任配置所需的root权限。

示例将CA证书放在下面的位置。

/root/company-root-ca.crt

intranet.example.com仅作为命令中的示例域名,执行前必须替换为实际服务域名。

需要的是CA的公开证书,不需要把CA私钥复制到这台服务器。安装受信任根CA会扩大本机接受的证书范围,应只导入来源及用途明确的证书。

后续命令在root权限的sh环境中执行。

su -
/bin/sh

二、核对证书身份和有效期

查看证书的主体、颁发者、有效期及SHA-256指纹。

openssl x509 \
  -in /root/company-root-ca.crt \
  -noout \
  -subject \
  -issuer \
  -dates \
  -fingerprint \
  -sha256

再检查基本约束。

openssl x509 \
  -in /root/company-root-ca.crt \
  -noout \
  -ext basicConstraints

用于本例的CA证书应具有适当的CA约束。检查输出中的CA:TRUE,同时核对有效期及指纹。仅看到CA:TRUE不能证明证书可信,指纹仍应与管理员通过独立可信渠道提供的值一致。

如果文件无法被解析,先确认它是否确实为证书,以及是否采用了预期格式,不要直接放入系统信任目录。

三、记录现有信任状态

创建独立备份目录,保存当前列表和证书包。

backup_dir=$(mktemp -d /root/certctl-backup.XXXXXX)

certctl -l list > "$backup_dir/trusted-before.txt"
certctl -l untrusted > "$backup_dir/untrusted-before.txt"

cp -p /etc/ssl/cert.pem "$backup_dir/cert.pem.before"

printf '%s\n' "$backup_dir"

记下输出的目录路径。这些文件用于变更前后对照。

在FreeBSD 15.1默认配置中,certctl会生成受信任证书目录及证书包,默认位置分别为/etc/ssl/certs和/etc/ssl/cert.pem。如果服务器设置了自定义信任路径,应先确认实际配置,再调整示例。

四、持久化导入内部CA

创建本地受信任证书目录。

install -d -o root -g wheel -m 755 \
  /usr/local/share/certs/trusted

安装已经核对过的CA证书。

install -o root -g wheel -m 644 \
  /root/company-root-ca.crt \
  /usr/local/share/certs/trusted/zzbaike-internal-root.crt

如果目标文件已经存在,先核对其内容并备份,不要直接覆盖。

然后重建信任库。

certctl -v rehash

查看更新后的列表。

certctl -l list

FreeBSD 15.1默认会扫描本地受信任证书目录。将证书保存在扫描路径中,再执行rehash,可以让配置在后续重建时继续生效。不要只在生成目录中手工放置文件,也不要把一次certctl trust操作当作已经完成持久化配置。

五、验证HTTPS证书链和域名

将以下命令中的域名替换为实际服务域名。

openssl s_client \
  -connect intranet.example.com:443 \
  -servername intranet.example.com \
  -verify_hostname intranet.example.com \
  -verify_return_error \
  -CAfile /etc/ssl/cert.pem \
  -no-CApath \
  -no-CAstore \
  < /dev/null

这里明确使用刚才重建的系统证书包进行验证,避免测试结果受到其他默认信任来源的影响。

其中,-servername用于发送SNI,-verify_hostname检查证书是否匹配访问域名,-verify_return_error使证书验证失败时终止握手。仅使用-servername不能替代域名验证。

检查输出中的证书验证结果。成功时通常能够看到下面的信息。

Verify return code: 0 (ok)

如果连接超时或被拒绝,应先检查网络和服务监听。TLS证书验证只有在连接能够建立后才有意义;验证通过也不代表应用接口本身一定返回正常业务结果。

六、导入后仍然失败时怎么排查

1. 检查服务端是否提供完整证书链

客户端信任根CA之后,服务端仍需要提供验证所需的中间证书。可以在前面的连接命令中增加-showcerts,查看服务端实际发送了哪些证书。

不要把“缺少中间证书”简单处理成“将所有收到的证书全部导入信任库”。

2. 检查证书覆盖的域名和有效期

导入CA不能解决证书过期、尚未生效或域名不匹配的问题。还需要确认服务器时间正确,并使用证书实际覆盖的域名访问服务。

3. 检查应用实际使用的证书库

命令行验证通过,而业务应用仍然报错时,应检查应用是否指定了其他CA文件或采用独立的信任库。

不要假定系统信任配置会自动控制所有应用。排查时需要找到应用真正读取的证书来源,再决定是否调整配置及重新加载进程。

七、撤销本次导入的信任

如果只是撤销本例新增的CA,可以将它移出信任扫描目录。

先创建一个新的备份目录。

rollback_dir=$(mktemp -d /root/certctl-removed.XXXXXX)

移动本次导入的文件并重建信任库。

mv /usr/local/share/certs/trusted/zzbaike-internal-root.crt \
  "$rollback_dir/zzbaike-internal-root.crt"

certctl -v rehash

随后检查列表,并重新执行HTTPS验证。

上述操作只针对本例新增的文件。如果同一个CA还存在于其他信任来源中,移走这一份文件并不一定能完全撤销它的信任。

八、需要明确列为不受信任时怎么办

如果希望在本机管理的信任库中明确排除某个CA,可以将经过核对的证书放入不受信任证书的扫描目录,再重建。

install -d -o root -g wheel -m 755 \
  /usr/local/share/certs/untrusted

install -o root -g wheel -m 644 \
/root/company-root-ca.crt \
/usr/local/share/certs/untrusted/zzbaike-internal-root.crt

certctl -v rehash
certctl -l untrusted

这比只执行一次certctl untrust更适合持久化管理。FreeBSD 15.1中,如果没有把证书保存在对应扫描目录,后续rehash可能清除临时设置。

以后需要恢复时,只移除本次添加的不受信任副本,确认可信来源中的证书仍然存在,再执行rehash。这类操作影响本地信任配置,不等同于向CA申请证书吊销。

九、常见问题

1. 添加内部CA后,是否能修复所有HTTPS错误

不能。CA信任只是验证的一部分,证书有效期、域名匹配及证书链仍需要正确。

2. 可以关闭证书验证来解决问题吗

不应将关闭验证作为正式解决办法。应根据错误信息修复信任来源、证书链或域名配置,保留对服务端身份的验证。

3. 系统升级后是否需要复查

建议重新检查证书列表及实际连接。certctl在不同版本间存在行为变化,升级后应确认自定义证书仍在正确的扫描目录中。涉及系统版本调整时,可以结合站内的FreeBSD系统升级与补丁管理教程安排操作。

广告合作

广告合作

QQ群号:4114653

QQ群号:4114653

温馨提示:
  1. 本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com(#改为@)。
  2. 本站原创内容未经允许不得转载,转载请注明出处“站长百科”和原文地址。