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

资讯详情

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

Puppeteer SecurityDetails.issuer() 深度解析:读取 HTTPS 响应证书的签发者信息

Puppeteer SecurityDetails.issuer() 深度解析:读取 HTTPS 响应证书的签发者信息 Puppeteer SecurityDetails.issuer() 深度解析读取 HTTPS 响应证书的签发者信息【免费下载链接】puppeteerJavaScript API for Chrome and Firefox项目地址: https://gitcode.com/GitHub_Trending/puppeteer1/puppeteerHTTP 与 HTTPS 请求的响应对象是 Puppeteer 中判断页面安全性、抓取证书指纹的核心入口。本指南聚焦SecurityDetails类的issuer()方法讲解如何从一次安全连接TLS/HTTPS的响应中读取服务端证书的**签发者Issuer**名称并结合仓库源码packages/puppeteer-core/src/common/SecurityDetails.ts与真实测试用例说明该字段在 CDP 与 WebDriver BiDi 两种协议实现下的数据来源、空值语义与实用场景。读完本篇你将能熟练编写访问 HTTPS 页面 → 提取证书签发者与其余安全细节的可运行代码并能在做证书校验、抓包分析时准确区分 issuer签发者与 subjectName持有者。方法签名与文档定位SecurityDetails.issuer()属于 Puppeteer API 中SecurityDetails类见 docs/api/puppeteer.securitydetails.md的方法其 API 参考文档位于 docs/api/puppeteer.securitydetails.issuer.md。官方对该方法的定义非常简洁The name of the issuer of the certificate.证书签发者的名称对应的类型签名如下class SecurityDetails { issuer(): string; }返回值string—— 签发该服务器证书的 CA证书颁发机构的名称。例如由 Lets Encrypt 签发的证书此字段通常返回R3或WE1等中间 CA 的通用名Common Name。从响应到 SecurityDetails字段的数据来源在进入issuer()之前先弄清SecurityDetails对象从哪里来、何时存在。1. 获取入口HTTPResponse.securityDetails()SecurityDetails并不是独立构造出来的而是通过 HTTPResponse.securityDetails() 方法随响应一并获得。该抽象方法的定义位于 packages/puppeteer-core/src/api/HTTPResponse.ts/** * {link SecurityDetails} if the response was received over the * secure connection, or null otherwise. */ abstract securityDetails(): SecurityDetails | null;关键语义若响应是通过**安全连接HTTPS/TLS**接收的则返回一个SecurityDetails实例否则如纯 HTTP 响应返回null。因此使用issuer()前必须先判空并可以先通过response.fromCache()、response.status()等其它方法确认响应的整体状态。2. 类的底层构造直接消费 CDP 的Network.SecurityDetailsSecurityDetails的源码实现位于 packages/puppeteer-core/src/common/SecurityDetails.ts它本质上是一个薄封装构造函数接收 Chrome DevTools ProtocolCDP的Network.SecurityDetails载荷把六个字段一次性拷贝到内部私有字段中constructor(securityPayload: Protocol.Network.SecurityDetails) { this.#subjectName securityPayload.subjectName; this.#issuer securityPayload.issuer; this.#validFrom securityPayload.validFrom; this.#validTo securityPayload.validTo; this.#protocol securityPayload.protocol; this.#sanList securityPayload.sanList; }而issuer()本身只是对应字段的只读访问器issuer(): string { return this.#issuer; }SecurityDetails类的构造函数被标记为internal官方在类文档中明确提醒第三方代码不应直接调用构造函数也不应创建该类的子类。你应该始终通过响应对象获取它而不是自己new SecurityDetails(...)。3. 两种协议后端如何填装该对象Puppeteer 同时支持 CDPChrome与 WebDriver BiDiFirefox/跨浏览器两种自动化协议两种实现对securityDetails的填充方式不同这一点直接影响issuer()在你目标浏览器上的可用性CDP 实现packages/puppeteer-core/src/cdp/HTTPResponse.ts——Chrome/Chromium 下构造函数里直接根据响应载荷中的securityDetails字段决定返回对象还是nullthis.#securityDetails responsePayload.securityDetails ? new SecurityDetails(responsePayload.securityDetails) : null;WebDriver BiDi 实现packages/puppeteer-core/src/bidi/HTTPResponse.ts——在 Firefox 等通过 BiDi 协议连接的浏览器中安全细节通过非标准扩展字段goog:securityDetails传递且仅当底层连接支持 CDP 兼容能力cdpSupported时才可用// ts-expect-error non-standard property. const securityDetails data[goog:securityDetails]; if (cdpSupported securityDetails) { this.#securityDetails new SecurityDetails( securityDetails as Protocol.Network.SecurityDetails, ); }进一步地在 BiDi 的 securityDetails() 访问器 中若连接不支持该扩展直接调用会抛出UnsupportedOperation。这意味着在 Firefox 上通过 WebDriver BiDi 访问issuer()依赖浏览器对goog:securityDetails的支持情况需要针对你的目标浏览器做兼容性验证。运行前提自签名证书与acceptInsecureCerts要拿到真实的 issuer 值尤其是对自己搭建的 HTTPS 测试服务通常需要让浏览器接受自签名或不受信任的证书。仓库中的测试 test/src/acceptInsecureCerts.test.ts 演示了这一点测试使用独立浏览器实例并设置acceptInsecureCerts: true随后访问本地 HTTPS 服务const state setupSeparateTestBrowserHooks({ acceptInsecureCerts: true, });也就是说acceptInsecureCerts等价于旧版 Puppeteer 的ignoreHTTPSErrors在launch()/connect()或创建浏览器上下文时传入即可。对公网正常签发证书的站点则无需该选项。实战代码读取 HTTPS 响应的证书签发者综合以上知识一段完整的可运行示例应包含判空与解析两个步骤import puppeteer from puppeteer; const browser await puppeteer.launch(); try { const page await browser.newPage(); const response await page.goto(https://example.com, { waitUntil: networkidle0, }); if (!response) { throw new Error(页面未返回任何响应); } const securityDetails response.securityDetails(); if (securityDetails null) { // 发生在非安全连接HTTP场景 console.log(该响应并非通过安全连接返回无证书信息); } else { // 核心证书签发者 console.log(证书签发者 (issuer):, securityDetails.issuer()); // 便于交叉核对证书链的相关信息 console.log(证书持有者 (subject):, securityDetails.subjectName()); console.log(安全协议:, securityDetails.protocol()); console.log( 证书有效期起始:, new Date(securityDetails.validFrom() * 1000).toISOString(), ); console.log( 证书有效期截止:, new Date(securityDetails.validTo() * 1000).toISOString(), ); console.log(主题备用名 (SANs):, securityDetails.subjectAlternativeNames()); } } finally { await browser.close(); }几点实操提示issuer()返回的是字符串类型取值形如puppeteer-tests、Lets Encrypt或 CA 的通用名securityDetails()可能返回nullHTTP 响应务必判空否则直接调用issuer()会抛TypeError若把issuer()与subjectName()对比可快速判断站点是否使用了自签名证书——自签名场景下两者通常相同你还可以监听page.on(response, ...)对页面内所有子资源逐个检查其证书签发者从而定位混合内容mixed content或证书异常的第三方请求。使用测试用例印证字段语义仓库测试 test/src/acceptInsecureCerts.test.ts 给出了该字段在真实 HTTPS 服务下的精确断言可作为你调试自建环境时的参考基线const securityDetails response!.securityDetails()!; expect(securityDetails.issuer()).toBe(puppeteer-tests); expect(securityDetails.protocol()).toBe(protocol); expect(securityDetails.subjectName()).toBe(puppeteer-tests); expect(securityDetails.validFrom()).toBe(1589357069); expect(securityDetails.validTo()).toBe(1904717069); expect(securityDetails.subjectAlternativeNames()).toEqual([ www.puppeteer-tests.test, www.puppeteer-tests-1.test, ]);从该用例可以提炼出三个要点自签名场景下issuer()与subjectName()相等均返回测试证书中的puppeteer-tests非安全请求下返回null同一文件中的第二个用例通过普通 HTTP server 访问页面并断言response.securityDetails()为null重定向响应也会携带安全细节测试覆盖了 302 重定向场景说明只要链路经过 TLS中间的重定向响应同样能通过securityDetails()拿到证书信息。关联方法总览与使用边界issuer()只是SecurityDetails的六个成员之一通常与其余方法配合用于完整的证书信息提取见下表方法返回类型含义issuer()string证书签发者名称本文主题subjectName()string证书持有者名称证书签发给谁validFrom()number证书有效期起点的 Unix 时间戳validTo()number证书有效期终点的 Unix 时间戳protocol()string使用的安全协议如TLS 1.2subjectAlternativeNames()string[]证书的主题备用名SANs列表这些方法的 API 文档分别位于 puppeteer.securitydetails.subjectname.md、puppeteer.securitydetails.validfrom.md、puppeteer.securitydetails.validto.md、puppeteer.securitydetails.protocol.md 与 puppeteer.securitydetails.subjectalternativenames.md。使用边界validFrom()/validTo()返回的是秒级 Unix 时间戳打印人类可读时间需先乘以 1000SecurityDetails本身不暴露证书的指纹、公钥等更深层信息如需校验完整证书链或做 OCSP/CRL 检查应把issuer()等字段作为输入交由 Node.js 的tls模块或专用证书库完成后续工作。小结SecurityDetails.issuer()是 Puppeteer 暴露服务端 TLS 证书签发者的最直接入口响应数据经由 CDP 的Network.SecurityDetailsFirefox 上则是 BiDi 的goog:securityDetails扩展进入 packages/puppeteer-core/src/common/SecurityDetails.ts 的封装再通过HTTPResponse.securityDetails()呈现给开发者。使用时牢记三点先对securityDetails()判空、用acceptInsecureCerts支持自签名证书环境、并留意 BiDi 协议后端的能力边界——掌握这些你就能在任何需要核验 HTTPS 连接身份的自动化场景中精准读出证书背后的签发者。【免费下载链接】puppeteerJavaScript API for Chrome and Firefox项目地址: https://gitcode.com/GitHub_Trending/puppeteer1/puppeteer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表