• 谈谈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 验证是否启动

  • 相关阅读:
    程序员保持快乐活跃的6个好习惯(转)
    Spring MVC Hello World Example(转)
    Oracle定时执行存储过程(转)
    各种常见数据库分页实现(转)
    Linux SSH常用总结(转)
    让人深思......
    void及void指针含义的深刻解析
    UVa 11988
    网络编程学习小结
    Deep Learning(深度学习) 学习笔记(四)
  • 原文地址:https://www.cnblogs.com/bixiaoyu/p/9143633.html
Copyright © 2020-2023  润新知