前段时间,公司需要对一个多应用模块的项目实现访问安全,在网上调研了下,最后决定使用nginx实现https安全协议
1. 应用背景
平台应用模块较多,原本平台代理引入了nginx,经查询资料nginx本身支持https的协议请求,因此本次设计通过nginx对所有请求做安全化,对外请求统一使用https协议,内部模块之间请求仍使用API接口。
2. 使用nginx https的优点
- Nginx自身支持https安全协议技术已经成熟
- Nginx本身为代理层,在nginx层设置https安全协议,可对所有应用模块适用
- Nginx中配置https安全协议,无需更改任何应用模块
3. 场景模拟
- 独立服务器
独立服务器: 网络环境中不经过防火墙,且有且仅有一台主机服务器,nginx开启https请求,将站点对外访问转为安全协议,对内仍可http协议的API接口
- 冗余环境
冗余环境: 满足项目中冗余环境,当主机服务器宕机时,会将从机升级为主机,保证当前环境仍可满足安全访问,客户端通过域名访问站点,DNS服务器(网络设置配置多DNS),检测可以ping通的DNS主机作为目标机,检测该主机上nginx所配置的服务器名称,访问站点,当主机挂掉时,主机DNS将ping不通,直接访问指向从机
- 网络防火墙
网络中有防火墙: 当网络环境中有防火墙时,访问请求需经过防火墙做IP和端口映射,并且设置服务器的网关与防火墙端口网管相同。
4. Nginx启用https
ginx启用https安全协议分为:生成证书和修改nginx.conf文件
- 生成证书
- 在 nginx安装目录中创建ssl文件夹用于存放证书
- 创建私钥
- 创建csr证书
- 去除密码
- 生成crt证书
- 修改nginx.conf文件
- 启用nginx.conf文件中的https协议
- https监听443端口(默认)
- 配置https协议使用csr和crt证书
- 指定ssl为on
- 指定项目默认页面
- 重启nginx
nginx.conf文件模板如下:
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
access_log logs/****.access.log;
error_log logs/****.error.log;
sendfile on;
keepalive_timeout 65;
# HTTPS server
#
server {
listen 443; #ssl端口
listen 18092; #用户习惯用http访问,加上80,后面通过497状态码让它自动跳到443端口
server_name 192.192.192.190;
#为一个server{......}开启ssl支持
ssl on;
#ssl_certificate ../ssl/***.crt;
ssl_certificate ../test/***.crt;
ssl_certificate_key ../test/***.key;
#让http请求重定向到https请求
error_page 497 https://$http_host$uri?$args;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://192.192.192.192:18090;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_redirect http:// $scheme://; #做https跳转
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ~\.(action) {
proxy_pass http://192.192.192.192:18090;
#proxy_redirect off;
client_max_body_size 100m;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 1;
proxy_read_timeout 360;
proxy_buffering off;
expires off;
}
location ~\.(html) {
proxy_pass http://192.192.192.192:18090;
#proxy_redirect off;
client_max_body_size 100m;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 1;
proxy_read_timeout 360;
proxy_buffering off;
expires off;
}
}
}