【问题标题】:SSL Termination on NGINXNGINX 上的 SSL 终止
【发布时间】:2019-08-21 02:55:59
【问题描述】:

所以我购买了一个 SSL 证书并将其正确捆绑在一起,以至于当我验证模数(即https://kb.wisc.edu/middleware/4064)时,哈希值是相同的。

我已将证书和密钥移动到我的服务器@/etc/ssl,并确保文件夹权限为700,每个文件为600。

然后我有以下 nginx 配置:

server {
    listen   80;
    listen   443 ;
    server_name escapehatch.chrisjowen.uk;
    ssl    on;
    ssl_certificate    /etc/ssl/ssl-bundle.crt;
    ssl_certificate_key /etc/ssl/secret.txt;
    access_log /var/log/nginx/nginx.vhost.access.log;
    error_log /var/log/nginx/nginx.vhost.error.log;

    location / {
        proxy_pass http://localhost:8080;
    }
}

最后为了测试这个,我在端口 8080 上运行了一个 Python SimpleHTTPServer。当我点击 HTTPS 上的 url 时,我收到一个错误

This site can’t provide a secure connection

查看我看到的 Python 服务器的日志:

218.186.183.142 - - [21/Aug/2019 04:45:53] code 400, message Bad HTTP/0.9 request type ('\x16\x03\x01\x02\x00\x01\x00\x01\xfc\x03\x03\x01a\x96\x061LE\x88I\xf1i\x7f\xc3\xdc%d\x18r\xbbzq9q<\xeb\x1dD\xa3\x8b\x01\x10\x7f') 218.186.183.142 - - [21/Aug/2019 04:45:53] "�a�1LE�I�i��%dr�zq9q<�D�� n��Z���΀��SN�F���j;X.Zw�s^�"**�+�/�,�0̨̩����/5" 400 - 218.186.183.142 - - [21/Aug/2019 04:45:53] code 400, message Bad request version ('\x0fb\x03g\x8d\x04\x8b\xbe!\xad\x98W\x9bV\xd2\x8e\x1e\xc6\xf3\xaa\xff\xce\x0f\x1b\xc9\x0f\xebY\xae\xc4\x00"\xfa\xfa\x13\x01\x13\x02\x13\x03\xc0+\xc0/\xc0,\xc00\xcc\xa9\xcc\xa8\xc0\x13\xc0\x14\x00\x9c\x00\x9d\x00/\x005\x00')

所以似乎 nginx 没有解密请求并终止 SSL 连接,而是将其传递给上游服务器,这是我不想要的。

检查 nginx 日志 /var/log/nginx/nginx.vhost.access.log 什么也没显示。

所以现在我很困惑如何调试问题,似乎 nginx 配置错误或证书有问题,但如前所述,我使用以下方法检查了这一点 https://kb.wisc.edu/middleware/4064

克里斯,感谢您的帮助。

【问题讨论】:

    标签: ssl nginx


    【解决方案1】:
    listen   80;
    listen   443 ;
    

    如果您希望它在端口 80 上侦听纯 http 并在端口 443 上侦听 https,则第二行应为 listen 443 ssl;

    ssl    on;
    

    来自the documentation

    此指令在版本 1.15.0 中已过时。应该改用listen指令的ssl参数。

    您的 Python 服务器的日志中还包含以下内容:

    218.186.183.142 - - [21/Aug/2019 04:45:53] code 400, ....
    

    这个 Python 服务器显然是由外部 IP 地址直接访问的。如果请求将由本地 nginx 转发,则源 IP 应改为 127.0.0.1。这表明,您根本没有点击 nginx,而是以某种方式直接向 Python 服务器发出请求。

    【讨论】:

    • 谢谢,但此更改后此问题仍然存在。还有其他想法吗?
    • @Owen:您确定您实际上是在将客户端连接到 nginx 而不是直接连接到 python 服务器?您只说“当我在 HTTPS 上点击 url 时”,而不是您实际使用的 URL。你不应该使用https://localhost:8080,但你应该使用https://your.domain(没有端口,所以使用默认的443)。
    • 是的,我当然不是要访问本地主机,而是按照配置 escapehatch.chrisjowen.uk 访问 url
    • @Owen:我在这个 URL 上收到“连接被拒绝”,即即使 TCP 连接失败,这意味着它甚至不会命中你的 nginx。
    • @Owen:您在 nginx 日志文件中看不到任何内容的信息向我表明,您没有点击 nginx - 或者至少不是您正在查看的配置部分日志。此外,您的 Python 服务器的日志文件显示该请求不是来自 127.0.0.1,因为如果它是由 nginx 转发的,这是预期的。相反,它来自某个外部 IP 地址,因为它仅在请求未由本地反向代理转发时才会发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 2018-08-13
    • 2018-11-15
    • 2016-06-04
    • 1970-01-01
    • 2016-11-18
    • 2017-01-22
    相关资源
    最近更新 更多