文章目录
- 选择SSL证书品牌(CA供应商)
- 选择证书类型
- 一. ngx_http_ssl_module
- 实验:用自签名证书
- 二. ngx_http_rewrite(也就是http跳转到https)
- if (condition) { ... }语句
- return语句
- rewrit
- [flag]:
- last 和 break
- 例如
- 多网站一个ip实现https加密
- ngx_http_referer盗链
选择SSL证书品牌(CA供应商)
阿里云SSL证书申请:
https://www.aliyun.com/product/cas?spm=a2c4g.11174283.2.1.47676fd4baNCYX
支持阿里云颁发数字证书的安全CA中心包括:
- Symantec:赛门铁克(Symantec)是全球第一大数字证书颁发机构、全球最值得信赖的SSL证书品牌,所有证书都采用业界领先的加密技术,为不同的网站和服务器提供安全解决方案
- CFCA: 中国金融认证中心(CFCA)通过国际WebTrust认证,遵循全球统一鉴证标准,是国际CA浏览器联盟组织成员。CFCA全球信任SSL证书,由中国权威数字证书认证机构自主研发,纯国产证书。CFCA提供 7x24 小时金融级的安全保障服务,且有完善的风险承保计划。提供中文版全球信任体系电子认证业务规则(CPS),便于用户理解双方权利和义务
- GeoTrust: GeoTrust 是全球第二大数字证书颁发机构, 也是身份认证和信任认证领域的领导者,采用各种先进的技术使任何大小的机构和公司都能安全、低成本地部署SSL数字证书和实现各种身份认证
-
GlobalSign
: GMO GlobalSign是全球最早的数字证书认证机构之一,一直致力于网络安全认证及数字证书服务,是一个备受信赖的CA和SSL数字证书提供商
选择证书类型
阿里云联合有资质的CA中心推荐以下几种数字证书配置组合方案:
免费型DV SSL: 免费型DV SSL证书是基础级SSL产品
说明 目前仅Symantec提供免费型数字证书,该证书仅支持绑定一个域名
只验证域名所有权,数小时内即可颁发
只提供通信链路加密功能
根证书一般使用CA中心认证的根证书
支持绑定一个明细子域名,且不支持通配符域名
通配符DV SSL:通配符DV SSL证书属于DV型SSL证书(Domain Validation SSL)
只验证域名所有权,数小时内即可颁发
提供高强度通信链路加密功能
支持绑定一个带有通配符的域名
专业版OV SSL: 专业版OV SSL证书属于OV型SSL证书(Organization Validation SSL)
验证域名所有权和申请单位的真实身份,解决在线信任问题
证书中显示申请者的企业单位名称,让访问用户安心使用
提供高强度通信链路加密功能
支持最多绑定100个域名,支持绑定通配符域名
说明 除专业版OV SSL证书外,Symantec还提供增强型OV SSL证书。增强型OV SSL证书采用ECC椭圆曲线算法
高级版EV SSL:高级版EV SSL证书属于EV型SSL证书(Extended Validation SSL)
严格验证域名所有权和申请单位的真实身份
证书在大部分浏览器中能显示绿色地址栏(部分证书在Safari浏览器中不显示),有效解决在线信任和网站被假冒问题
证书中详细显示申请者的企业单位信息,让访问用户安心使用
提供高强度通信链路加密功能。
支持最多绑定100个域名
说明 除高级版EV SSL证书外,Symantec还提供增强型EV SSL证书。增强型EV SSL证书采用ECC椭圆曲线算法
一. ngx_http_ssl_module
主要用到两个文件
证书文件
私钥文件
ngx_http_ssl_module模块:
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_cache
off | none | [builtin[:size]] [shared:name:size]
;
none: 通知客户端支持ssl session cache,但实际不支持
builtin[:size]:使用OpenSSL内建缓存,为每worker进程私有
[shared:name:size]:在各worker之间使用一个共享的缓存
-
ssl_session_timeout
time;
客户端连接可以复用ssl session cache中缓存的有效时长
,默认5m
示例:
server {
listen 443 ssl;
server_name www.qcq.com;
root /data/ssl/;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_session_cache shared:sslcache:20m;
ssl_session_timeout 10m;
access_log /var/log/nginx/qcq.com.ssl.log access_json;
}
实验:用自签名证书
一般情况下得申请ssl证书:花费的
阿里云SSL证书申请:
https://www.aliyun.com/product/cas?spm=a2c4g.11174283.2.1.47676fd4baNCYX
这里用自签名证书实现
申请证书
cd /etc/pki/certs
make qcq.crt
因为用make生成私钥时,是加密的,所以得给他解密(不然每次登陆得输入口令)
解密
openssl rsa -in qcq.key -out qcq.com.key
要用的文件qcq.com.key和qcq.crt
mkdir /etc/nginx/ssl
mv /etc/kpi/crets/qcq* /etc/nginx/ssl
chmod 600 /etc/nginx/ssl/*
修改nginx配置文件
vim /etc/nginx/conf.d/test.conf
server {
listen 443 ssl;
server_name www.qcq.com;
root /vhosts/ssl/htdocs;
ssl_certificate /etc/nginx/ssl/qcq.crt;
ssl_certificate_key /etc/nginx/ssl/qcq.com.key;
ssl_session_cache shared:sslcache:20m;
ssl_session_timeout 10m;
access_log /var/log/nginx/qcq.com.ssl.log access_json;
}
如果将https和http的root路径改为一样的,那么两个网址访问的网页一样
二. ngx_http_rewrite(也就是http跳转到https)
将用户请求的URI基于PCRE regex所描述的模式进行检查,而后完成重定向替换至https,或者其他网页
示例:
http://www.magedu.com/hn --> http://www.magedu.com/henan
http://www.magedu.com --> https://www.magedu.com/
将http和https的网页搞成一样的 最简单的方式
就是在https配置中监听的端口改为 80和443
if (condition) { … }语句
条件满足时,执行配置块中的配置指令;server, location
condition:
- 比较操作符:
= 相同 != 不同
~ 模式匹配,区分字符大小写
~* 模式匹配,不区分字符大小写
!~ 模式不匹配,区分字符大小写
!~* 模式不匹配,不区分字符大小写
- 文件及目录存在性判断:
-e,!-e 存在与否(包括文件,目录,软链接)
-f,!-f 文件 -d,!-d 目录 -x,!-x 执行
注意: if (condition) { … } 语句中,如果$变量的值为空字符
串或是以0开头
的任意字符串,则 if 指令认为该条件为false
,其它条件为true
示例:实现http----->到https跳转
location /test {
index index.html;
default_type text/html;
#scheme表示协议---是一个变量
if ( $scheme = http ){
return 301 https://www.magedu.net/;
}
if ( $scheme = https ){
echo "if ----> $scheme";
}
}
这样即使访问的是http://也会跳转到https://中
if (-f $request_filename) {
echo "file is exist";
}
if (!-f $request_filename) {
echo "file is not exist";
return 409;
}
判断浏览器类型$http_user_agent
如果是curl浏览器 直接拒绝
if ( $http_user_agent ~* curl ){
return 301 "deny all";
}
但是用curl可以冒充其他浏览器
-A 浏览器
return语句
return code [text]; #返回客户端指定的状态码和文本说明
return code URL;
return URL;
停止处理,并返回给客户端指定的响应码(包括: 204, 400, 402 — 406, 408, 410, 411, 413, 416, 500 — 504),并对 301, 302, 303, 307, 308跳转到URL
rewrite_log
on | off;
是否开启重写日志, 发送至error_log(notice level)
set $variable value
;
用户自定义变量
注意:变量定义和调用
都要以$开头
location /test {
root /data/nginx/html/pc;
default_type text/html;
index index.html;
if ( $scheme = http ){
#return 666;
#return 666 "not allow http";
#return 301 http://www.baidu.com;
return 500 "service error";
echo "if-----> $scheme";
}
if ( $scheme = https ){
echo "if ----> $scheme";
}
}
rewrit
状态码:301,302,307
301永久重定向:可缓存
302临时重定向:无缓存
307内部跳转:有缓存时间,自动跳转
注意http----->https状态码一般是302
rewrite 一般都写到location{ }中,并且配合if判断
rewrite regex replacement [flag]
rewrit 源路径 跳转到 什么方式
将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为replacement指定的新的URI
注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查
隐含有循环机制,但不超过10次;如果超过,提示500响应码,[flag]所表示的标志位用于控制此循环机制
如果replacement是以http://或https://开头,则替换结果会直接以重向返回给客户端, 即永久重定向301
[flag]:
last
:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后对新的URI启动新一轮重写检查;提前重启新一轮循环(支持多次跳转
)
break
:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块后的其它配置;一次跳转后,结束循环
redirect
:临时重定向302
,重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;可使用相对路径,或http://或https://开头,此重定向信息不可缓存
默认
permanent
:重写完成后以永久重定向301
方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求,此重定向信息可缓存
last 和 break
break:匹配成功后不再向下匹配,也不会跳转到其他的location,即直接结束匹配并给客户端返回结果
数据(只支持跳转一次)
last:对某个location的URL匹配成功后会停止当前location的后续rewrite规则,并结束当前location,然后将匹配生成的新URL跳转至其他location继续匹配,直到没有location可匹配后将最后一次location的数据返回给客户端
(支持,多个跳转)
这里的$1,$2相当于shell中的分组 \1,\2
location /break {
#break不会跳转到其他的location
rewrite ^/break/(.*) /test/$1 break;
return 666 "break";
}
location /last {
#last会跳转到其他的location继续匹配新的URI
rewrite ^/last/(.*) /test/$1 last;
return 888 "last";
}
location /test {
return 999 "test";
index index.html; #否则会自动打印
root /data/nginx;
}
mkdir /data/nginx/test/
echo test Page > /data/nginx/test/index.html
例如
要求:将 http:// 请求跳转到 https://
临时
生产案例
location / {
if ($scheme = http ) {
rewrite / https://www.magedu.net/ redirect;
}
}
要求:当用户访问到公司网站的时输入了一个错误的URL,可以将用户重定向至官网首页
location / {
root /data/nginx/html/pc;
index index.html;
if (!-f $request_filename) {
#return 404 "No exsit";
rewrite (.*) http://www.magedu.net/index.html;
}
}
多网站一个ip实现https加密
也就是TLS SNI功能
apache不支持
有几个https网站,建立几个证书(每个网站又要监听443端口)
先申请私钥,证书
然后将私钥证书放到指定的文件中
在配置文件中,写入相应的规则(加入私钥,和证书路径)
ngx_http_referer盗链
在server中定义
也就是在自己的网站上盗链其他的网页
(访问的是net,但真正看到的是org)
ngx_http_referer_module模块:
用来阻止Referer首部无有效值的请求访问,可防止盗链
valid_referers none|blocked|server_names|string ...;
定义referer首部的合法可用值
,不能匹配的将是非法值none
:请求报文首部没有referer首部blocked
:请求报文有referer首部,但无有效值server_names
:referer首部中包含本主机名(网站内部跳转)arbitrary_string
:任意字符串,但可使用 *作通配符regular expressio
n:被指定的正则表达式模式匹配到的字符串,要使用~开头,
例如: ~.*.qcq.com
防止盗链生产案例:
定义合法referer
valid_referers none block server_names
*.qcq.com magedu.* *.qcq.com mageedu.* ~\.qcq\.
~\.google\. ~\.baidu\.;
if ($invalid_referer) {
return 403 "Forbidden Access";
}
referer 空
表示没有跳转—>没有盗链
与日志$http_referer
变量有关