向Electron应用导入自签名证书解决IP接口请求证书错误问题
你遇到的问题核心是误用了app.importCertificate API,这个API的作用是导入客户端证书用于双向TLS认证,并不是用来让Electron的Chromium内核信任自签名的服务端证书,所以哪怕导入成功也不会解决net::ERR_CERT_AUTHORITY_INVALID错误。
针对你无法提前预知服务IP、需要安全校验自签名证书的场景,最优方案是在certificate-error回调中校验证书指纹而非URL地址,你所有自托管的Web服务使用的自签名证书指纹是固定的,和部署IP无关,完全可以提前预存到Electron应用中。
具体实现步骤如下:
- 提前计算你使用的自签名证书的SHA256指纹,在命令行执行以下命令即可得到:
openssl x509 -noout -fingerprint -sha256 -in 你的证书文件路径/cert.pem
执行后会得到类似SHA256 Fingerprint=AA:BB:CC:DD:EE:FF:...格式的结果,把指纹内容完整复制下来。
- 修改主进程的
certificate-error回调逻辑,不校验URL的IP/域名,只校验证书指纹是否匹配预存的合法值:
// 预存所有合法的自签名证书SHA256指纹,可同时存多个 const LEGAL_CERT_FINGERPRINTS = new Set([ 'AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99' ]) app.on("certificate-error", (event, webContents, url, error, cert, callback) => { event.preventDefault() // 只要证书指纹匹配就放行,不限制访问的IP/域名 if (LEGAL_CERT_FINGERPRINTS.has(cert.fingerprint256)) { callback(true) } else { // 非自签名的合法证书走Chromium默认校验逻辑,非法证书直接拦截 callback(false) } })
这个方案的安全性远高于全局关闭证书校验,也不需要提前预知所有服务IP:只有使用你自己签发的证书的服务请求会被放行,其余恶意自签名证书或者篡改后的证书都会被正常拦截。
如果你需要更底层的证书校验逻辑,也可以使用ses.setCertificateVerifyProc API实现自定义的证书链校验,逻辑和上面的方案一致,核心都是校验证书的指纹/公钥哈希而非访问地址。
内容的提问来源于stack exchange,提问作者gmm
相关产品推荐
相关产品推荐

