我使用certbot为我的网站生成了Let's加密证书,但当我尝试连接到它时(当然超时后),Yaws会给我一个SSL accept failed: timeout
错误。有趣的是,当我将example.com
重定向到机器上主机文件中服务器的本地ip地址并连接到example.com:8080
时,它会起作用,但当我在不编辑主机文件的情况下连接到example.com
时,或者当我通过4G从手机连接时,它不会起作用。这是我的Web服务器的配置文件(它是conf.d
中唯一的配置文件):
<server www.example.com>
port = 8080
listen = 0.0.0.0
docroot = /usr/share/yaws
<ssl>
keyfile = /etc/letsencrypt/live/example.com/privkey.pem
certfile = /etc/letsencrypt/live/example.com/fullchain.pem
</ssl>
</server>
我确保yaws用户可以读取密钥文件和证书。密钥文件旁边是一个README
,它包含以下内容:
`privkey.pem` : the private key for your certificate.
`fullchain.pem`: the certificate file used in most server software.
`chain.pem` : used for OCSP stapling in Nginx >=1.3.7.
`cert.pem` : will break many server configurations, and should not be used
without reading further documentation (see link below).
We recommend not moving these files. For more information, see the Certbot
User Guide at https://certbot.eff.org/docs/using.html#where-are-my-certificates.
因此,我相对确信我使用了正确的文件(其他文件给了我错误,如badmatch
和{tls_alert,"decrypt error"}
)。我也尝试过一些琐碎的事情,比如在URL之前写https://
,但它并没有解决这个问题,而且,当服务器在没有SSL的情况下运行时,一切都很好。在我的服务器上运行的Erlang版本是Erlang/OTP 19。此外,如果不清楚,则该域实际上不是example.com
。
此外,如果重要的话,example.com
通过cname重定向到examplecom.duckdns.org
。
更新:
当默认的https端口为端口443
时,我的服务器正在从外部端口80
转发的端口8080
上侦听https连接。我的另一个错误是连接到http://example.com
而不是https://example.com
。将外部端口443
转发到内部端口8443
并配置yaws以在端口8443
上侦听固定了一切。
只是为了确保理解,当您执行类似curl -v https://example.com:8080
的操作时,会出现超时,仅此而已?(这里https
协议和端口8080
当然是强制性的)
当在SSL vhost上接收到未加密的请求时,可以触发接受期间的SSL超时。
您还可以提供以下命令的输出吗:
echo -e "HEAD / HTTP/1.0rnrn" | openssl s_client -connect mysite.com:8080 -ign_eof
最后,你在运行哪个版本的Yaws?在哪个操作系统上?