RHEL8环境下cURL移除NSS支持后如何使用客户端证书?
最近我们团队从RHEL7升级到RHEL8时,踩了个挺棘手的坑:cURL移除了对NSS的支持后,之前用客户端证书的方式完全失效了,折腾了好一阵才搞定,这里把经验分享给大家。
先说说之前RHEL7的情况
在RHEL7的时候,事儿特别简单——只要我们把客户端证书导入到Firefox或者Chrome(这俩用的是nssdb证书库),cURL就能直接调用这个证书库,自动选用里面的证书,根本不用额外加参数配置。当时跑curl -vv ...查调试日志的话,能看到类似Initializing NSS with certpath: ...和NSS: using client certificate: ...的内容,明明白白告诉你它在靠NSS机制干活。
升级到RHEL8后的问题
结果升级到RHEL8之后,这套方法直接不管用了。同样跑curl -vv ...,日志里连半个NSS的影子都找不到。我们查了半天资料,才发现cURL在2023年8月就已经正式移除了对NSS的支持,相关的开发讨论和代码提交都能证实这一点。
现在该怎么用客户端证书?
既然NSS这条路走不通了,我们可以换这几种方式解决:
直接在命令行指定证书文件
这是最直接粗暴的方式,把客户端证书(一般是PEM格式)和对应的私钥文件单独拿出来,在curl命令里用参数明确指定:curl --cert /path/to/client-cert.pem --key /path/to/client-key.pem https://your-target-url.com如果你的证书和私钥合并在同一个PEM文件里,也可以只用
--cert参数,顺便带上证书密码(如果有的话):curl --cert /path/to/combined-cert-key.pem:your-cert-password https://your-target-url.com改用OpenSSL证书库
RHEL8上的cURL默认用OpenSSL作为加密后端,所以我们可以把证书导入到OpenSSL的证书体系里:- 把客户端证书复制到系统信任的证书目录(比如
/etc/pki/tls/certs/),然后用c_rehash命令生成哈希链接,方便OpenSSL查找:sudo cp /path/to/client-cert.pem /etc/pki/tls/certs/ sudo c_rehash /etc/pki/tls/certs/ - 之后curl就能自动识别到证书,你也可以通过环境变量指定自定义的证书目录,不用改动系统配置:
export SSL_CERT_DIR=/path/to/your/custom/cert-folder curl https://your-target-url.com
- 把客户端证书复制到系统信任的证书目录(比如
配置curl的默认配置文件
如果不想每次都敲一堆参数,可以把证书配置写到curl的配置文件里,一劳永逸:- 用户级配置:编辑
~/.curlrc文件 - 系统级配置:编辑
/etc/curlrc文件(需要sudo权限)
在配置文件里添加以下内容:
cert = /path/to/client-cert.pem key = /path/to/client-key.pem这样之后每次运行curl,都会自动加载这些证书配置,不用再手动指定参数。
- 用户级配置:编辑
备注:内容来源于stack exchange,提问作者klog

