如何在不指定证书文件的情况下代理到SSL后端?

20

我有一个使用 JKS 签名的 Play 2.1.x 应用程序,它可以在 domain.com:9443 上运行并可用。由于将在同一台机器上有更多的应用程序,因此需要使用nginx进行代理(因此无法仅在端口443上运行)。我添加了 nginx 配置,希望proxy_passhttps结合起来,只需将其代理到客户端即可。

upstream backend-secure {
    server 0.0.0.0:9443;
}

server {
        listen 443 ssl;
        server_name domain.com;

        proxy_redirect          off;
        proxy_set_header        Host            $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;


        location / {
                proxy_pass  https://backend-secure;
        }

}

很遗憾尝试在浏览器中打开https://domain.com时,我只能在nginx/error.log中看到登录信息:

no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: 123.123.123.123, server: 0.0.0.0:443

有没有办法让它正常工作,或者唯一的选项是使用nginx SSL +使用http后端的通用方式?

编辑:如果这重要,它是EV、多域证书。


1个回答

4
唯一的选项是在 nginx 中嵌入证书进行代理。另一个选择是只将连接通过 ngnix 进行 TCP 转发,但这样你将无法获取任何 X-Real-IP、X-Forwarded-For 等信息。

第二个选项不可行(应用程序需要真实IP)。我会选择第一个,但是有额外问题:我的应用程序应该使用jks自签名,然后将proxy_pass设置为https,对吗? - biesior
1
有两种方法:您可以让代理与客户端进行https通信,并将其作为http转发到服务器(在受信任的网络内),或者您也可以将转发到服务器作为https。后一种情况需要更多资源,因为数据需要由代理重新加密并由服务器解密,并且它会更慢,因为SSL连接设置需要更多握手,但您可以在不受信任的网络上使用它。 - Steffen Ullrich
2
@SteffenUllrich 你会如何配置后者?仅使用 proxy_pass https://.. 是不起作用的(即当我使用无效证书时,它仍然可以正常工作)。nginx版本1.6.2。 - Joost

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接