十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

curl 公钥钉扎实战指南:一行指纹,挡住中间人攻击和证书冒用

curl 公钥钉扎实战指南:一行指纹,挡住中间人攻击和证书冒用 curl 公钥钉扎实战指南一行指纹挡住中间人攻击和证书冒用【免费下载链接】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你未必被攻击过但风险就藏在 HTTPS 里当中间人塞给服务器一张伪造或窃取的证书时传统校验照样验得过——证书是合法的可持证人根本不是你要访问的那个站点。公钥钉扎就是为这一刻准备的curl 会把服务器证书里的公钥与你的预置指纹比对不符立刻断开。证书钉扎到底钉的是什么一把只认钥匙孔的锁把 TLS 握手想象成快递员上门取件。默认情况下你只查快递员的工牌证书只要工牌是发证机构签发的你就开门。可如果工牌能买到呢公钥固定换了个思路你不查工牌你只认钥匙孔。每个网站的服务器证书里都装着一把公钥它像指纹一样稳定且独一无二。你提前把钥匙孔的形状公钥指纹记下来以后无论对方递来多漂亮的工牌先用公钥试一下锁——拧不动直接拒之门外。这就是证书钉扎的精髓钉的不是证书本身而是证书背后的那把公钥。证书可以换、可以过期、可以被 CA 误签公钥指纹却在你授权之前不会变。源码里的一行关键判断SHA256 指纹怎么提取和比对这套判断的核心是 lib/vtls/vtls.h 中声明的Curl_pin_peer_pubkey实现在 lib/vtls/vtls.c。它的逻辑可以浓缩成三步没配置就不拦没传钉扎值时直接放行保证老用户零感知。算指纹服务器握手时交出公钥curl 对它做 SHA256 摘要再把 32 字节摘要 base64 编码——这就是钥匙孔的形状。逐个比对你预置的值可以是分号分隔的多个sha256//指纹curl 依次memcmp比较命中任意一个就CURLE_OK放行全部落空则返回CURLE_SSL_PINNEDPUBKEYNOTMATCH连接在收发任何数据之前就中止。注意第三步预置多个指纹是源码级支持的能力这正是后面轮换不中断的地基。一行命令完成钉扎命令行与 libcurl 两种落地姿势命令行--pinnedpubkey接受两种输入——一个 PEM/DER 公钥文件或一串sha256//前缀的 base64 哈希分号分隔curl --pinnedpubkey sha256//base64指纹1;sha256//base64指纹2 https://example.com一行搞定指纹不匹配时 curl 直接报错退出一个字节的数据都不会发出去。详见 docs/cmdline-opts/pinnedpubkey.md。libcurl对应选项是CURLOPT_PINNEDPUBLICKEY在perform之前塞进去即可curl_easy_setopt(curl, CURLOPT_URL, https://example.com); curl_easy_setopt(curl, CURLOPT_PINNEDPUBLICKEY, sha256//your-fingerprint); CURLcode res curl_easy_perform(curl);两行选项 一行执行钉扎就生效了。API 细节见 docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.md。再加一道保险CT 日志与证书状态验证公钥指纹防住了换公钥但防不住这张证书本身已被吊销。这里可以叠两层验证现成的 OCSP stapling--cert-status让 curl 要求服务器在握手中捎带证书状态证明状态缺失、过期或显示已吊销验证直接失败。目前 OpenSSL 和 GnuTLS 后端支持参见 docs/cmdline-opts/cert-status.md。证书透明度CT验证CT 的思路是所有合法证书都必须被公开日志记录。curl 自身没有一键式 CT 开关落点在 lib/vtls 的各 TLS 后端openssl.c、gtls.c 等如果你的后端支持 SCT 扩展解析就可以在这一层把证书是否在日志中有据可查纳入握手指纹校验与钉扎形成指纹 公开记录双保险。上生产前的加固 Checklist加固项具体动作为什么指纹冗余每个域名预置 2 个以上sha256//指纹当前 备份分号连接换钥不中断比对循环天然支持多指纹公钥轮换建立轮换计划先生成新密钥、把新指纹下发给所有客户端再切换线上密钥顺序反了就会大面积断连失败即拒绝捕获CURLE_SSL_PINNEDPUBKEYNOTMATCH并给出明确提示绝不回退到跳过校验钉扎失败时降级校验等于没钉监控报警对钉扎失败率、握手错误码埋点超过阈值告警指纹错配、密钥误轮换都是分钟级事故减少重复计算指纹比对结果尤其公钥文件解析做内存缓存同一连接复用避免每次握手重复读文件、算哈希不阻塞主流程对文件读取类校验可放工作线程异步完成拿到结果再决定放行握手阶段别卡 IO快速失败为状态请求与重试设短超时如--max-time失败立刻终止拖得越久可疑连接暴露面越大收个尾证书会过期、CA 会失误、网络会被人劫持——而你把公钥指纹提前钉在客户端的那一刻中间人就没有退路了。上线之前把上面的清单过一遍上线之后把定期轮换指纹写进日历今天的指纹不该是三年后还在用的那把钥匙。图示curl 证书钉扎验证流程——服务器交出证书 → 提取公钥 → SHA256 指纹化 → 与预置值逐一比对 → 命中放行 / 落空拒连【免费下载链接】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),仅供参考
返回列表