如何使用Cypress查看网页证书并验证Issued by信息?
如何用Cypress断言网页证书的签发方(Issued by)?
嘿,这个问题我之前也研究过,Cypress本身确实没有直接暴露浏览器证书信息的API(毕竟涉及浏览器的安全限制嘛),不过有两个靠谱的办法可以实现你的需求,我给你详细说说:
方法一:用命令行工具+cy.exec()提取证书信息
这是最直接的方案,利用系统的openssl命令行工具来获取并解析证书,然后在Cypress里断言结果。
步骤和代码示例:
- 确保你的测试环境已经安装了
openssl(大部分Linux/macOS系统默认自带,Windows可以安装Git Bash或者单独安装openssl) - 编写测试用例,调用
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模块来获取证书。
步骤和代码示例:
- 在
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)); }); } }); }, }, });
- 在测试用例中调用这个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
相关产品推荐
相关产品推荐

