让我们用vert.x加密

时间:2019-01-22 09:57:26

标签: kotlin vert.x

我从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日志记录设置为调试,但是没有错误消息出现。

我想念什么?

2 个答案:

答案 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         这是证书的序列(链)。发件人的         证书必须在列表中排在第一位。每个以下         证书必须直接对之前的证书进行认证。因为         证书验证要求分发根密钥         独立地,指定根的自签名证书         证书授权机构可以从         假设远端必须已经拥有它以便         无论如何都要对其进行验证。