如何使用 chrome puppeteer 访问 ssl 证书内容

Posted

技术标签:

【中文标题】如何使用 chrome puppeteer 访问 ssl 证书内容【英文标题】:How to access ssl certificate content using chrome puppeteer 【发布时间】:2018-02-16 22:11:03 【问题描述】:

我想使用 chrome puppeteer 访问 url 的证书详细信息。是否可以使用当前的 puppeteer API 来做到这一点?

【问题讨论】:

【参考方案1】:

正如 Grant Miller 所说,您可以使用 Chrome DevTools 协议Network.getCertificate 方法访问完整的 DER 编码证书,而不仅仅是 puppeteer 响应提供的 securityDetails。

page.on('response', async (res) => 
  if (res.securityDetails() != null) 
    console.info(await page._client.send('Network.getCertificate', origin: res.url()));
    /*
       tableNames: [ 'MIIDwTCCAqmgAwIBAgIJALzkRqUOhsraM...' ] 
      Network.getCertificate - Returns the DER-encoded certificate
    */
  

然后您可以使用任何节点包从编码的证书链中解析每个证书。

【讨论】:

page._client 属性在技术上是私有的,但从 puppeteer 8.0.0 开始,上述解决方案是唯一对我有用的解决方案。如果我这样做:const cdp = page.target().createCDPSession(); const info = await cdp.send('Network.getCertificate');,那么我总是会得到一个空的[]。有没有不需要访问私有_client的解决方案?【参考方案2】:

您可以使用 Chrome DevTools 协议Network.getCertificate 方法访问 DER 编码的证书:

const certificate = await page._client.send('Network.getCertificate', 
  origin: 'https://example.com/',
);

for (let i = 0; i < certificate.tableNames.length; i++) 
  console.log(certificate.tableNames[i]);

【讨论】:

【参考方案3】:

如果需要以下方法,可以直接在page.goto上使用response.securityDetails()

securityDetails.issuer() securityDetails.protocol() securityDetails.subjectAlternativeNames() securityDetails.subjectName() securityDetails.validFrom() securityDetails.validTo()

例如validTo():

const response = await page.goto(url)
const securityDetails = response.securityDetails()
const expiryDate = securityDetails.validTo() * 1000
console.log(new Date(expiryDate))

输出:

Sunday, December 20, 2020

【讨论】:

【参考方案4】:

使用以下代码获取证书列表。结果无法直接读取。将每个条目存储在一个带有 pem 扩展名的文件中,在行首 -----BEGIN CERTIFICATE----- 在行尾 -----END CERTIFICATE-----

链接 - https://gist.github.com/be9/23101bcd95c289dcb7b0c3ae0eb49525

  const puppeteer = require('puppeteer');

  process.on('unhandledRejection', (reason, p) => 
      console.error('Unhandled Rejection at: Promise ', p, ' reason: ', reason);
      process.exit(3);
  );

(async () => 
    let browser;
    let exitCode = 0;

    try 
        browser = await puppeteer.launch(
            headless: false,
            devtools: true
        );
        const page = await browser.newPage();

        const client = await page.target().createCDPSession();
        await client.send('Network.enable');

        page.on('response', async (res) => 
            if (res.securityDetails() != null) 
                console.info(await page._client.send('Network.getCertificate', 
                    origin: res.url()
                ));
            
        );

        await page.goto('https://www.chase.com/', 
            waitUntil: 'networkidle2',
            timeout: 3000000
        );
     catch (e) 
        console.error('Got exception', e);
        exitCode = 1;
     finally 
        if (browser != null) 
            await browser.close();
        
        process.exit(exitCode);
    
)();

【讨论】:

以上是关于如何使用 chrome puppeteer 访问 ssl 证书内容的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Puppeteer拍摄包含视频的页面的屏幕截图

Chrome Headless puppeteer CPU 过多

puppeteer截图

使用Puppeteer检测并测试Chrome扩展程序

javascript 使用chrome和puppeteer拦截响应

Puppeteer 无法打开 chrome(出现错误)