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

Nginx-加密会话

2018-11-30 08:28 260 查看

Nginx实现ssl会话加密:

ssl on | off;
为指定虚拟机启用HTTPS protocol, 建议用listen指令代替

ssl_certificate file;
当前虚拟主机使用PEM格式的证书文件

ssl_certificate_key file;
当前虚拟主机上与其证书匹配的私钥文件

ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
支持ssl协议版本,默 认为后三个

ssl_session_timeout time;
客户端连接可以复用ssl session cache中缓存的ssl参数的有效时长,默认5m

ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
none:  通知客户端支持ssl session cache,但实际不支持
builtin[:size]:使用OpenSSL内建缓存,为每worker进程私有
[shared:name:size]:在各worker之间使用一个共享的缓存

server {
listen       443 ssl  default_server;
listen       [::]:443 ssl http2 default_server;
server_name  app.a.com;
root         /www/app/html;

ssl_certificate "/etc/nginx/conf.d/nginx.crt";
ssl_certificate_key "/etc/nginx/conf.d/nginx.key";
#       ssl_session_cache shared:SSL:1m;
ssl_session_timeout  10m;
ssl_session_cache shared:sslcache:20m;
#       ssl_ciphers HIGH:!aNULL:!MD5;
#       ssl_prefer_server_ciphers on;

#        # Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
#
location / {
}
}
}

支持同一主机多虚拟主机实现ssl会话

快速申请测试证书:
在/etc/pki/tls/certs/目录下执行:
make [*].crt即可
需要更改一下Makefile文件
/usr/bin/openssl genrsa  $(KEYLEN) > $@
#/usr/bin/openssl genrsa [-aes128】 $(KEYLEN) > $@
去掉[]中的内容,否则会加密!

Nginx地址重写功能:

7 地址重写-rewrite[server|location]

rewrite [表达式] [替换路径] [标志位]

location / {
root /www/b.org;
rewrite ^/images/(.*)$ /imgs/$1;
}
这样用户再查找http://www.b.org/images/a.jpg就会跳转至
http://www.b.org/imgs/a.jpg--这个网站一样会被location规则检查

标志位:
last:一旦被rewrite规则匹配并重写后,立刻停止检查后续的
rewrite规则,而后通过重写后的规则重新发起请求[响应码200]

break:一旦被rewrite规则匹配并重写后,立刻停止检查后续的
rewrite规则,而后继续由nginx进行后续的操作

redirect:临时重定向
重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端
由客户端重新发起请求
使用相对路径,或者http://或https:// 开头
状态码返回302临时重定向[访问路径会改变|会发起两次请求]

permanent:重写完成后以永久重定向方式直接返回重写后生成的新URI给客户端
由客户端重新发起请求
状态码:301

具体应用1:整网站重定向
server {
server_name www.c.com;
listen 80;
index index.html;
root /web/c.com;
error_page 404 =302 /404.html;
location /test2/ {
try_files $uri /test2/test.html;
}

location / {
rewrite / http://www.a.com/break;
}

}
测试访问:
[root@apache113:21:20network-scripts]#curl -L http://www.c.com
<h1>test a.com page for nginx virt</h1>
已经跳转至www.a.com网站!

具体应用2:http--->https在不同虚拟机之上
location / {
rewrite / https://app.a.com/;
}

测试访问:
[root@apache113:28:41network-scripts]#curl -Lk  http://www.c.com
<h1>test nginx ssl session page</h1>

具体应用3:http--->https在同一虚拟主机
如果此时在按照之前的设置进行配置就会出现死循环
因为无论是http还是https都是一个"/"

报错格式:
[root@apache113:30:50network-scripts]#curl -Lk  http://app.a.com
curl: (47) Maximum (50) redirects followed

此时我们就需要用到另外一个关键语法:
if(判断条件) {

}

使用"="和"!="来比较变量与字符串的关系。
使用"~"(对于区分大小写匹配)和"~*"(不区分大小写匹配)的操作符来匹配变量的正则表达式。
正则表达式可以包含可用于以后重用的$ 1…$ 9变量的捕获。
"!~"和"!"!~*"也可用。
如果正则表达式包含"}"或""字符,则整个表达式应该用单引号或双引号括起来。
用"-f"和"!-f"检查文件的存在性!
用"-d"和"!-f"检查目录的存在性!
用"-e"和"!-e"检查文件、目录或符号链接的存在!
用"-x"和"!-x"检查可执行文件

Nginx内置变量:$scheme[获取http|https]

正确设置方式:
location / {
if ( $scheme =  http ) {
rewrite / https://app.a.com;
}

}

解析:如果请求协议时http就转发!

测试结果:
[root@apache113:30:54network-scripts]#curl -Lk  http://app.a.com
<h1>test nginx ssl session page</h1>

return code:
用于结束rewrite规则,并且为客户端返回状态码
可以使用的状态码有 204 400 402-406 500-504等
具体使用:返回提示语句
location /admin {
return 403 "You can't GET this region";
}

访问测试:
[root@apache113:44:30network-scripts]#curl -I http://www.c.com/admin
HTTP/1.1 403 Forbidden

具体使用2:直接跳转其它页面
location /admin {
return http://app.a.com;
}

测试结果:
[root@apache113:46:59network-scripts]#curl -Lk http://www.c.com/admin
<h1>test nginx ssl session page</h1>

rewrite_log on|off
是否把重写过程记录再错误日志中,默认级别为notice级别
默认是off,再繁忙的服务器中不建议打开

设置:
server {
server_name www.c.com;
listen 80;
index index.html;
root /web/c.com;
error_log /web/c.com/c.com.erro.log;
rewrite_log on;
error_page 404 =302 /404.html;
location /test2/ {
try_files $uri /test2/test.html;
}

location /admin {
return http://app.a.com;
}
location /down {
rewrite /down http://www.c.com/test2;
}

}

仅对rewrite语句有效|对return语句不起作用!

set $variable value;
用户自定义变量
注意:变量定义和调用都要以$开

Nginx防盗链:

很多情况下,如果我们没有对我们网站的资源做足够多
的保护,就很可能被别的网站进行盗链活动,这样会很占
据我们自己的网络带宽!
例如:
我们自己的网站:www.c.com
竞争产品网站:www.a.com
a网站index.html主页代码:
[root@www19:20:50a.com]#cat index.html
<h1>test a.com page for nginx virt</h1>
<img src="http://www.c.com/linux.jpg">
这样访问的时候,会在a网站的页面上出现我们的图片!
这时候就需要我们运维人员进行设置,防止对方盗链:
方法:valid_referers[server|location]

1 定义合规的引用
valid_referers none | blocked | server_names | string ...;
解析:
none:referer为空,浏览器直接访问referer值为空,
应该允许访问
blocked:请求首部中有referer字段,但是referer字段被
清空,通常情况下应该允许访问
server_names:主机名
regular expression:被指定的正则表达式模式匹配到的字符串,要使用~开头
arbitrary_string:任意字符串,但可使用*作通配符

2 拒绝不合规的引用
if($invalid_referer) {
rewrite;
}

具体应用:
c网站运维人员设置:
location ~* .*\.(jpg|gif)$ {
valid_referers none blocked www.c.com *.c.com;
if ($invalid_referer) {
rewrite ^/ http://www.c.com/test2/index.html;
}
}

这样再次访问a网站的时候就不会被盗链了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Nginx 加密 会话