HTTPS加密及本站免费SSL证书配置

互联网发展至今日,联网成为人们生活的一部分,网络安全变得越来越重要了。HTTP作为超文本传输协议,明文传输数据,客户端到服务器中间经过的任意第三方都可以拿到数据,经常出现的流量劫持,数据篡改,时不时的在你的网页里面加入广告代码,有些运营商为了利益就常做这些不耻行为。


那有没有办法预防这些,保证数据传输的安全呢,HTTPS就应运而生了。HTTPS其实是HTTP+SSL/TLS,而SSL是英文Secure Sockets Layer的缩写,中文叫安全套接层;TLS是后面由SSL改名而来的,英文名Transport Layer Security,中文叫传输层安全,说白了TLS和SSL是一个东西,其主要作用是为网络通信提供安全以及数据完整性的。
HTTPS是如何进行加密,解密,验证的,网上找到一个图,整个过程画的非常好,看下图

浏览器 / 客户端服务器ClientHello:TLS 版本、加密套件列表、随机数 Random1ServerHello:选定加密套件、随机数 Random2、下发证书(含公钥)校验证书链 → 生成 Pre-Master,用公钥加密后发送双方以 Random1/2 + Pre-Master 推导会话密钥,Finished 校验使用对称密钥加密的 Application Data非对称加密只用于协商密钥,真正传输数据用对称加密
HTTPS 握手:证书验证身份,非对称加密协商会话密钥,之后全部走对称加密。



引入HTTPS后,对保护数据安全性,防止流量劫持起到了积极的作用: 1、数据加密,用户发出的数据和接收到的数据都是经过加密的,第三方即使拿到,但由于加密无法看到原始内容,保证了数据安全性。 2、身份认证,保证了用户访问目标网站,在DNS劫持的情况下,由于访问目标发生改变,会提醒用户没有访问目标地址。 3、数据完整,无法篡改,更没法顶替,再也不用担心数据内容被第三方夹带“私货”了。
HTTPS是大势所趋,从HTTP转换为HTTPS后,数据安全得到保证的同时,会使得访问有所延迟,因为会增加一次SSL握手时间,同时购买SSL也需要成本。
鱼和熊掌岂能兼得,为了数据安全,为了保护隐私,牺牲一点性能也是值得的,同时也庆幸有免费的SSL供我们使用,比较著名的当属

Let's Encrypt

了,但它的证书有效期是三个月,每三个月都要续期一下。当然可以写个脚本,,在crontab配置好后,每月自动续期一下也可以的。
看国内腾讯云,阿里云都有免费的DV SSL证书,有效期是1年,均是和赛门铁克合作的

阿里云的证书服务里面有免费的可以选择,目前本站用的是腾讯云的免费SSL(https://console.qcloud.com/ssl),其中申请,校验域名,下载证书的步骤就省略了,腾讯官网也讲的比较清楚,获取到的公钥和私钥证书要妥善保存,上传到服务器上。

后续证书到期后,可以考虑用Let's Encrypt的证书尝试一下~
下面是本站SSL证书的Nginx中的配置,请参考

  server{
        listen 80;
        server_name www.18188.org;
        location / {
          rewrite (.*) https://www.18188.org$1 permanent;
        }
    }
    server {
        listen       443;
        server_name  www.18188.org;
        ssl on;
        charset utf-8;
        access_log           /data/logs/nginx/www.18188.org.log  main;
        ssl_certificate      /data/app/nginx/ssl/18188.org/1_www.18188.org_bundle.crt; #证书公钥文件路径
        ssl_certificate_key  /data/app/nginx/ssl/18188.org/2_www.18188.org.key;   #证书私钥文件路径
        ssl_prefer_server_ciphers on;         #优先使用我们服务端的加密套件
        ssl_session_cache         shared:SSL:10m;     #ssl/tls会话缓存的类型和大小10MB
        ssl_session_timeout       30m;  #30分钟session会话保持
        ssl_protocols             SSLv3 TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers               EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
        location / {
             proxy_pass         http://www18188orgServer;
             proxy_set_header   Host             $host;
             proxy_set_header   X-Real-IP        $remote_addr;
             proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }
    }

— 本文写于 2017 年 6 月 11 日,收录于《刘晓的博客》。转载请注明作者与出处。

刘晓

十余年一线研发与技术管理经验,关注高并发、分布式系统与中间件。 本文内容来自真实项目实践,如有偏颇,欢迎交流指正。

← 上一篇(更早)技术开发中过程跟踪的重要性

评论 0

评论区已随原站关闭,欢迎邮件交流:liuxiao.sh#gmail.com