我有一个在 AWS EC2 实例上运行的 Web 服务器。为了在我的自定义域(准确地说是子域)上支持 https,我使用 Amazon 证书管理器创建了一个 TLS 证书。我知道该证书仅在我使用其他 AWS 服务(例如负载平衡服务)时才会使用,因此我正在设置一个负载平衡器。
但我肯定做错了什么。我在端口 443 上设置了一个侦听器,该侦听器路由到端口 8080 上的目标组(我的服务器在端口 8080 上运行,因此我认为这两个端口需要匹配)。
我尝试访问我的网站上的 404 处理程序。假设我的自定义域名是 foo,证书是为 sub.foo.com 颁发的,那么我尝试访问 sub.foo.com/bar 以获取 404 响应。
当我通过 http 执行此操作时,它工作正常:
$ curl http://sub.foo.com:8080/bar -v
* Trying (...)...
* TCP_NODELAY set
* Connected to sub.foo.com (...) port 8080 (#0)
> GET /bar HTTP/1.1
> Host: sub.foo.com:8080
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 404 Not Found
< Content-Type: text/html; charset=utf-8
< Content-Length: 13
< Server: http-kit
< Date: Fri, 03 Jan 2020 17:03:36 GMT
<
* Connection #0 to host sub.foo.com left intact
No such page.%
但是当我通过 https 尝试时,它失败了:
$ curl https://sub.foo.com/bar -v
* Trying (...)...
* TCP_NODELAY set
* Connection failed
* connect to (...) port 443 failed: Connection refused
* Failed to connect to sub.foo.com port 443: Connection refused
* Closing connection 0
curl: (7) Failed to connect to sub.foo.com port 443: Connection refused
有趣的是,如果我尝试通过 SSL 直接访问端口 8080,就会发生一些不同的事情:
$ curl https://sub.foo.com:8080/bar -v
* Trying (...)...
* TCP_NODELAY set
* Connected to sub.foo.com (...) port 8080 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* Cipher selection: (...)
* successfully set certificate verify locations:
* CAfile: /etc/ssl/cert.pem
CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to sub.foo.com:8080
* stopped the pause stream!
* Closing connection 0
curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to sub.foo.com:8080
再说一次,这可能只是因为端口 8080 配置为通过 http 而不是 https 工作。
正如你所看到的,这里面涉及了相当多的猜测。我一直在关注关于如何创建 https 侦听器的 AWS 指南,但似乎缺少了一些东西。一旦我设置了负载平衡器,证书就会被标记为“正在使用”,所以这是有一些效果,但还不够。
我究竟做错了什么?
答案1
您的问题是sub.foo.com
指向您的 EC2 实例,而不是您的负载均衡器。
当您 curl 时http://sub.foo.com:8080
,您将访问 EC2 实例上的端口 8080。相反,您想要的是访问https://sub.foo.com
负载均衡器上的端口(隐含端口 443)。
因此,您需要更改 DNS 以将sub.foo.com
其作为 CNAME 指向您的负载均衡器。
进行此更改后,您需要等待 DNS 更改超过其之前的生存时间。在等待期间,您可以进行临时hosts
文件更改来测试它。