SSL/TLS 卸载(offloading/termination) -- 利用 nginx

来源:互联网 发布:小米平板2 windows版 编辑:程序博客网 时间:2024/06/05 14:45

写在前面

本文主要涉及
* openssl 生成证书
* nginx 配置 SSL Offloading
* X-Forwarded-For
* nginx 日志

至于SSL/TLS是怎么被卸载的呢? SSL/TLS 卸载(offloading/termination) – C语言 + openssl 实现 一文给了一个demo, 仅供参考.

本人对相关知识理解并不深入, 仅为满足个人好奇心, 可能存在描述或解释错误的地方, 文章内容仅供参考!

环境

http server (nginx): 172.16.1.141
ssl offloader(nginx): 172.16.1.199
client/browser: 172.16.1.206

系统均是 CentOS 7

http server(nginx)

172.16.1.141上使用nginx作为http server, 配置这里就省略了
网站由一个简单的html文件和一个文本文件构成, 之所以加一个文本文件, 是为了观察browser 连续发送两个请求.

$ cat html/index.html <html>    <img src="/test.txt"  alt="test" /></html>$ cat html/test.txt hello world!

请忽略文本文件的引用为什么在html中用的是img标签

ssl offloader(nginx)

172.16.1.199上, 生成证书

$ openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes

172.16.1.199上, nginx配置

$ cat /etc/nginx/nginx.confhttp {    ...    upstream mywebapp1 {        server 172.16.1.141; # http server(也是使用的nginx)    }    server {    listen 80;    listen 443 ssl;    server_name example.com www.example.com;        # 启用SSL        # cert.pem, key.pem是前面步骤生成的    ssl on;    ssl_certificate /etc/nginx/ssl/example.com/cert.pem;    ssl_certificate_key /etc/nginx/ssl/example.com/key.pem;        # Ignore the ssl_trusted_certificate directive if you are using self-signed certificates.    # ssl_trusted_certificate /etc/nginx/ssl/example.com/ca-certs.pem;        root         /usr/share/nginx/html;    location / {        proxy_pass http://mywebapp1;        proxy_set_header Host $host;        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # offloader(nginx) 会向http header 中添加 X-Forwarded-For 字段        proxy_set_header X-Forwarded-Proto $scheme;    }        ...    }    ...}

测试

172.16.1.206 上浏览器访问 https://172.16.1.199
或者使用curl

172.16.1.141 上查看nginx(http server) 日志

172.16.1.141 $ cat /var/log/nginx/access.log172.16.1.199 - - [03/Nov/2017:14:59:50 +0800] "GET / HTTP/1.1" 200 78 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0" "172.16.1.206"172.16.1.199 - - [03/Nov/2017:14:59:50 +0800] "GET /test.txt HTTP/1.1" 200 13 "https://172.16.1.199:4433/" "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0" "172.16.1.206"

行首的172.16.1.199offloader的IP, 因为, 对于http server, TCP连接的源端是offloader
行尾的172.16.1.206browser的IP, 这是怎么来的呢? offloader 收到请求后, 在向http server 转发时, 会向http header 中添加X-Forwarded-For: 172.16.1.206 以告诉http server 这个连接是从哪来的. 最后http server 将”真正的”源端IP记录到日志中