Nginx下配置SSL证书 调转到IIS、tomcat二级站点
2017-12-26 10:10 Commander lang 阅读(5240) 评论(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部署完毕