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

资讯详情

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

curl `--doh-insecure` 参数详解:跳过 DoH 服务器证书校验的前因后果与源码级剖析

curl `--doh-insecure` 参数详解:跳过 DoH 服务器证书校验的前因后果与源码级剖析 curl--doh-insecure参数详解跳过 DoH 服务器证书校验的前因后果与源码级剖析【免费下载链接】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/curlcurl 默认会对其连接的所有 DNS-over-HTTPSDoH服务器执行严格的 TLS 安全校验而--doh-insecure是 curl 专门为DoH 解析通道单独关闭证书验证提供的开关它与控制普通连接和代理连接的--insecure、--proxy-insecure相互独立、各司其职。本文以 curl 官方命令行选项文档 docs/cmdline-opts/doh-insecure.md 为主线结合仓库内参数解析、libcurl 选项映射与 DoH 底层实现源码讲清楚它的语义、使用场景、安全代价以及它与--doh-url、--doh-cert-status、--insecure的协作与区别读完你将能准确判断何时该用、何时绝不可以用。参数速览来自选项文档元数据curl 的每个命令行选项都有对应的结构化文档头--doh-insecure的定义如下元数据项值长选项名--doh-insecure对应--no-doh-insecure关闭Help 摘要Allow insecure DoH server connectionsAdded加入版本7.76.0Categorydns tlsProtocolsDNSMulti多值行为boolean可开关的布尔选项See-also关联选项doh-url、insecure、proxy-insecure从元数据可以看出它属于 DNS 与 TLS 的交界地带作用是影响基于 TLS 传输的 DoH 解析请求属于布尔开关且文档明确将它与普通--insecure、代理专用--proxy-insecure并列为同一族系。一、为什么需要单独一个DoH 版 insecure开关1.1 先理解 curl 中的 DoH 工作方式从 curl 8.x 的仓库结构可以看到DoH 相关实现被独立维护在 lib/vdns/ 目录下核心文件为 lib/vdns/doh.c。当用户在命令行上指定curl --doh-url https://doh.example/ https://www.example.comcurl 便不再走操作系统默认解析器而是向doh.example这个HTTPS 服务器发起一次加密的 DNS 查询从响应中取得www.example.com的解析结果再去连接目标网站。因为 DoH 本质上是跑在 HTTPS 之上的一次普通请求所以对 DoH 服务器的连接质量、TLS 握手和证书信任同样敏感。1.2 默认行为全面校验绝不跳过选项文档开篇就明确By default, every connection curl makes to a DoH server is verified to be secure before the transfer takes place.也就是说默认情况下 curl 在向 DoH 服务器发起解析请求之前会完整执行证书链校验与主机名校验只有当 DoH 服务器可信时才会真正发起 DoH 传输。这是 DoH 安全模型的根基既然信任依赖被从运营商递归解析器转移到了指定 HTTPS 服务器那么这段 TLS 信任就必须建立起来否则整个安全前提都不成立。1.3--doh-insecure的作用选项文档给出的一句话语义是This option tells curl to skip the verification step and proceed without checking.即跳过传输前的校验步骤不做任何检查就直接与 DoH 服务器建立连接、发送解析请求。其作用范围与另外两个兄弟选项的分工是选项关闭校验的连接对象--insecure即-k本次 curl 与目标服务器的连接--proxy-insecure本次 curl 与代理服务器的连接--doh-insecure本次 curl 与 DoH 服务器的连接三者的关系可以用一句话概括--doh-insecure等价于把--insecure、--proxy-insecure的语义套用到了 DoH 解析通道上但互不继承、只作用于各自的连接段。二、经典使用场景与实战示例2.1 最小可复现用法选项文档给出了标准示例curl --doh-insecure --doh-url https://doh.example $URL其中--doh-url https://doh.example指定用于域名解析的 DoH 服务器该参数本身要求 URL 必须是 HTTPS详见 docs/cmdline-opts/doh-url.md--doh-insecure允许 curl 跳过对该 DoH 服务器的证书校验$URL是本次真正要访问的目标地址。两者必须配合使用才有意义——如果没给--doh-url则根本没有 DoH 通道--doh-insecure也就没有作用对象。2.2 用--resolve显式指定 DoH 服务器 IP一个值得注意的细节来自 doh-url 文档在解析DoH 服务器自身的主机名时DoH 机制默认是被绕过的否则会形成鸡生蛋的循环依赖。若希望每次都直连固定的 DoH 服务器可以用--resolve把它固定下来curl --doh-url https://doh.example --resolve doh.example:443:192.0.2.1 $URL这种写法与--doh-insecure正交--resolve解决的是DoH 服务器 IP 从哪来--doh-insecure解决的是要不要验证 DoH 服务器的证书。在生产环境里即使你要用自签名证书的内部 DoH 服务器并开启--doh-insecure仍建议配合--resolve固定服务器地址缩小被劫持的面。2.3 典型但必须警惕的使用动机历史上--doh-insecure最常见的用途包括访问使用自签名证书或私有 CA 的内部 DoH 解析器如企业内网 / 测试环境排查 DoH 服务器本身的证书问题时临时绕过校验以定位解析层故障在受控沙箱或实验室中验证 DoH 报文内容。这些都属于你完全信任网络路径、只是证书体系不完整的场景。选项文档对它的警告同样直白而严厉WARNING: using this option makes the DoH transfer and name resolution insecure.这意味着任何能对 DoH 连接实施中间人攻击MITM的人都能替换返回给你的 DNS 应答从而把www.example.com指向攻击者控制的地址——解析结果一旦被污染其危害比普通连接关闭校验更大因为它连域名到 IP 的第一步都不可信了。三、--doh-insecure与 DoH 证书校验三兄弟的关系curl 对 DoH 服务器的 TLS 校验被拆成了三个独立维度均通过以--doh-前缀开头的选项单独控制这一点在设计上刻意与主传输、代理传输区分开校验维度命令行选项底层 libcurl 选项默认关闭 DoH 证书链/主机名校验--doh-insecureCURLOPT_DOH_SSL_VERIFYPEER、CURLOPT_DOH_SSL_VERIFYHOST校验开启启用 DoH OCSP 装订stapling状态校验--doh-cert-statusCURLOPT_DOH_SSL_VERIFYSTATUS关闭指定 DoH 服务器--doh-url URLCURLOPT_DOH_URL未设置走系统解析器3.1 为什么不继承主连接的证书校验设置doh-url 文档 中有一句容易被忽略、但非常关键的话Some SSL options that you set for your transfer also apply to DoH since the name lookups take place over SSL. The certificate verification settings are not inherited but are controlled separately via--doh-insecureand--doh-cert-status.翻译过来是两层意思一部分 TLS 选项会沿用到 DoH 传输上因为解析请求也是走 SSL/TLS 的例如 CA 文件、CA 路径、ClientHello 相关设置等但证书验证类设置不会被继承必须显式用--doh-insecure/--doh-cert-status单独声明。这一点在源码里能得到直接印证。lib/vdns/doh.c 在为内部 DoH 句柄装配 SSL 参数时特意注释说明它会从用户传输上继承部分 SSL 选项作为兼容性的最佳猜测best-guess具体只继承了cafile、capath、cablob等证书信任源而校验开关则完全由doh_verifypeer/doh_verifyhost/doh_verifystatus三个独立标志决定。因此即使你在主命令里加了-k--insecureDoH 通道也不会随之关闭校验反过来只写--doh-insecure也不会影响目标连接与代理连接的校验策略。三者必须按需分别配置。3.2 与--doh-cert-status的取舍docs/cmdline-opts/doh-cert-status.md 说明--doh-cert-status等价于普通传输的--cert-status它通过 TLS 的 Certificate Status RequestOCSP stapling扩展验证 DoH 服务器证书的吊销状态。如果服务器返回无效例如过期的装订响应、响应表明证书已被吊销或根本没有响应则校验失败。显然--doh-insecure与--doh-cert-status在语义上相互对立前者跳过全部校验后者在完整校验之上再叠加吊销状态检查。不应同时开启。另外该文档还提示OCSP 装订支持目前仅在 OpenSSL 与 GnuTLS 两个 TLS 后端实现。四、源码级剖析从命令行参数到内部校验开关理解--doh-insecure最扎实的方式是顺着 curl 源码看一条完整的参数 → libcurl 选项 → 内部标志 → 实际连接链路。4.1 第一步命令行参数解析curl 的命令行选项表位于 src/tool_getparam.c其中登记了{doh-insecure, ARG_BOOL|ARG_TLS, , C_DOH_INSECURE},注意ARG_BOOL|ARG_TLS两个标志的组合ARG_BOOL表示这是可用--no-前缀取反的布尔开关ARG_TLS表示它只有在构建启用了 TLS 功能时才有意义。对应的处理分支src/tool_getparam.c非常简单——只是记录开关状态case C_DOH_INSECURE: /* --doh-insecure */ config-doh_insecure_ok toggle; break;这个布尔字段定义在工具侧配置结构 src/tool_cfgable.hBIT(doh_insecure_ok); /* set TRUE to allow insecure SSL connects */4.2 第二步映射为 libcurl 选项真正把开关翻译成 libcurl 长生命周期选项的地方是 src/config2setopts.cif(config-doh_insecure_ok) { my_setopt_long(curl, CURLOPT_DOH_SSL_VERIFYPEER, 0); my_setopt_long(curl, CURLOPT_DOH_SSL_VERIFYHOST, 0); }可以看到一个--doh-insecure实际会同时把两个 libcurl 选项置 0CURLOPT_DOH_SSL_VERIFYPEER 0不验证对端证书链CURLOPT_DOH_SSL_VERIFYHOST 0不校验证书中的主机名。这与--insecure在下方对CURLOPT_SSL_VERIFYPEER/CURLOPT_SSL_VERIFYHOST的处理方式同文件第 413–416 行如出一辙只是换成了CURLOPT_DOH_*前缀。同文件第 431–432 行还可看到--doh-cert-status对应设置CURLOPT_DOH_SSL_VERIFYSTATUS 1二者形成完整的 DoH 校验控制面。这三个 DoH 专属选项连同CURLOPT_DOH_URL都公开在头文件 include/curl/curl.h 中例如CURLOPT_DOH_URL见该文件第 2134 行CURLOPT_DOH_SSL_VERIFYPEER/CURLOPT_DOH_SSL_VERIFYHOST见第 2204 / 2207 行这意味着libcurl 的 C 语言用户无需命令行也能直接通过这三个选项精确控制 DoH 校验策略。4.3 第三步存储在 easy handle 中的独立标志位选项被接收后存入每个 easy handle 的set结构。libcurl 侧的处理位于 lib/setopt.c整段被#ifndef CURL_DISABLE_DOH包裹说明该能力可编译裁剪case CURLOPT_DOH_SSL_VERIFYPEER: s-doh_verifypeer enabled; break; case CURLOPT_DOH_SSL_VERIFYHOST: s-doh_verifyhost enabled; ok 2; /* 只能接受 0 或 2 */ break;其中CURLOPT_DOH_SSL_VERIFYHOST返回ok 2表明该选项遵循与CURLOPT_SSL_VERIFYHOST相同的取值约束——只有0和2合法。三个内部标志位声明于 lib/urldata.hBIT(doh_verifypeer); /* DoH certificate peer verification */ BIT(doh_verifyhost); /* DoH certificate hostname verification */ BIT(doh_verifystatus); /* DoH certificate status verification */4.4 第四步校验标志注入内部 DoH 传输最后一步发生在真正发起 DoH 查询的地方。lib/vdns/doh.c 在为 DoH 服务器创建内部 HTTPS 传输时依据这三个标志位向该内部句柄写入标准 SSL 校验选项if(maybe_https) { ERROR_CHECK_SETOPT(CURLOPT_SSL_VERIFYHOST, >if(!feature_ssl || config-cacert || config-capath || (config-insecure_ok (!config-doh_url || config-doh_insecure_ok))) return CURLE_OK;这段代码处理的是是否自动从环境变量如CURL_CA_BUNDLE、SSL_CERT_DIR装载 CA 包。其判断条件读起来是如果用户通过--insecure完全关闭了校验并且没有配置 DoH或者同时配置了--doh-insecure把 DoH 校验也关掉那么说明所有 TLS 校验均已停用也就无需再去寻找默认 CA 位置。换言之当启用 DoH 时--doh-insecure是与--insecure平级的全局放弃校验证据仅开启主传输的--insecure而不开--doh-insecure时DoH 通道仍需要 CA 来建立信任工具也就不会跳过 CA 装载。这一细节再次印证了设计意图DoH 校验在工具和库两层都被当作一条独立的信任线对待任何绕过都必须显式声明。六、安全边界、注意事项与最佳实践结合选项文档与源码实现使用--doh-insecure时应遵循以下边界它只作用于 DoH 服务器连接。若你既用 DoH 解析又访问 HTTPS 站点目标站点仍然走独立的CURLOPT_SSL_VERIFYPEER/HOST校验除非同时给--insecure。它不等于信任这个 DoH 服务器。跳过校验意味着任何人都能冒充该 DoH 服务器并向你投递伪造的 DNS 应答属于安全降级而非信任声明仅应在网络路径完全受控的场合使用。无法与--doh-cert-status叠加取信。两者语义冲突需要强校验时应保留默认校验并叠加--doh-cert-status注意其仅 OpenSSL / GnuTLS 后端支持。--doh-url的 URL 必须是 HTTPS。--doh-insecure跳过的是该 HTTPS 连接的证书校验而不是允许改用明文 HTTP 传输把明文或伪造主机放在--doh-url上是另一类错误配置。它不会影响 DoH 服务器自身的初始解析路径该路径默认绕过 DoH配合--resolve显式固定 DoH 服务器 IP 是更稳妥的组合。API 用户有更细粒度的替代方案libcurl 程序可分别设置CURLOPT_DOH_SSL_VERIFYPEER与CURLOPT_DOH_SSL_VERIFYHOST例如只关主机名校验而保留证书链校验比命令行开关一刀切更精细选项定义与语义均可在 include/curl/curl.h 中查到。七、延伸阅读本文主体文档docs/cmdline-opts/doh-insecure.mdDoH 服务器指定与证书校验不继承说明docs/cmdline-opts/doh-url.mdDoH OCSP 装订校验选项docs/cmdline-opts/doh-cert-status.md普通连接版本-k / --insecuredocs/cmdline-opts/insecure.md代理连接版本--proxy-insecuredocs/cmdline-opts/proxy-insecure.md选项解析表与开关分支src/tool_getparam.c命令行到 libcurl 选项映射src/config2setopts.clibcurl 选项接收逻辑lib/setopt.c内部标志位声明lib/urldata.hDoH 底层实现与校验注入lib/vdns/doh.c【免费下载链接】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),仅供参考
返回列表