6

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

4

4 回答 4

3

正如 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
    */
  }
}

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

于 2018-09-26T08:16:49.397 回答
1

您可以使用 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]);
}
于 2018-07-23T06:32:24.603 回答
1

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

  • 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
于 2020-12-12T15:23:25.193 回答
0

使用以下代码获取证书列表。结果无法直接读取。将每个条目存储在具有 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);
    }
})();

于 2021-10-05T07:03:15.373 回答