因为HTTP采用的是明文传输数据,那么在传输(账号密码、交易信息、等敏感数据)时不安全。容易遭到篡改,如果使用HTTPS协议,数据在传输过程中是加密的,能够有效避免网站传输时信息泄露。
TLS/SSL工作在OSI七层模型中,应用层与传输层之间。
1.提供数据安全:保证数据不会被泄露。
2.提供数据的完整性:保证数据在传输过程中不会被篡改。
3.对应用层交给传输层的数据进行加密与解密。
非对称加密:它根据一个数学原理,创建一对秘钥(公钥和私钥)公钥加密,私钥解密;
通讯双方是如何验证双方的身份?CA机构是可信任组织机构,主要用来颁发证书及验证证书。那CA机构又是如何申请和颁发证书的呢?
我们首先需要申请证书,需要进行登记,登记我是谁,我是什么组织,我想做什么,到了登记机构在通过CSR发给CA,CA中心通过后,CA中心会生成一对公钥和私钥,那么公钥会在CA证书链中保存,公钥和私钥证书订阅人拿到后,会将其部署在WEB服务器上
HTTPS加密过程,HTTPS采用混合加密算法,即对称加密、和非对称加密。
通信前准备工作:申请域名对应的证书,并将其部署在Nginx服务器中。
保护1个域名www.bertwu.com
保护5个域名 (www images cdn test m).bertwu.com
通配符域名*.bertwu.com
#官方示例
worker_processes auto;
http {
...
server {
listen 443 ssl;
keepalive_timeout 70;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 协议
ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5; # 加密套件
ssl_certificate /usr/local/nginx/conf/cert.pem; # 公钥证书存放路径
ssl_certificate_key /usr/local/nginx/conf/cert.key; # 私钥证书存放路径
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
...
}
}
1.创建证书存储目录
[root@web01 ~]# mkdir -p /etc/nginx/ssl_key
2.使用openssl命令充当CA权威机构创建证书(类似黑户)
[root@web01 ~]# cd /etc/nginx/ssl_key/
[root@web01 ssh_key]# openssl genrsa -idea -out server.key 2048
Generating RSA private key, 2048 bit long modulus
.........................+++
...............+++
e is 65537 (0x10001)
Enter pass phrase for server.key: #随便输入密码123456
Verifying - Enter pass phrase for server.key:
3.生成自签证书,同时去掉私钥的密码
[root@web01 ssl_key]# openssl req -days 36500 -x509 \
-sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt
...
[root@web01 ssl_key]# ls
server.crt server.key
# req -->用于创建新的证书
# new -->表示创建的是新证书
# x509 -->表示定义证书的格式为标准格式
# key -->表示调用的私钥文件信息
# out -->表示输出证书文件信息
# days -->表示证书的有效期
如果用户忘记在浏览器地址栏输入 https:// 协议那么将不会跳转至https站点;所以监听http请求,跳转到https
[root@web01 conf.d]# cat s.bertwu.conf
server {
listen 443 ssl;
server_name s.bertwu.net;
root /code;
ssl_certificate ssl_key/server.crt;
ssl_certificate_key ssl_key/server.key;
location / {
index index.html;
}
}
# 如果http访问,重定向到https
server {
listen 80;
server_name s.bertwu.net;
return 302 https://$server_name$request_uri;
}
主机名 | 外网IP(NAT) | 内网IP(LAN) | 角色 |
---|---|---|---|
lb01 | eth0:10.0.0.5 | eth1:172.16.1.5 | nginx-proxy |
eb01 | eth0:10.0.0.7 | eth1:172.16.1.7 | nginx-web01 |
web02 | eth0:10.0.0.8 | eth1:172.16.1.8 | nginx-web02 |
1.nginx-proxy
[root@lb01 conf.d]# cat s.blog.conf
upstream blog {
server 10.0.0.7:80;
server 10.0.0.8:80;
}
server {
listen 443 ssl;
server_name blog.oldxu.net;
ssl_certificate ssl_key/6152893_blog.oldxu.net.pem;
ssl_certificate_key ssl_key/6152893_blog.oldxu.net.key;
location / {
proxy_pass http://blog;
include proxy_params;
}
}
# 用户使用http 直接跳转https
server {
listen 80;
server_name blog.bertwu.net;
return 302 https://$server_name$request_uri;
}
[root@web01 conf.d]# cat s.bertwu.conf
server {
listen 80;
server_name blog.oldxu.net;
root /code/wordpress;
location / {
index index.html index.php;
}
location ~* .*\.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param HTTP on;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
[root@web02 conf.d]# cat s.bertwu.conf
server {
listen 80;
server_name blog.oldxu.net;
root /code/wordpress;
location / {
index index.html index.php;
}
location ~* .*\.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param HTTP on;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
1.用户访问网站主站,使用 http 协议提供访问,
2.当用户点击登陆时,则网站会跳转至一个新的域名,并使用的是 Https 提供安全访问。
[root@web01 conf.d]# cat yh.conf
server {
listen 443 ssl;
charset utf-8;
server_name login.bertwu.net;
root /code/login;
ssl_certificate ssl_key/server.crt;
ssl_certificate_key ssl_key/server.key;
location / {
index index.html;
}
}
server {
listen 80;
charset utf-8;
root /code;
server_name yh.bertwu.net;
location / {
index index.html;
}
location /login {
return 302 https://login.bertwu.net;
}
}
[root@web01 code]# cat /code/index.html
<p>欢迎来到xx建设银行</p>
<a href="/login">点我登录</a>
[root@web01 code]# cat /code/login/index.html
账号:<input type="text"></input>
密码:<input type="password">密码:</input>
<input type="submit" name="登录">
希望用户访问网站的所有Url走Https协议,但访问s.bertwu.net/abc时走Http协议
[root@lb01 conf.d]# cat abc.conf
upstream aaa {
server 10.0.0.7:80;
server 10.0.0.8:80;
}
server {
listen 443 ssl;
server_name s.bertwu.net;
ssl_certificate ssl_key/server.pem;
ssl_certificate_key ssl_key/server.key;
location / {
proxy_pass http://aaa;
include proxy_params;
}
}
server {
listen 80;
server_name s.bertwu.net;
if ( $request_uri !~* "^/abc") {
return 302 https://$server_name$request_uri;
}
}
SSL的运行计算需要消耗额外的 CPU 资源,SSL通讯过程中『握手』阶段的运算最占用 CPU 资源,有如下几个方面可以进行调整与优化。
worker_processes auto;
http {
...
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate www.example.com.crt;
ssl_certificate_key www.example.com.key;
ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on; #Nginx决定使用哪些协议与浏览器进行通讯
keepalive_timeout 70; #设置长连接
# 默认不开启session_cache: a握手后,关闭浏览器,再次访问,需要重新握手;
#建立握手后如果连接断开,在session_timeout时间内再次连接,无需再次建立握手,可直接复用之间缓存的连接。
ssl_session_cache shared:SSL:10m; #1M缓存空间能存储 4000 个会话数量
ssl_session_timeout 1440m; #配置会话超时时间 ( 默认5分钟 )
}