一、HTTPS介绍

HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据

request Body 加密 http请求加密和解密_http跳转https

 HTTPS请求过程:

1、客户端服务端发起HTTPS请求,连接到服务端443端口
2、服务端将非对称加密的公钥传给客户端,与证书的形式传给客户端
3、服务端接收到该公钥进行验证,就是验证2中证书,如果有问题,则HTTPS请求无法继续;如果没有问题,则上述公钥是合格的。(第一次HTTP请求)客户端这个时候随机生成一个私钥,成为client key,客户端私钥,用于对称加密数据的;使用前面的公钥对client key进行非对称加密
4、进行二次HTTPS请求,将加密之后的client key传输给服务端
5、服务端使用私钥进行解密,得到client key,使用client key对数据进行对称加密
6、将对称加密的数据发送给客户端客户端使用非对称解密,得到服务端发来的数据,完成二次HTTPS请求

SSL的位置
SSL介于应用层和TCP层之间。应用层数据不再直接传递给传输层,而是传递给SSL层,SSL层对从应用层收到的数据进行加密,并增加自己的SSL头

RAS性能是非常低的,原因在于孕照大素数,大数计算,数据分割需要耗费很多的CPU周期,所以一般的HTTPS连接只在第一次握手的时候使用非对称加密,通过握手交换对称加密密钥,通过握手交换对称加密数据,在之后的通信走对称加密

HTTPS协议和HTTP协议的区别:
https协议需要到CA申请证书,一般免费证书很少,需要交费
http是超文本传输协议,信息是明文传输,https则是具有安全行的ssl加密传输协议
httphttpsshiy使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443
http的连接很简单是无状态的
HTTPS协议是由SSL+HTTP协议构建的可进行加密传输,身份认证的网络协议,要比http协议安全

 nginx实现https网站设置

二、证书和私钥的生成

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

[root@C7--01 ~]# openssl genrsa -des3 -out server.key 1024
Generating RSA private key, 1024 bit long modulus
.................................++++++
...++++++
e is 65537 (0x10001)
Enter pass phrase for server.key:                     #输入密码 密码直接输入这里输入123.com
Verifying - Enter pass phrase for server.key:         #再次输入密码 密码直接输入这里输入123.com

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

[root@C7--01 ~]# openssl req -new -key server.key -out server.csr

Enter pass phrase for server.key:                                               #输入serve.key生成的密码
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN                                             #国家代号,中国输入CN
State or Province Name (full name) []:BeiJing                                    #省的全名,拼音
Locality Name (eg, city) [Default City]:BeiJng                                   #市的全名,拼音
Organization Name (eg, company) [Default Company Ltd]:MyCompany Corp.            #公司英文名
Organizational Unit Name (eg, section) []:                                       #可以不输入;组织单位
Common Name (eg, your name or your server's hostname) []:www.bene.com            #输入域名,如:www.bene.com
Email Address []:QQ@123456.com                                                   #电子邮箱,可随意填

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:                                                         #可以不输入
An optional company name []:                                                     #可以不输入

3、备份一份服务器密钥文件

[root@C7--01 ~]# cp server.key server.key.org

4、去除文件口令

[root@C7--01 ~]# openssl rsa -in server.key.org -out server.key
Enter pass phrase for server.key.org:                                 #输入server.key
writing RSA key

5、生成证书文件server.crt

[root@C7--01 ~]# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=/C=CN/ST=BeiJing/L=BeiJng/O=MyCompany Corp./CN=www.bene.com/emailAddress=QQ@123456.com
Getting Private key
[root@C7--01 ~]# ls

server.crt  server.csr  server.key  server.key.org

6、配置nginx.com文件

[root@C7--01 ~]# vim /usr/local/nginx/conf/nginx.conf

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

      log_format  main  '$http_user_agent' '$request_uri' '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"' '"$upstream_cache_status"';
  
     
    server {
        listen       443 ssl;                   #比起默认的80使用了443默认是ssl方式
        ssl_certificate      ssl/server.crt;    #证书(公钥,发送到客户端)
        ssl_certificate_key  ssl/server.key;    #私钥
        server_name  www.benet.com;
        
        charset UTF-8;
        location / {
        root   html;
        index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
[root@C7--01 ~]# nginx -s reload
[root@C7--01 ~]# mkdir -p /usr/local/nginx/conf/ssl
[root@C7--01 ~]# cp server.crt server.key /usr/local/nginx/conf/ssl/

注意:ssl on; nginx1.15版本之前需要加,之后的不用加

[root@C7--01 ~]# nginx -s reload

nginx: [warn] the "ssl" directive is deprecated, use the "listen ... ssl" directive instead in /usr/local/nginx/conf/nginx.conf:19

 注意:如果保存文件时报错ssl那么进行下面的操作

[root@C7--01 ~]# nginx -s stop        #先停止nginx服务                       
[root@C7--01 ~]# cd /usr/src/nginx-1.18.0/                     

-----------#####---------进行重新编译安装----配置模块ssl------#####

[root@C7--01 nginx-1.18.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_ssl_module --with-pcre &&make install                                                 

[root@C7--01 ~]# nginx

进行访问测试:https://www.benet.com/

request Body 加密 http请求加密和解密_nginx_02

request Body 加密 http请求加密和解密_HTTPS的原理_03

request Body 加密 http请求加密和解密_HTTPS_04

 在公司内部有老用户想继续访问 :http://www.benet.com/ 的时候自动跳转 https://www.benet.com/

在配置文件中修改

[root@C7--01 ~]# vim /usr/local/nginx/conf/nginx.conf

........
...
 
    server {
        listen       443 ssl;
        listen       80;                                          #添加80端口
        ssl_certificate      ssl/server.crt;
        ssl_certificate_key  ssl/server.key;
        server_name  www.benet.com;
        rewrite ^/(.*) https://www.benet.com/ permanent;          #添加永久跳转到https
        charset UTF-8;
        location / {
        root   html;
        index  index.html index.htm;
        
        }

......
..
.

[root@C7--01 ~]# nginx -s reload

测试访问:http://www.benet.com

request Body 加密 http请求加密和解密_nginx_05

跳转成功