文章目录

  • 选择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中心包括:

  1. Symantec:赛门铁克(Symantec)是全球第一大数字证书颁发机构、全球最值得信赖的SSL证书品牌,所有证书都采用业界领先的加密技术,为不同的网站和服务器提供安全解决方案
  2. CFCA: 中国金融认证中心(CFCA)通过国际WebTrust认证,遵循全球统一鉴证标准,是国际CA浏览器联盟组织成员。CFCA全球信任SSL证书,由中国权威数字证书认证机构自主研发,纯国产证书。CFCA提供 7x24 小时金融级的安全保障服务,且有完善的风险承保计划。提供中文版全球信任体系电子认证业务规则(CPS),便于用户理解双方权利和义务
  3. GeoTrust: GeoTrust 是全球第二大数字证书颁发机构, 也是身份认证和信任认证领域的领导者,采用各种先进的技术使任何大小的机构和公司都能安全、低成本地部署SSL数字证书和实现各种身份认证
  4. 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模块:

  1. ssl on | off;
    为指定虚拟机启用HTTPS protocol, 建议用listen指令代替
  2. ssl_certificate file;
    当前虚拟主机使用PEM格式的证书文件
  3. ssl_certificate_key file;
    当前虚拟主机上与其证书匹配的私钥文件
  4. ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]; 支持ssl协议版本,默认为后三个
  5. ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
none: 通知客户端支持ssl session cache,但实际不支持

builtin[:size]:使用OpenSSL内建缓存,为每worker进程私有

[shared:name:size]:在各worker之间使用一个共享的缓存
  1. 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

nginx使用加密存储_客户端


nginx使用加密存储_nginx使用加密存储_02


因为用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

nginx使用加密存储_客户端_03

if (condition) { … }语句

条件满足时,执行配置块中的配置指令;server, location

condition:

  1. 比较操作符
= 相同 != 不同

~ 模式匹配,区分字符大小写

~* 模式匹配,不区分字符大小写

!~ 模式不匹配,区分字符大小写

!~* 模式不匹配,不区分字符大小写
  1. 文件及目录存在性判断
-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";
	 } 
}

nginx使用加密存储_nginx_04


这样即使访问的是http://也会跳转到https://中

nginx使用加密存储_nginx_05

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 浏览器

nginx使用加密存储_nginx使用加密存储_06

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

nginx使用加密存储_客户端_07


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

nginx使用加密存储_客户端_08

例如

要求:将 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 expression:被指定的正则表达式模式匹配到的字符串,要使用~开头,
例如: ~.*.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变量有关

nginx使用加密存储_客户端_09