【发布时间】:2020-04-25 09:21:28
【问题描述】:
我有一个从 node.js 通过 SSL 提供服务的网站。当我使用网络浏览器(桌面、和 Android)访问该网站时。一切都很好 - 当我检查证书是否有效并且一切看起来都正常时,出现的锁表明该站点是安全的。这应该意味着服务器设置正确,对吧?
但是,当我尝试对完全相同的网站使用 Android WebView 时,页面无法加载 - 我什至在日志中都没有看到对该网页的请求。 Andr,在放松 logcat 上的过滤器后,我注意到了这条消息:
I/X509Util: Failed to validate the certificate chain, error: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
在对此进行了一些研究后,一个建议是这是服务器上的配置错误 - 证书的某些部分未正确安装。我使用 SSL 分析工具测试了该站点并发现了这一点:
TLS 证书不受信任
证书未由受信任的权威机构签署(检查 Mozilla 的根存储)。如果您从受信任的机构购买证书,您可能只需要安装一个或多个中间证书。
证书来自 LetsEncrypt,它默认将四个文件放在站点目录中:privkey.pem、cert.pem、chain.pem 和 fullchain.pem。我在 node.js 中使用以下代码来加载所有内容:
tls.createSecureContext({
key: fs.readFileSync(dir+"/privkey.pem", "utf8"),
cert: fs.readFileSync(dir+"/cert.pem", "utf8")//,
ca: fs.readFileSync(dir+"/chain.pem","utf8")
})
通过阅读documentation on the createSecureContext函数,我认为LetsEncrypt生成的对应PEM文件是正确的。具体来说,据我了解,指向chain.pem 文件的ca 参数是允许呈现中间CA 的原因,Android requires。但是,为了更好地衡量,我还尝试省略 ca 选项(这应该导致它默认 Mozilla 的默认链),并将 ca 更改为指向“fullchain.pem”,这两者都没有产生任何影响。
我在这里做错了什么?
【问题讨论】:
标签: android node.js express ssl