zoukankan      html  css  js  c++  java
  • 让你的网站免费支持 HTTPS 及 Nginx 平滑升级

    为什么要使用 HTTPS ?

    首先来说一下 HTTP 与 HTTPS 协议的区别吧,他们的根本区别就是 HTTPS 在 HTTP 协议的基础上加入了 SSL 层,在传输层对网络连接进行加密。简单点说在 HTTP 协议下你的网站是光着身子在奔跑,但到了 HTTPS 下你穿了一件衣服,别人看不到你的肌肉了(当然,这好像不是好事,不重要),更安全了一点点,就大概这个意思。
    SSL 依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。采用 HTTPS 的服务器必须从证书颁发机构 CA(Certificate Authority)申请一个用于证明服务器用途类型的证书,当然一般都有收费,而且不便宜,其实你也可以通过 OpenSSL 自己造一个证书,这样有一个弊端是大家都不信任你造的证书。那怎么办?

    你必须知道的步骤

    通过上面的简单介绍你应该知道了,要想你的网站支持 HTTPS ,就必须有一个被信任的证书,那这个证书就必须由证书颁发机构(如VeriSign、Microsoft等)颁发的,否则你就会遇到如打开 12306.cn 这样的您的连接不是私密连接的尴尬。
    12306.cn.png

    你肯定不想用户打开后,你的网站是上面这样的,身边有好多朋友买票时问过我这是什么意思?我都没办法解释给他们,哎。所以你需要要有下面几个东西:

    • 一个域名(你肯定有)
    • Web 服务器(Nginx,Apache,IIS都行)
    • SSL 证书(最好 CA 机构颁发的)

    就完了,上面三个东西可能最麻烦就是搞到一个被全世界都信任的证书了,没关系,现在我试着让你免费获取一个,注意是免费!!!
    提供免费的证书商也就那么几个,最知名的可能是 StartSSL ,其他我还知道 Let's Encrypt ,不过这里我用的是国内腾讯云的。

    感谢腾讯云

    对于得到一个受信任的证书很简单,找第三方证书颁发机构购买就行了,但是一个每年大几千的证书费用对于小企业或个人来说,有点接受不了,或者是没钱。现在好了,腾讯云认证用户可以申请到赛门铁克(Symantec)免费的 TrustAsia DV SSL 证书了。

    登录腾讯云管理平台
    SSL 证书申请地址在这里: https://console.qcloud.com/ssl ,点击申请证书,会弹出下面的框:
    申请证书.png

    上面显示什么价值1900元/年,不要管,点击确认按钮。弹出表单你填写你要绑定的域名就行了:
    申请1.png

    接下来会验证你的域名,简单说就是验证一下这个域名是不是你的,所以你要在域名解析添加一条 CName 记录,实在不懂的话,官方也有怎么添加的文档。
    cname.png

    一般验证过程会很快,几个小时吧,申请通过后,这时候你看到状态是已颁发后,就能下载证书了。
    证书详情-完成.png

    下载下来你打开文件会看到Nginx,Apache,IIS三个文件夹,里边放的就是对应各个服务器的证书。到这里,整个证书申请流程就算完了,接下来就是配置 Web 服务器来支持网站的 HTTPS 访问了。我这里用的 Nginx 演示。

    Nginx 平滑升级以支持 HTTPS

    要想让 Web服务器支持 HTTPS ,首先你的服务器肯定要支持 SSL ,所以我们先检查 Nginx 是否支持 SSL :

    /usr/local/nginx/sbin/nginx -V
    

    arguments.png

    通过命令显示信息,我们看configure arguments中是否有 -with-http_ssl_module字样,如果像我这样没有的话,你就需要重新编译 Nginx 以支持 SSL 了。如果有,请跳过这步骤,直接看Nginx 配置 HTTPS 服务那一节。

    安装 Nginx 可能大家都会,不会的可以看 从零开始学 Java - CentOS 下安装 Nginx ,但是平滑升级 Nginx 可能你没有体验过,这样说吧,在线上服务器环境下,你要支持 HTTPS 访问,但是你发现你的 Nginx 不支持 SSL ,你肯定不能卸载 Nginx 重新安装时加载 SSL 模块,因为那是线上服务器。你只能在现有安装的 Nginx 下进行无痛升级以以支持 SSL ,这就用到了 Nginx 的 平滑升级 概念。

    找到你之前安装 Nginx 时的编译目录,如果你和我一样找不到或许删除了,那我们就需要重新下载一个 Nginx 了,当然我们是通过 wget 方式,看命令:

    wget -c https://nginx.org/download/nginx-1.10.1.tar.gz
    tar -zxvf nginx-1.10.1.tar.gz
    cd nginx-1.10.1
    

    配置,加入 SSL 模块:

    ./configure --with-http_ssl_module
    make
    

    configure.png

    注意,千万不能在像安装的时候make install了,因为我们这是升级。

    备份原 Nginx 执行脚本

    mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
    

    把新版本 Nginx 编译脚本放到可执行文件目录下

    cd objs/
    cp nginx /usr/local/nginx/sbin/
    

    mv_cp.png

    进行平滑升级,命令:

    make upgrade
    

    upgrade.png
    这时候会输出这些信息:

    /usr/local/nginx/sbin/nginx -t
    nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
    nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
    kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
    sleep 1
    test -f /usr/local/nginx/logs/nginx.pid.oldbin
    kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`
    

    没问题之后接下来,查看现在目前版本及安装模块:

    /usr/local/nginx/sbin/nginx -V
    

    nginx-v.png
    看到已经从 1.4.6 版本升级到了 1.10.1,而且这种升级不影响正常访问的。线上环境操作也是可以的。

    Nginx 配置 HTTPS 服务

    编辑配置文件:

    cd /usr/local/nginx/conf
    vim nginx.conf
    

    拉到最下面,会看到 HTTPS 配置被注释掉了。嗯,这是模板,我们就在这配置。

    Nginx_Conf.png

    文字版:

    server {
        listen       443 ssl;
        server_name  www.domain.com;
    
        ssl on;
        ssl_certificate 1_www.domain.com_bundle.crt;
        ssl_certificate_key 2_www.domain.com.key;
    
        ssl_session_timeout  5m;
    
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers  ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers  on;
    
        location / {
            root   html;
            index  index.html index.htm;
        }
    }
    

    把上面的ssl_certificatessl_certificate_key替换成你下载下来的证书存放路径就行,记着下载下来的证书这种配置是放在/usr/local/nginx/conf目录下的,当然你也可以随意放。

    这时候,你就可以打开浏览器访问一下试试了。正常情况 HTTPS 请求是打不开的,因为我们还没设置防火墙,记得要开放443端口!,嗯,设置过防火墙就可以正常访问了吧。

    其实到这里,这个服务器支持 HTTPS 请求流程已经结束了,但是你发现好多人在浏览器地址栏输入域名的时候都不输入http://https://的,因为浏览器会自动帮我们加上http://的,所以,这时候输入我们刚刚设置的域名其实还是没有走https://请求,那怎么让就是输入http://也走HTTPS呢?

    很简单,Nginx 中这样配置就行啦!

    server {
        listen  80;
        server_name  www.domain.com;
    
        rewrite ^(.*)$  https://$host$1 permanent;
    }
    

    我们利用rewrite 来做跳转。监听到80端口的 HTTP 请求后,就转发到 HTTPS ,当然还有好多处理方式。

    总结一下

    这篇文章讲了一下怎么申请免费的 HTTPS 证书,然后利用 Nginx 服务器来配置 HTTPS 请求访问,并其中顺手平滑升级 Nginx,如丝般顺滑的升级,不影响正常访问。HTTPS 方式的传输对我们网站来说应该是提高了一些安全性的,况且这种方式又很简单,可以试着搞一搞。

  • 相关阅读:
    mac c++编译出现segmentation fault :11错误
    ssh 连接缓慢解决方法
    237. Delete Node in a Linked List
    203. Remove Linked List Elements
    Inversion of Control Containers and the Dependency Injection pattern
    82. Remove Duplicates from Sorted List II
    83. Remove Duplicates from Sorted List
    SxsTrace
    使用CCleaner卸载chrome
    decimal and double ToString problem
  • 原文地址:https://www.cnblogs.com/mafly/p/https_nginx.html
Copyright © 2011-2022 走看看