使用ssl加密Nginx与uptream servers之间的流量
nginx做为一款优秀的反向代理软件,最常见的架构是:
客户 <---> NGINX(反向代理) <---> 后端服务器(upstream servers)
如果nginx和后端服务器都在公网上,按常规配置,nginx与后端服务器之间的流量是明文传输的,很容易受到篡改、嗅探或者被GFW认证。我就遇到了NGINX反代后端服务器时,竟然被劫持了!!!
Nginx作为工作在7层的软件,最常用的加密方式就是https了,我只需要加密nginx到upstream servers之间的流量,不需要浏览器认证,所以自签名证书就够了,此作法需要:
1. 自签名证书
2. 后端服务器配置https
3. nginx配置解密私钥
一、生成自签名证书
使用openssl生成签名证书:
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout nixops.me.key -out nixops.me.crt
二、后端服务器配置自签名证书
为了不影响后端的https配置,我启用了一个新端口,配置自签名证书。我后端(upstream servers)也是nginx服务器
server {
listen 12345;
ssl on;
ssl_certificate "/etc/ssl/certs/nixops.me.crt";
ssl_certificate_key "/etc/ssl/certs/nixops.me.key";
...... server configs ......
}
三、NGINX配置upstream加密
nginx(反向代理)配置upstream和解密私钥:
upstream backend {
server backend1.nixops.me:12345;
server 8.8.8.8:12345;
check interval=3000 rise=2 fall=3 timeout=30000 type=tcp;
#check interval=3000 rise=2 fall=3 timeout=30000 type=http;
#check_http_send "GET / HTTP/1.0\r\nConnection: keep-alive\r\nHost:www.nixops.me\r\n\r\n";
#check_http_expect_alive http_2xx http_3xx;
}
server {
listen 80;
ssl_certificate_key "/etc/ssl/certs/nixops.me.key";
location / {
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;
proxy_pass https://backend;
}
}
配置好后,nginx到后端的upstream servers就会使用https加密了。
我的NIGNX版本tengine 2.1.2(nginx 1.6.1),nginx版本非常低。如果使用的是官方nginx,版本在1.9.2以上,有另外的模块可以实现Upstream加密的功能,原理是一样的。可以参考官方文章:https://www.nginx.com/resources/admin-guide/nginx-tcp-ssl-upstreams/