mk-ca-bundle 使用指南:将 Mozilla 根证书库转换为 curl 可用的 PEM 格式 CA Bundle
发布时间:2026/9/11 23:50:54 锦皓数字建站

mk-ca-bundle 使用指南将 Mozilla 根证书库转换为 curl 可用的 PEM 格式 CA Bundle【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curl本文以 curl 仓库中的官方文档 docs/mk-ca-bundle.md 为骨架结合其真实实现 scripts/mk-ca-bundle.pl完整讲解mk-ca-bundle这一 Perl 工具的功能、全部命令行选项、底层工作流程与产物格式。读完本文你可以用它一键从 Mozilla 源码树抓取certdata.txt并生成ca-bundle.crt也可以按需定制要纳入 bundle 的信任目的、信任级别与摘要算法从而为 curl、libcurl、OpenSSL/GnuTLS 应用乃至 Apache mod_ssl 提供一份最新、可控的 CA 证书包。工具定位与基本用法mk-ca-bundle是一个随 curl 仓库发布的 Perl 脚本即 scripts/mk-ca-bundle.pl当前脚本版本 1.33其核心作用是将 Mozilla 的证书包转换为 PEM 格式convert Mozillas certificate bundle to PEM format。它通过 HTTPS 从 Mozilla 源码树下载certdata.txt文件解析后把其中的证书提取为 PEM 格式。默认只提取被信任用于签发 SSL 服务器认证证书的 CA 根证书随后借助 OpenSSL 命令行工具加工产出最终的 ca-bundle 输出文件。命令语法SYNOPSISmk-ca-bundle [options] [output]默认输出文件名为ca-bundle.crt如果把output指定为单个连字符-则结果直接写到 STDOUT 而不是文件对应源码 scripts/mk-ca-bundle.pl 中my $crt $ARGV[0] || ca-bundle.crt;与my $stdout $crt eq -;。脚本输出的 PEM 格式可直接被基于 OpenSSL 或 GnuTLS 的应用程序使用典型代表就是 curl 与 libcurl。关于生成文件如何接入 curl可参考 docs/SSLCERTS.md 与 docs/cmdline-opts/cacert.md详见后文与 curl 的集成使用一节。工作原理从 certdata.txt 到 ca-bundle.crt结合 scripts/mk-ca-bundle.pl 的实现完整处理链路如下确定数据源 URL。根据-d参数从内置的 URL 快捷表scripts/mk-ca-bundle.pl中取出对应地址默认是release分支如果-d给的不是合法名字则把该值直接当作自定义 URL 使用。下载 certdata.txt。优先调用系统curl要求其https协议支持见 scripts/mk-ca-bundle.pl执行形如curl -Lw %{response_code} -o certdata.txt URL的命令并默认附加--proto https强制只走 HTTPS若curl不存在或缺少 HTTPS 支持则回退到 Perl 的LWP::UserAgentscripts/mk-ca-bundle.pl。增量更新判断。脚本读取旧输出文件头部内嵌的## SHA256: ...注释与新下载文件的 SHA256 对比oldhash/newhash见 scripts/mk-ca-bundle.pl若二者相同且未指定-f则直接退出——这正是force rebuild even if certdata.txt is current的由来。解析并筛选。逐行解析certdata.txt识别每个证书的 main block 与 trust block剔除已过期的证书并按-p指定的信任目的/信任级别过滤见 scripts/mk-ca-bundle.pl。写出 PEM 并原子替换。证书先写入临时文件ca-bundle.crt.~全部处理完后若指定-b则把旧文件备份为ca-bundle.crt.~1~、~2~…否则直接删除旧文件最后把临时文件改名为最终输出scripts/mk-ca-bundle.pl。配合-t时还会把 PEM 管道交给openssl x509 -hash -fingerprint与openssl x509 -text追加指纹与文本信息。输出文件的头部注释scripts/mk-ca-bundle.pl会记录数据来源时间、源 URL、转换工具版本以及## SHA256: hash一行——后者既是上述增量判断的依据也方便用户事后校验文件完整性。选项详解mk-ca-bundle支持下列选项对应源码getopts(bd:fhiklmnp:qs:tuvw:)见 scripts/mk-ca-bundle.pl选项说明备注/默认值-b备份已存在的output文件备份文件命名为output.~1~、output.~2~…依次递增-d [name]指定从哪个 Mozilla 源码树拉取certdata.txt或直接给自定义 URL默认release详见下方数据源小节-f即使certdata.txt没有更新也强制重新生成1.17 版本加入-i打印所用 Perl 模块的版本信息脚本会逐一报告 Perl、Encode、MIME::Base64、LWP、Digest::SHA 等版本-k允许不安全的传输自 1.27 起默认在 HTTPS 传输失败时报错退出-k覆盖该决定同时意味着可能遭受中间人攻击-l打印certdata.txt的许可证信息对应输出文件中BEGIN/END LICENSE BLOCK段落-m把原始文件中的证书元数据注释一并带入输出1.26 加入mk-ca-bundle 本身不做任何解析-n不下载certdata.txt直接使用本地已有文件-p [purposes]:[levels]指定纳入输出的 Mozilla 信任目的与信任级别默认SERVER_AUTH:TRUSTED_DELEGATOR详见下方信任目的与信任级别-q静默模式完全不输出进度信息源码中所有进度均走report()并受$opt_q抑制scripts/mk-ca-bundle.pl-s [algorithms]明文列表模式下用于计算证书指纹的签名算法列表逗号分隔详见下方签名算法-t在输出中包含证书的纯文本列表会调用 OpenSSL 输出指纹与证书文本-u处理完成后删除certdata.txt-v冗长模式逐个打印已处理的 CA 名称例如Processed: caname与跳过原因另外从源码还可以看到两个文档正文未单列、但脚本确实支持的选项-w l设置输出中 Base64 行的换行宽度默认 76 字符scripts/mk-ca-bundle.pl。-h打印完整帮助信息特殊值-d risk会打印关于使用风险的长篇警告。数据源-d官方文档列出的合法名字包括aurora、beta、central、Mozilla、nss、release默认。而当前仓库中 scripts/mk-ca-bundle.pl 实际内置了三组快捷方式autoland→ firefox 的 autoland 分支security/nss/lib/ckfw/builtins/certdata.txtbeta→ firefox 的 beta 分支同名路径release默认→ firefox 的 release 分支同名路径也就是说文档列出的名字是历史上/规范意义上的可选树而脚本 1.33 版本实际维护的是autoland、beta、release三组地址。除快捷方式外的任意-d值都会被当作完整 URL 使用。需要留意的是脚本默认强制 HTTPS--proto https非 HTTPS 的 URL 必须配合-k才能下载。信任目的与信任级别-p-p参数格式为目的列表:级别列表两边均为逗号分隔的列表例如默认值SERVER_AUTH:TRUSTED_DELEGATOR表示纳入所有被信任为可签发服务器证书委托人的 CA。合法值如下信任目的purposesALL、DIGITAL_SIGNATURE、NON_REPUDIATION、KEY_ENCIPHERMENT、DATA_ENCIPHERMENT、KEY_AGREEMENT、KEY_CERT_SIGN、CRL_SIGN、SERVER_AUTH默认、CLIENT_AUTH、CODE_SIGNING、EMAIL_PROTECTION、IPSEC_END_SYSTEM、IPSEC_TUNNEL、IPSEC_USER、TIME_STAMPING、STEP_UP_APPROVED。信任级别levelsALL、TRUSTED_DELEGATOR默认即 CA、NOT_TRUSTED不要信任这些证书、MUST_VERIFY_TRUST明确声明不是 CA 但其余没问题应用应忽略其他将其当作 CA 的来源、TRUSTED该证书本身受信任但不能委派即不是 CA。后三个级别的语义注释可直接在 scripts/mk-ca-bundle.pl 中看到。过滤逻辑在should_output_cert()scripts/mk-ca-bundle.pl对每个被要求的信任级别只要该级别下存在任意一个被要求的目的该证书就被纳入输出。参数解析则由parse_csv_param()完成——大小写不敏感、容忍空白、ALL等价于展开全部合法值非法值会报错并打印帮助后退出scripts/mk-ca-bundle.pl。签名算法-s-s仅在-t明文列表模式下生效用于指定对每张证书计算哪些指纹。官方文档给出的合法算法为ALL、NONE、MD5默认、SHA1、SHA256、SHA384、SHA512不过当前仓库 scripts/mk-ca-bundle.pl 的实际实现中默认值已是SHA256且valid_signature_algorithms仅校验SHA256、SHA384、SHA512三种。以源码为准实际可用集合是这三个 SHA-2 家族算法加ALL运行时会为每个算法执行一次openssl x509 -alg -fingerprint -noout -inform PEM再执行一次openssl x509 -text输出证书文本scripts/mk-ca-bundle.pl。certdata.txt 文件格式与解析要点文档指出Mozilla 用于承载这些信任信息的文件格式有官方规范文档说明。结合 scripts/mk-ca-bundle.pl 的解析逻辑可以总结出该格式的关键结构文件以***** BEGIN LICENSE BLOCK *****/***** END LICENSE BLOCK *****包裹许可证文本脚本会原样透传到输出文件-l时同时打印到终端。数据区由若干被空行分隔的块组成每个证书先有 main block# Certificate 名称紧跟着 trust block# Trust for 名称其余如文档注释块、BEGINDATA、# Explicitly Distrust certname等块会被忽略。main block 中带#前缀的行是证书的纯文本元数据Issuer、Subject、Fingerprint、# Not Valid After : ...等。脚本特别解析Not Valid After时间戳已过期的证书直接跳过scripts/mk-ca-bundle.pl。证书对象属性以CKA_*形式出现如CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE、CKA_LABEL UTF8 ...证书 DER 数据位于CKA_VALUE MULTILINE_OCTAL之后、END之前以八进制转义序列编码脚本逐字节还原为二进制后做 Base64 并包装成 PEMscripts/mk-ca-bundle.pl。trust block 中的CKA_TRUST_目的 CK_TRUST CKT_NSS_级别行即每张证书在各信任目的上的信任级别是-p过滤的直接数据来源。脚本还会做一致性校验例如 main block 与 trust block 的证书名必须一致名字含distrust的证书其全部信任目的必须都是NOT_TRUSTED级别否则报错退出scripts/mk-ca-bundle.pl。输出产物说明默认生成的ca-bundle.crt具有如下特征头部为##注释块注明数据来自 Mozilla 的时间与 URL、转换工具版本、以及## SHA256:摘要scripts/mk-ca-bundle.pl。每个证书前以\n证书名\n...形式打印一行等号分隔线开启-t时还会追加每个信任级别的目的列表以及经 OpenSSL 计算的指纹与证书文本。证书体为标准 PEM 块-----BEGIN CERTIFICATE-----/-----END CERTIFICATE-----Base64 行宽默认 76 字符可用-w调整。文件头部注释明确提示该 bundle 可直接用于 curl / libcurl / php_curl也可作为 Apache mod_ssl 的SSLCACertificateFile配置项使用。退出状态返回0表示成功含数据未更新、直接退出的幂等情形。返回1表示下载数据失败例如HTTPS 传输失败且未使用-k、URL 非 HTTPS、curl与LWP均不可用、或 HTTP 状态下载未获 200/304 响应等scripts/mk-ca-bundle.pl。与 curl 的集成使用生成的 bundle 可以直接交给 curl 使用相关机制在 docs/SSLCERTS.md 与 docs/cmdline-opts/cacert.md 中有系统说明命令行显式指定curl --cacert ca-bundle.crt https://example.com。--cacert指定的文件可包含多个 CA 证书且必须为 PEM 格式通常用于覆盖 curl 内置的默认文件。环境变量非 Schannel 后端下curl 会识别CURL_CA_BUNDLE环境变量作为 CA bundle 路径SSL_CERT_FILE与SSL_CERT_DIR同样被支持。--cacert优先级高于CURL_CA_BUNDLE。Windows 自动查找curl 会按程序目录 → 当前工作目录 → Windows 系统目录 → Windows 目录 → PATH 中所有目录的顺序查找名为curl-ca-bundle.crt的文件。因此把 mk-ca-bundle 的输出改名放到上述任一位置即可被 Windows 版 curl 自动加载curl 8.11.0 起可通过编译选项禁用该搜索8.19.0 起可选择默认启用原生 CA 存储。通用场景TLS 验证默认开启服务器证书须由本地 CA 存储中的受信 CA 签发且域名匹配才会通过校验自签名证书或未收录的 CA 会导致校验失败此时可用--cacert指向自建/私有 CA 的 PEM 文件。需要强调-k/--insecure跳过验证仅建议用于实验与开发生产环境不应使用。典型用法示例# 1. 最基本用法下载 release 分支 certdata.txt 并生成 ca-bundle.crt mk-ca-bundle # 2. 生成后删除源数据文件并备份旧 bundle mk-ca-bundle -b -u # 3. 使用 beta 分支数据源强制重建输出到指定文件 mk-ca-bundle -d beta -f my-ca.crt # 4. 静默模式 输出到 STDOUT便于管道处理 mk-ca-bundle -q - # 5. 额外包含客户端认证用途的 CA并附带证书明文列表与 SHA256/SHA512 指纹 mk-ca-bundle -t -s SHA256,SHA512 -p SERVER_AUTH,CLIENT_AUTH:TRUSTED_DELEGATOR # 6. 不联网用本地已有的 certdata.txt 重建 mk-ca-bundle -n # 7. 查看脚本与依赖模块版本信息 mk-ca-bundle -i如需在离线或受限环境下自建 CA bundle仓库还提供了另一份 shell 实现 scripts/firefox-db2pem.sh同样以ca-bundle.crt为默认输出可供对照完整的证书校验原理与 CA 存储机制可进一步阅读 docs/SSLCERTS.md。【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。