代码改变世界

Nginx下配置SSL证书 调转到IIS、tomcat二级站点

2017-12-26 10:10  Commander lang  阅读(4994)  评论(0编辑  收藏  举报

最近由于客户需要,购买了商业SSL证书需要配置!  

由于我的网站主域名是部署在IIS下,所以先讲解下IIS下的配置过程; 后面由于二级域名的系统在tomcat下,所以又将SSL迁移到了Nginx下!

整体结构如下图:

  

先百度两个名词概念(具体可以另行查阅):

HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer):是以安全为目标的HTTP通道;用于安全的HTTP数据传输!HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)!HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL!它只能确保你的数据从客户端发送到服务端的传输过程是安全的,并不能保障你的服务器安全性!

SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密

SSL证书:SSL证书是数字证书的一种,因为配置在服务器上,也称为SSL服务器证书。

ssl证书分类

扩展验证型(EV:Extended Validation SSL)SSL证书

组织验证型(OV:Organization Validation SSL)SSL证书

域名验证型(DV:Domain Validation SSL)SSL证书

我们买的是OV版 通配型 即支持二级域名使用!

 

先看下https和ssl证书的展现效果:

 

 

当网站使用SSL证书时,客户端会自动识别 出现 安全锁标识!告诉你这是个可信任站点!

 

 

这里可以看到 SSL证书的加密算法为强度256位的RSA非对称加密!并可以看到证书的使用者、颁发者、有效期等相关的信息!

 

具体的配置过程

由于是购买的商业证书,所以要配合代理商完成证书申请,并按照要求完成域名验证!最终会下发SSL证书文件及密钥文件

代理商会将各种环境下的文件都给你:

 

 

一、IIS下配置SSL证书

先看下IIS下的证书文件:

 

 

是一个后缀为.pfx的 微软平台下的 包含公钥和私钥的证书文件!

 

1):进入Windows管理控制程序:开始->cmd->MMC/MMC.exe

2):在打开的控制台窗口中:文件->添加/删除管理单元

3):在新窗口的左边 可用的管理单元 中 选择 “证书” 点击添加 ;在新弹出的窗口中选择 “计算机账户”

  

 

完成后 ,点击确定,返回主控制台;

4):在 主控制台中 根节点下 选择 证书->个人->证书 右键 ->所有任务->导入!

 

 

在弹出的证书导入向导中 点击下一步 选择 供应商提供给你的 .pfx文件!点击 下一步 填写你的私钥密码!

 

完成后 主控制台的个人证书 里面会包含你的证书!

 

5): IIS域名绑定控制

  

 

 

在IIS对应的站点下,添加绑定,选择https填写你的域名后,选择刚才添加的SSL证书;点击完成既可!

 

至此你的SSL证书在IIS中就配置完成了!

 

值得注意的是 https默认的端口为443端口,需要防火墙设置并在外网映射此端口;

 

 

二:nginx下配置SSL证书 跳转到IIS站点

 最后由于我向通过nginx反向代理到网站 并配置SSL证书,所以过程如下!

1:关闭IIS中配置的 80、443 两个端口的绑定;只保留一个内网端口绑定!

2:从nginx官网下载最新的 安装文件!可以参考其它的配置手册;

下载地址:http://nginx.org/en/download.html

 

  关于nginx版本的选择: 这里默认推荐最新版本的nginx-1.12.2版本,但是由于客户很多是使用IE8的群体,但是nginx1.11.0之后的版本不支持SSL证书的 3DES弱安全配置;所以我这里选择了 1.10.3的版本!

 

3:将供应商提供的 xxx.key 和 xxx.crt 文件拷贝到 nginx的 conf配置文件目录下

然后配置nginx.conf配置文件; 其它参照默认配置,此处增加 https server;

#门户网站HTTPS配置

server {

    listen 443;

    server_name www.xxxdomain.com;

    ssl on;

    ssl_certificate _.xxxdomain.com_bundle.crt;

    ssl_certificate_key _.xxxdomain.com.key;

 

    ssl_session_cache shared:SSL:1m;

    ssl_session_timeout 5m;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    ssl_ciphers ECDH:AESGCM:HIGH:RSA+3DES:!RC4:!DH:!MD5:!aNULL:!eNULL;

    ssl_prefer_server_ciphers on;

 

    location / {

        proxy_redirect off;

        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_pass http://192.168.1.35:88;

        client_max_body_size 1000m;

    }

}

 

 

此配置为支持xp系统下ie8的https访问; 若抛弃xp系统下的ie8可 使用最新的nginx版本 并配置ssl_ciphers如下:

ssl_ciphers AWSGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;

 

注意此时一定要检查80、443端口的防火墙开启情况!在入站规则中进行配置!

 

4:nginx将http请求强制转到https地址

在nginx中 增加server如下:

#http请求强行转到https

server {

    listen 80 default_server;

    server_name www.xxxdomain.com xxxdomain.com;

    rewrite ^/(.*) https://$server_name$request_uri? permanent;

}

 

三:nginx配置https跳转到tomcat二级域名站点

  因为使用了nginx作为代理,所以为了简单部署就没有在tomcat上部署ssl证书了!由nginx和用户建立链接,并完成ssl握手,然后将请求以http协议转发给tomcat;tomcat响应内容通过nginx进行ssl加密返回给客户端!

  按照nginx的配置,增加以下server内容:

server {
    listen 443;
    server_name AA.xxxdomain.com;
    ssl on;
    ssl_certificate _.xxxdomain.com_bundle.crt;
    ssl_certificate_key _.xxxdomain.com.key;

    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDH:AESGCM:HIGH:RSA+3DES:!RC4:!DH:!MD5:!aNULL:!eNULL;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme; 
        proxy_pass http://192.168.1.32:8181;
    }
}
    

  

tomcat配置

在tomcat的server.xml 的 Engine 模块下配置一个 Value:

<Engine name="Catalina" defaultHost="localhost">

    <Valve className="org.apache.catalina.valves.RemoteIpValve"

        remoteIpHeader="X-Forwarded-For"

        protocolHeader="X-Forwarded-Proto"

        protocolHeaderHttpsValue="https" />

</Engine>

#X-Forwarded-For 获得实际用户的 IP

#X-Forwarded-Proto 识别实际用户发出的协议是 http 还是 https    

这样配置后就可以通过https方式访问二级域名站点了;https://AA.xxxdomain.com

 

部署过程中遇到的问题:

1):http的js,css 等静态资源被浏览器拦截无法访问

因为通过代理 模式,tomcat无法区分用户是通过https还是http访问的!默认使用了http响应了静态资源,就出现了无法访问的现象!

解决方法:tomcat 和nginx 双方都增加配置X-Forwarded-Proto ;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;#实际用户的 IP

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #实际用户的 IP

proxy_set_header X-Forwarded-Proto $scheme; #实际的协议 http还 https

这些配置可以保障代码中request对象能够获取到用户的真实请求信息

 

2):端口使用问题

需要tomcat中配置redirectPort、proxyPort为443端口;如果使用非443端口则需要在上面的Value中增加httpsServerPort指定端口

<Connector port="8181" protocol="HTTP/1.1"

    connectionTimeout="20000"

    redirectPort="443"

    proxyPort="443" />

<Engine name="Catalina" defaultHost="localhost">

<Valve className="org.apache.catalina.valves.RemoteIpValve"

    remoteIpHeader="X-Forwarded-For"

    protocolHeader="X-Forwarded-Proto"

    protocolHeaderHttpsValue="https" httpsServerPort="443"/>

    如果非443端口 需要添加httpsServerPort 指定对应端口

</Engine>

 

3):nginx upstream timed out 问题

在部署好之后,系统可以访问,但是非常慢,需要几十秒,但是http返回状态仍然是200!

错误日志:

upstream timed out (10060: A connection attempt failed because the connected party did not properly respond after
a period of time, or established connection failed because connected host has failed to respond)
while reading response header from upstream, client: 115.193.163.195, server: AA.domain.com,
request: "POST /dataTrans/translogList HTTP/1.1", upstream: "http://[::]:8181/dataTrans/translogList",
host: "AA.domain.com", referrer: "https://AA.domain.com//dataTrans/index"

 

查了下具体是因为:nginx配置代理地址:proxy_pass http://localhost:8181;windows 把 localhost 解析为 ipv6 地址 ::1 用于本地回路测试了,所以会导致超时,如果使用ipv4的地址,速度就可以了!

将 proxy_pass http://localhost:8181; 改为 proxy_pass http://127.0.0.1:8181;

 

至此所有站点HTTPs部署完毕