您的位置:首页 > 运维架构 > Nginx

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

2017-11-04 11:27 1576 查看

写在前面

本文主要涉及

* 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.conf
http {
...
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.log
172.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.199
offloader
的IP, 因为, 对于
http server
, TCP连接的源端是
offloader


行尾的
172.16.1.206
browser
的IP, 这是怎么来的呢?
offloader
收到请求后, 在向
http server
转发时, 会向
http header
中添加
X-Forwarded-For: 172.16.1.206
以告诉
http server
这个连接是从哪来的. 最后
http server
将”真正的”源端IP记录到日志中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: