全站HTTPS第一篇:Nginx配置HTTPS

2018-01-28 03:20:38 +0000

网景公司在1994年创建了HTTPS,并应用在网景导航者浏览器中(也就是火狐浏览器的前身)。HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议。

HTTPS站点有什么优势?因为它采用加密传输方式,所以降低网站被劫持的风险,避免用户信息泄露。目前搜索引擎已经全面支持HTTPS抓取、收录,并且会优先展示HTTPS结果有利于SEO推广。另外,HTTPS绿锁表示可以提升用户对网站信任程度(显得高大上),可以有效防止山寨、镜像网站。最重要一点基础成本可控,证书及服务器已经有了成型的支持方案,并且各大云服务商提供免费的SSL证书。

考虑到这些Commsg将全面拥抱HTTPS。全站HTTPS有很多种方案,如Tomcat + HTTPS,或者Nginx/Apache + HTTPS 等。考虑到明年要上Tomcat集群,最终选定Nginx + HTTPS + Tomcat集群。HTTPS使用端口443,而不是像HTTP那样使用端口80来和TCP/IP进行通信,方案架构图如下。

 

                Nginx(监听443端口)       -----转发http请求----->       Tomcat(监听8080端口) 

 

下面开始演示Nginx如何配置HTTPS,并怎么将请求分发给Tomcat(Tomcat-2)。Tomcat集群的配置后面再分享。

 

1. 配置域名解析,将顶级域名和www二级域名同时解析到对应的服务器的IP地址。

A        @            47.92.73.114

A        www        47.92.73.114

 

2. 申请CA/SSL证书,我申请的是Symantec签发的免费版。

    你可以去阿里云或腾讯云等机构去注册账号,并申请。

    阿里云:https://wanwang.aliyun.com,登录控制台,进入产品服务->安全(云盾)-> CA证书服务(数据安全)菜单下申请。

    腾讯云:https://console.qcloud.com/ssl,登录控制台,进入云产品->域名服务-> SSL证书管理菜单下申请。

    一般签发免费证书只能对一个明细域名,以阿里云为例我填写的是一个三级域名www.commsg.com,当然你也可以填写其它的。

   申请完成后,便可以下载对应的CA(SSL)证书,这里下载的是Nginx版本的证书。压缩包里面有

      *.pem和*.key 两个文件,这里我们假设文件名分别是123456789.pem和123456789.key。

 

2. 安装Tomcat,我用的是免安装版本的apache-tomcat-9.0.4-windows-x64。

解压缩后打开conf/server.xml文件,在<Engine/>标签内增加Host配置,实现不带project名访问web project。

      <Host name="localhost" unpackWARs="true" autoDeploy="false">

        <Context path="" docBase="d:/apache-tomcat-9.0.4-windows-x64/commsgapp/commsgweb" debug="0" reloadable="false"/>

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="commsg_access_log" suffix=".txt"

              pattern="%h %l %u %t &quot;%r&quot; %s %b" />

      </Host>

   配置完成并启动Tomcat后在本机浏览器地址输入:http://localhost/  就可以访问commsgweb项目的首页,即可验证此配置成功。

 

3. 安装Nginx,解压Nginx到d:\nginx-1.12.2。

   a)新增d:/nginx-1.12.2/conf/cert目录,将申请的CA(SSL)证书和key文件放入;

           d:/nginx-1.12.2/conf/cert/123456789.pem

           d:/nginx-1.12.2/conf/cert/123456789.key

   

   b)让Nginx监听443端口,新增如下配置。一般证书提供商,都会有详细的文档告诉你如何进行配置,建议阅读。

下面配置是参考阿里云的文档并结合项目情况的配置。

server {

        listen      443 ssl;

        server_name  www.commsg.com;

        ssl on;

        ssl_certificate      d:/nginx-1.12.2/conf/cert/123456789.pem;

        ssl_certificate_key  d:/nginx-1.12.2/conf/cert/123456789.key;

        ssl_session_cache    shared:SSL:1m;

        ssl_session_timeout  5m;

        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECBHE:ECAH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

        ssl_prefer_server_ciphers  on;

        access_log d:/log/commsg.access.log;

        location / {

            proxy_set_header Host $host;

            proxy_set_header X-Real-Ip $remote_addr;

            proxy_set_header X-Forwarded-Proto $scheme;

            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_pass http://localhost:8080/;

            proxy_read_timeout 180s;

            break;

        }

    }

 

启动Nginx服务,访问 https://www.commsg.com,可显示首页则HTTPS配置成功。

 

如果运气好的话,截止这里配置基本完成。不幸的是因为服务器和网络环境的原因,可能还会遇到一些问题。例如 Nginx SSL + Tomcat集群,request.getScheme() 取不到正确的协议类型(HTTPS/HTTP),下一篇博客在说明。

 

全站HTTPS共3篇:

全站HTTPS第一篇:Nginx配置HTTPS

全站HTTPS第二篇:Nginx SSL集群中request.getScheme() 取不到HTTPS协议

全站HTTPS第三篇:Nginx 80端口自动转发到443端口