You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Cypress查看网页证书并验证Issued by信息?

如何用Cypress断言网页证书的签发方(Issued by)?

嘿,这个问题我之前也研究过,Cypress本身确实没有直接暴露浏览器证书信息的API(毕竟涉及浏览器的安全限制嘛),不过有两个靠谱的办法可以实现你的需求,我给你详细说说:

方法一:用命令行工具+cy.exec()提取证书信息

这是最直接的方案,利用系统的openssl命令行工具来获取并解析证书,然后在Cypress里断言结果。

步骤和代码示例:

  1. 确保你的测试环境已经安装了openssl(大部分Linux/macOS系统默认自带,Windows可以安装Git Bash或者单独安装openssl)
  2. 编写测试用例,调用cy.exec()执行证书提取命令:
it('验证网页证书的签发方是否符合要求', () => {
  // 替换成你的目标域名和预期签发方
  const targetDomain = "your-target-domain.com";
  const expectedIssuer = "Your-Expected-Issuer-Name";

  // 执行openssl命令获取签发方信息
  cy.exec(`openssl s_client -connect ${targetDomain}:443 </dev/null 2>/dev/null | openssl x509 -noout -issuer`)
    .its('stdout') // 提取命令的标准输出
    .should('include', expectedIssuer); // 断言输出包含预期的签发方
});

命令解释:

  • openssl s_client -connect ${targetDomain}:443:建立到目标域名443端口的SSL连接,获取证书原始数据
  • </dev/null:让命令自动结束(避免卡在交互状态)
  • 2>/dev/null:忽略错误输出(避免一些无关的警告干扰结果)
  • openssl x509 -noout -issuer:从证书数据中提取签发方信息,不输出证书的其他内容

方法二:用Cypress Task + Node.js的https模块解析证书

如果你的测试环境不想依赖openssl,或者需要更灵活地解析证书字段,可以用Cypress的Task功能调用Node.js的https模块来获取证书。

步骤和代码示例:

  1. 在cypress.config.js(或对应版本的配置文件)中注册一个自定义Task:
const https = require('https');
const { defineConfig } = require("cypress");

module.exports = defineConfig({
  e2e: {
    setupNodeEvents(on, config) {
      // 注册获取证书签发方的Task
      on('task', {
        getCertificateIssuer(domain) {
          return new Promise((resolve, reject) => {
            // 发起HTTPS请求获取证书
            const req = https.get(`https://${domain}`, (res) => {
              // 获取连接的对等证书
              const cert = res.connection.getPeerCertificate();
              // 提取签发方的组织名称(O字段),你可以根据需求换成CN等其他字段
              resolve(cert.issuer.O);
              res.destroy(); // 关闭连接
            });

            // 处理请求错误
            req.on('error', (err) => reject(err.message));
          });
        }
      });
    },
  },
});
  1. 在测试用例中调用这个Task并断言:
it('通过Cypress Task验证证书签发方', () => {
  const targetDomain = "your-target-domain.com";
  const expectedIssuerOrg = "Your-Expected-Issuer-Organization";

  cy.task('getCertificateIssuer', targetDomain)
    .should('eq', expectedIssuerOrg); // 断言签发方组织名称完全匹配
});

注意事项:

  • cert.issuer包含多个字段,比如CN(通用名称)、O(组织)、C(国家)等,你可以根据需要调整提取的字段
  • 如果是自签名证书或者无效证书,Node.js可能会抛出错误,你可以在Task里添加错误处理逻辑

小提示

  • 如果你需要精确匹配而不是包含匹配,可以把should('include', ...)换成should('eq', ...),不过要注意openssl输出的格式(比如会有issuer=CN=XXX,O=XXX这样的前缀)
  • 在CI环境中,确保openssl已安装(或者用方法二避免依赖)

内容的提问来源于stack exchange,提问作者Sarmad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 08:12:54