我们正在代理后端,我们不控制后端在https上连接时请求客户端证书。
当我们通过代理请求这些页面时,连接超时而后端没有响应,但是如果我们绕过代理,页面就可以正常工作。 这是处理客户端证书的nginx问题,还是应该在其他地方看?
Nginxconfiguration:
server { listen 443 ssl; ssl on; ssl_certificate /etc/nginx/ssl/webserver.pem; ssl_certificate_key /etc/nginx/ssl/webserver.key; location / { proxy_pass https://www.backendsite.com; proxy_set_header X-Forwarded-For $http_x_forwarded_for; } }
我不确定你是否意识到这一点,但是你在做什么是在www.backendsite.com上的一个中间人攻击。
要理解为什么在您的scheme中无法正常工作,我们需要解释证书和密钥在TLS中的实际作用。 所以我们走了
首先,我们需要明确一个关键。 我们没有,而且出于效率的原因不能有一个安全的渠道,所以我们使用Diffie Hellman作为我们的密钥交换协议。 以前我们可能已经build立了我们使用的参数。 现代思想认为这是一个坏主意,让我们走了一些。 这就是所谓的DHE(短暂的Diffie Hellman)。 如果你感觉真的很喜欢,你可以通过EC(EC-DHE)做到这一点。
现在的问题是,你怎么知道我使用DH发给你的参数? 为了证实这一点,我们需要一个数字签名algorithm,以便您可以获得一些关于我的公开信息,以validation使用我的私钥生成的签名只能由我进行。
服务器密钥材料规定,对于服务器端 – 一个私钥和一个公钥(包含在证书中,加上CA的签名表示,我们也相信这一点)。
通常情况下,客户端可以根据感觉为匿名连接生成一个公钥/私钥对。 所以在通常情况下:
但是,现在客户端提供了一个特定的密钥对。 这个密钥对用于保护协议的参数,所以会发生什么情况:
之所以不起作用,是因为nginx试图作为一个http代理,根据需要启动和重新应用https,并且在两端build立的可信证书TLS正在devise中阻止MITM。
工程师可以在后端受其控制的地方进行一些替代devise决策。 我在这里结束了,因为我想代理一个unix套接字,通过一些证书信息向前。 这可以使用这些注意事项来使用nginxvalidation证书,并在HTTP标头上进行观察 (不要传递整个原始证书)。