谈谈Nginx-HTTPS加密技术

    超文本传输安全协议(HTTPS)是以安全为目标的HTTP通道,简单来说就是HTTP安全版。https由两个部分组成:HTTP+SSL/TLS,在http基础上加上了一层加密信息模块,服务端和客户端的信息插损胡都会通过TLS进行加密,传输的数据都是加密后的数据

    为了解决HTTP协议的这些缺陷,需要使用另一种协议:HTTPS。为了数据传输的安全性,HTTPS在http的基础上加了SSL协议,SSL依靠证书验证身份,并为浏览器和服务器之间通信加密;

     SSL证书是一种数字证书,使用Secure Socket Layer协议在浏览器和web服务器之间建立一条安全通道,从而实现数据信息在客户端和服务器之间的加密传输,保证双方传递信息的安全性,不可被第三方窃听,而且用户可以通过服务器证书验证所访问网站是否真实可靠;

    加密的HTTPS和HTTP的区别:超文本传输协议HTTP协议被用于在web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的加密数据,如果攻击者截取了web浏览器和网站服务器之间的传输报文,就可以直接读取其中信息,因此,http协议不适合传输一些铭感信息;

HTTPS加密,解密,验证完成过程如图所示:

首先客户端发送请求,服务端接受到请求之后并申请生成公私秘钥,同时将公钥证书发送给客户端,客户端收到之后并通过TLS进行解析验证,如果证书没有问题就会在客户端生成一个加密随机值,将随机值发送给服务端,服务端接收到之后,用自己的私钥解密,从而得到这个随机值,然后通过这个随机值对内容进行对称加密。服务端将用私钥加密后的信息发送给客户端,最后,客户端用之前生成的私钥来解密服务器端发过来的信息,获取解密后的内容

1)客户端向服务端发起HTTPS请求,用户在浏览器输入https网址,然后连接到Nginx server的443端口

2)服务端采用https协议有一套数字证书,该证书可以自行配置,也可以向证书管理组织去申请,该证书其本质是公钥和私钥

3)将公钥传送给客户端,证书包含了很多信息,例如,证书的颁发机构,过期时间等等

4)客户端解析证书,由客户端的TLS完成,首先会验证公钥是否有效,比如颁发的机构,过期时间等,如果发生异常,则会弹出警告信息,提示证书存在问题,如果证书没有问题,就会随机生成数值,然后用证书对该随机数值进行加密

5)将证书加密后的随机值传送到服务器,让服务器获取该随机值,后续客户端和服务端可以通过该随机值来进行加密解密

6)服务端用私钥解密后,得到了客户端传过来的随机值,然后把内容通过该值进行了对称加密

7)服务端将私钥加密后的信息发给客户端

8)客户端用之前生成的私钥来解密服务端发送过来的信息,获取解密后的内容

【证申请与颁发过程】

#可以通过openssl生成服务端的RSA秘钥以及证书

[root@Nginx-web ~]# openssl genrsa -des3 -out server.key 1024

#创建签名请求的证书CSR

[root@Nginx-web ~]# openssl req -new -key server.key -out server.csr

#加载SSL支持的Nginx并使用私钥去除 口令

[root@Nginx-web ~]# cp server.key server.keybak

[root@Nginx-web ~]# openssl rsa -in server.keybak -out server.key

#自动签发证书

[root@Nginx-web ~]# openssl x509 -req -days 10240 -in server.csr -signkey server.key -out server.crt

[root@Nginx-web ~]# yum install -y pcre-devel openssl-devel popt-devel

[root@Nginx-web ~]# useradd -M -s /sbin/nologin nginx
[root@Nginx-web ~]# tar zxvf nginx-1.11.2.tar.gz -C /usr/src/

[root@Nginx-web nginx-1.11.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module

 [root@Nginx-web nginx-1.11.2]# make

[root@Nginx-web nginx-1.11.2]# make install

[root@Nginx-web nginx-1.11.2]# ln -s /usr/local/nginx/sbin/nginx  /usr/local/sbin/

 1 worker_processes  1;
 2 events {
 3     worker_connections  1024;
 4 }
 5 http {
 6     include       mime.types;
 7     default_type  application/octet-stream;
 8     sendfile        on;
 9     keepalive_timeout  65;
10     server {
11         listen       80;
12         server_name  localhost;
13         location / {
14             root   html;
15             index  index.html index.htm;
16         }
17         error_page   500 502 503 504  /50x.html;
18         location = /50x.html {
19             root   html;
20         }
21     }

22 server {
23         listen        443 ssl;
24         server_name          localhost;
25         ssl_certificate      server.crt;
26         ssl_certificate_key  server.key;
27         ssl_session_cache    shared:SSL:1m;
28         ssl_session_timeout  5m;
29         ssl_ciphers  HIGH:!aNULL:!MD5;
30         ssl_prefer_server_ciphers  on;
31         location / {
32             root   html;
33             index  index.html index.htm;
34         }
35 }
36 }

如果仅仅是通过443端口访问Nginx web网站的话,那么配置文件如下(那么这个时候,你默认输入IP或者是域名是无法访问的,只能前面加上https)

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
server {
        listen        443 ssl;
        server_name          localhost;
        ssl_certificate      server.crt;
        ssl_certificate_key  server.key;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        location / {
            root   html;
            index  index.html index.htm;
        }
}
}

PS:配置完成之后这里就会有一个坑,报一下这个错,纠结了很久。。。其实当时看日志就可以知道,这是由于证书 的路径 错误~,我们将其拷贝到nginx的conf下面即可

 

[root@Nginx-web ~]# cp server.crt server.key /usr/local/nginx/conf/

 重启Nginx-web服务,可通过netstat或者ps -ef 验证是否启动

原文地址:https://www.cnblogs.com/bixiaoyu/p/9143633.html