FreeBSD证书信任管理
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
- 本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com(#改为@)。
- 本站原创内容未经允许不得转载,转载请注明出处“站长百科”和原文地址。