但是有一个关键的话题没有提到,就是Curl请求HTTPS网站时,需要使用本地CA根证书证书来验证网站的身份。根证书由谁提供?证书在哪里?有同学说,这不是废话吗?绝对由OpenSSL或NSS提供。事实上,不同的平台、不同的密码学库、不同的应用软件使用不同的CA根证书。顺藤摸瓜找ca-certificates在Ubuntu下,安装Curl包时,会额外安装一个包ca-certificates。这个包与证书有关。其实这个包是OpenSSL安装的,如下:$apt-cachedependsopensslopenssldependson:libc6dependson:libssl1.0.0Suggestion:ca-certificatesconflict:openssl:i386因为curl是通过OpenSSL实现客户端HTTPS协议的,所以也就是说,在Curl/OpenSSL平台下,Curl使用的根证书库是由ca-certificates包处理的。在介绍ca-certificates包之前,先了解下Ubuntu/Curl(包括openssls_client工具)在发送HTTPS请求时引用的根证书地址,如下图:根证书库CAfile:/etc/ssl/certs/ca-certificates.crt,我们记住这个文件,它是由ca-certificates包更新的。调查ca-certificates运行以下命令以了解ca-certificates包的详细信息:$apt-cacheshowca-certificates该包包含CA证书的PEM文件,以允许基于SSL的应用程序检查SSL连接的身份验证。其中包括Debian基础设施使用的证书颁发机构和Mozilla浏览器附带的证书颁发机构。也就是说,这包含了PEM格式的CA根证书。这些证书可供基于SSL协议的参考程序使用。所有CA根证书实际上都是由Mozilla维护的。接下来运行以下命令了解ca-certificates中包含的文件:$dpkg-Lca-certificates主要包含两类文件:1:/usr/share/ca-certificates/mozilla/包含很多具体的CA根证书文件,每个CA组织的根证书对应一个文件。2:/usr/sbin/update-ca-certificates这是一个命令行工具,它的作用是什么?运行以下命令以获取官方说明:$manupdate-ca-certificatesupdate-ca-certificates-update/etc/ssl/certsandcertificates.crt直接运行此工具,它最终将更新/etc/ssl/certs/ca-certificates.crt文件。现在你应该明白了,有了这个文件,Curl和openssl都可以在发送HTTPS请求时验证HTTPS网站的真实身份。具体执行步骤如下:读取/etc/ca-certificates.conf文件,其中包含/usr/share/ca-certificates/mozilla/目录下的所有证书文件名。将/etc/ca-certificates.conf文件对应的所有证书合并到/etc/ssl/certs/ca-certificates.crt文件中。如何及时更新CA根证书ca-certificates包使用的CA根证书来自Mozilla,但对于一个发行版来说,升级更新包的频率并不高。考虑一种情况,Mozilla引入了新的CA,或者不信任某个CA,也就是说,对于Mozilla来说,它的CA根证书列表已经更新了。其他使用MozillaCA根证书的应用程序(包括ca-certificates)可能没有及时更新。有没有办法及时更新本地CA根证书?您可以使用由Curl项目发布的mk-ca-bundle.pl工具。Mozilla将所有受信任的CA根证书存储在https://hg.mozilla.org/projects/nss/raw-file/default/lib/ckfw/builtins/certdata.txt文件中(很少有应用直接使用NSScert9.db文件).而mk-ca-bundle.pl所做的是将certdata.txt转换为PEM格式,然后可以被Curl(或其他应用程序)使用。$wgethttps://raw.githubusercontent.com/curl/curl/master/lib/mk-ca-bundle.pl$chmod0777mk-ca-bundle.pl$./mk-ca-bundle.pl$cpca-bundle。crt/etc/ssl/certs/ca-certificates.crt-fr运行结束后,/etc/ssl/certs/ca-certificates.crt被更新,Curl可以使用最新的根CA证书。细心的同学可能会发现mk-ca-bundle.pl工具不会自动更新/usr/share/ca-certificates/mozilla/目录下的证书,自然update-ca-certificates工具也无法更新。以后打算写一个工具来解决这个问题:基于mk-ca-bundle.pl,将证书同步到/usr/share/ca-certificates/mozilla/目录下。然后使用update-ca-certificates更新***的证书。
