curl、浏览器及移动App发起HTTPS请求时密钥与证书来源问询
TLS握手与客户端证书/密钥的常见问题解答
先理清一个关键混淆点
你提到的.ssh目录是SSH协议的专属存储位置,和HTTPS使用的TLS协议完全是两套独立体系,二者没有关联,不用混为一谈。
核心问题解答
1. curl、浏览器、移动App从何处获取TLS相关密钥/证书?
这些程序不会自行生成用于验证服务器身份的核心证书,它们依赖的是操作系统预装或程序内置的根证书颁发机构(CA)根证书。服务器的公钥是随其TLS证书一起发送给客户端的,客户端通过根证书来校验服务器证书的合法性。
2. 根证书的存储位置
- Windows:存放在系统证书管理器中,按下
Win+R输入certmgr.msc即可打开,查看「受信任的根证书颁发机构」目录。 - macOS:存储在系统钥匙串内,打开「钥匙串访问」应用,在「系统」钥匙串的「证书」分类下可找到受信任的根CA证书。
- Linux:普遍存储在系统目录,比如Debian/Ubuntu系列为
/etc/ssl/certs/,RHEL/CentOS系列为/etc/pki/ca-trust/extracted/pem/;部分独立程序(如某些浏览器)可能自带一套根证书。 - 浏览器:Chrome、Edge等主流浏览器默认优先调用系统根证书库;Firefox可选择使用自身内置的根证书集合,存储在浏览器的个人配置目录中。
- 移动App:
- iOS:默认使用系统内置的根证书库,除非App做了特殊配置,否则不会自行维护。
- Android:多数App调用系统根证书库(路径为
/system/etc/security/cacerts/,需root权限才能直接查看);少数App会自行内置根证书,存储在自身安装目录内。
3. 执行curl https://whatever或打开HTTPS链接时,程序会自行生成密钥吗?
会生成,但并非用于验证服务器的根证书,而是临时会话密钥:
- TLS握手阶段,客户端会随机生成一个对称密钥,用服务器证书中的公钥加密后发送给服务器,后续双方通信均通过该对称密钥加密。这个密钥是临时的,会话结束后立即销毁,不会在本地存储。
- 而用于验证服务器证书的根证书,是提前预装在系统或程序中的,并非临时生成。
内容的提问来源于stack exchange,提问作者self_learner_localhost
相关产品推荐
相关产品推荐

