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

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

【问题讨论】:

    标签: node.js google-chrome-devtools chromium puppeteer


    【解决方案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);
            }
        })();

        【讨论】:

          猜你喜欢
          • 2010-11-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-16
          相关资源
          最近更新 更多