我从Let's Encrypt获得了有效的https证书,但由于信任问题而将其授予vert.x版本3.6.2
我用apache测试了证书,没关系,但是如果我尝试使用wget到达https vert.x服务器实例,我会得到:
$ wget https://www.myhost.mydomain/json/read/all-languages
--2019-01-22 10:30:56-- https://www.myhost.mydomain/json/read/all-languages
正在解析www.myhost.mydomain(www.myhost.mydomain)... 88.14.34.156
正在连接到www.myhost.mydomain>(www.myhost.mydomain)| 88.14.34.156 |:443 ...已连接。
错误:无法验证由>“ CN = Let's Encryption Authority X3,O = Let's Encrypt,C = US”颁发的www.myhost.mydomain证书: 无法在本地验证发行人的权限。
要不安全地连接到www.myhost.mydomain,请使用`--no-check-> certificate'。
主机名和IP是伪造的。
我的工作apache配置代码段:
SSLCertificateFile /etc/certs/myhost.mydomain/cert.pem
SSLCertificateKeyFile /etc/certs/myhost.mydomain/privkey.pem
SSLCertificateChainFile /etc/certs/myhost.mydomain/chain.pem
vert.x代码:
val httpsOptions = HttpServerOptions()
.setPort(443)
.setSsl(true)
.setPemTrustOptions(PemTrustOptions()
.addCertPath("/etc/certs/myhost.mydomain/chain.pem"))
.setPemKeyCertOptions(PemKeyCertOptions()
.addKeyPath("/etc/certs/myhost.mydomain/privkey.pem")
.addCertPath("/etc/certs/myhost.mydomain/cert.pem")
)
vertx.createHttpServer(httpsOptions).requestHandler(router).listen()
我将vert.x日志记录设置为调试,但是没有错误消息出现。
我想念什么?
答案 0 :(得分:1)
我在这里找到了解决方法:https://community.letsencrypt.org/t/android-doesnt-trust-the-certificate/16498/2
我在setPemKeyCertOptions设置中将cert.pem更改为fullchain.pem,并且可以正常工作。
谢谢您的努力。
答案 1 :(得分:0)
问题出在证书链文件 chain.pem 中。似乎它不包含完整的证书链。如果您查看该文件,则其中可能仅包含一个中间LE授权证书,即我们的加密授权X3 。它可以与Apache一起使用,因为 SSLCertificateChainFile 实际上是deprecated,并且根本没有使用。
另一端的Vert.x确实使用了 chain.pem 文件。它仅返回中间证书,因此返回 wget 。要解决此问题,请创建一个由 chain.pem 和 cert.pem 文件组成的 fullchain.pem 文件,例如
cat cert.pem chain.pem > fullchain.pem
然后将 fullchain.pem 与 PemTrustOptions 配置一起使用。
您不需要将LE根证书放在 fullchain.pem 文件中,因为它已经在客户端和服务器端都存在了。这是TLS Protocol RFC的摘录。
certificate_list 这是证书的序列(链)。发件人的 证书必须在列表中排在第一位。每个以下 证书必须直接对之前的证书进行认证。因为 证书验证要求分发根密钥 独立地,指定根的自签名证书 证书授权机构可以从 假设远端必须已经拥有它以便 无论如何都要对其进行验证。