​Ningx:实现http强制跳转https

19人浏览 / 0人评论

以往打开网站,网址前面通常都是http:开头的,但如今细心的朋友会发现,京东、淘宝等知名网站的网址开头都已变为了https。

这时候不少同学可能要问了:https是啥?它的作用是啥?对于这类问题,下面就来为大家分享一下HTTPS的用途。

https是什么?

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。

首先,客户端与服务器建立连接,各自生成私钥和公钥,是不同的。服务器返给客户端一个公钥,然后客户端拿着这个公钥把要搜索的东西加密,称之为密文,并连并自己的公钥一起返回给服务器,服务器拿着自己的私钥解密密文,然后把响应到的数据用客户端的公钥加密,返回给客户端,客户端拿着自己的私钥解密密文,把数据呈现出来。

https有什么用?

HTTPS可以避免第三方窃听或阻断流量,保护用户的隐私和安全,提升口碑。此外,谷歌开始针对启用HTTPS网站给予更高的搜索引擎权重,可以提升网站流量。另外HTTPS能够更好的保护网站数据独享,在如今这个大数据时代,数据就是财富。

对于网友来说,访问启用HTTPS安全通道的网站,隐私和安全更有保障。

如何实现https?

HTTPS作为一种全新的安全协议,对网站本身以及访问网站的网友都有着防止隐私泄露的作用,更是具有CA认证,安全性大大提高。

但CA证书一般由专业的公司出售,企业需要购买才能使用,所以下文实验使用的是自己制作的证书。

操作步骤

证书和私钥的生成

1.创建服务器证书密钥文件 server.key

openssl genrsa -des3 -out server.key 1024  #输入密码,确认密码,自己随便定义,但是要记住,后面会用到。

2.创建服务器证书的申请文件 server.csr

openssl req -new -key server.key -out server.csr

输出内容为:
Enter pass phrase for root.key:  #← 输入前面创建的密码
Country Name (2 letter code) [AU]:CN  #← 国家代号,中国输入CN
State or Province Name (full name) [Some-State]:BeiJing  #← 省的全名,拼音
Locality Name (eg, city) []:BeiJing  #← 市的全名,拼音
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCompany Corp.  #← 公司英文名
Organizational Unit Name (eg, section) []:  #← 可以不输入
Common Name (eg, YOUR name) []:  #← 此时不输入
Email Address []:admin@mycompany.com  #← 电子邮箱,可随意填
Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:  #← 可以不输入
An optional company name []:  #← 可以不输入

3.备份密钥文件(重要步骤)

cp server.key server.key.org

4.去除文件口令

openssl rsa -in server.key.org -out server.key

5.生成证书文件server.crt

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

「注意:」证书及密钥生成后放置/etc/nginx/路径下

nginx配置文件

server{
    listen  80;
    server_name  www.aeht.com;
    location / {
    return  301
    https://$server_name$request_url;  #强制转发到https域名
    }
}

server{
    listen  443 ssl;  #比起默认的80 https协议使用了443
    server_name  www.aeht.com;
    location / {
    root /usr/share/nginx/html;
    }
    ssl  on;
    ssl_certificate  "/etc/nginx/server.crt";  #路径下的证书
    ssl_certificate_key  "/etc/nginx/server.key";  #路径下的私钥
}

实验示例

布置网站目录

mkdir -p /web/1
mkdir -p /web/2
echo a.com > /web/1/index.html
echo b.com > /web/1/index.html  #两个web目录文件

vim /etc/hosts  #做地址解析
##########
127.0.0.1  a.com
127.0.0.1  b.com
127.0.0.1  a+b.com
##########

nginx配置文件

vim nginx.conf
###########
server{
    listen  80;
    server_name  www.a+b.com;
    location / {
    return  301
    https://$server_name$request_url;
    }
}

server{
    listen  81 ssl;  
    server_name  a.com;
    location / {
    root /web/1;
    }
    ssl  on;
    ssl_certificate  "/etc/nginx/server.crt";
    ssl_certificate_key  "/etc/nginx/server.key";
}
server{
    listen  82 ssl;  
    server_name  b.com;
    location / {
    root /web/2;
    }
    ssl  on;
    ssl_certificate  "/etc/nginx/server.crt";
    ssl_certificate_key  "/etc/nginx/server.key";
}

server{
    listen  443 ssl;  
    server_name  a+b.com;
    location / {
    proxy_pass https://up;
    }
    ssl  on;
    ssl_certificate  "/etc/nginx/server.crt";
    ssl_certificate_key  "/etc/nginx/server.key";
}

upstream up {
    server 127.0.0.1:81;
    server 127.0.0.1:82;
}

server{
    listen  80;
    server_name  a.com;
    location / {
    return  301
    https://$server_name$request_url;
    }
}
server{
    listen  80;
    server_name  b.com;
    location / {
    return  301
    https://$server_name$request_url;
    }
}

server{
    listen  443 ssl;  
    server_name  a.com;
    location / {
    proxy_pass https://127.0.0.1:81;
    }
    ssl  on;
    ssl_certificate  "/etc/nginx/server.crt";
    ssl_certificate_key  "/etc/nginx/server.key";
}
server{
    listen  443 ssl;  
    server_name  b.com;
    location / {
    proxy_pass https://127.0.0.1:82;
    }
    ssl  on;
    ssl_certificate  "/etc/nginx/server.crt";
    ssl_certificate_key  "/etc/nginx/server.key";
}
###########
nginx -t  #必要步骤,配置校验,无报错才可以执行下一步
systemctl restart nginx  #重启服务

防火墙配置

frewall-cmd --add-port=80/tcp
frewall-cmd --add-port=443/tcp  #放开两个端口,这里演示是临时放开

最后验证

系统内

curl https://a.com -k
curl https://b.com -k
curl https://a+b.com -k




一个会购物、能赚钱的公众号

全部评论