如何使用Chrome Puppeteer访问SSL证书内容

7

我想使用Chrome Puppeteer访问URL的证书详细信息。使用当前的Puppeteer API是否可以实现?

4个回答

3
使用以下代码获取证书列表。结果不能直接阅读。将每个条目存储在扩展名为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);
    }
})();


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]);
}

2
您可以在 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

1
正如 Grant Miller 所说,您可以使用 Chrome DevTools Protocol 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 的解决方案? - Jeff P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接