作者:LYJ189_163 | 来源:互联网 | 2017-05-13 02:18
SSL方案:
1、NGINX做ssl握手,其与TOMCAT之间仍旧HTTP协议(当NGINX和TOMCAT在同一相对安全的内网时这样做可以减少SSL握手次数)。NGINX的代理转发(proxy_redirect:反向替换proxy_pass或上游,如TOMCAT返回的URL),从HTTP的替换成HTTPS。可包括多条proxy_redirect配置。注意端口号如需要替换也要写入。
2、NGINX强制将接收到的HTTP请求rewrite为HTTPS
3、NGINX做优化方案,包括keepalive_timeout,开启ssl的session缓存。
4、TOMCAT和项目代码及配置文件(目前)不需要变更。
5、需要注意的是,程序从HTTP头部获取的信息,包括HTTPS协议,端口号,客户IP等,数据是正确的。但,若用request.getScheme();(HTTP or HTTPS)request.isSecure();(是否安全,boolean)request.getRequestURL().toString();(URL,带协议名)request.getRemoteAddr();(客户IP地址)等,获取则是错误的,request的信息有nginx转发到tomcat,并未做替换处理,因此获取到的都是nginx的信息,如有需要,在tomcat的server.xml设置一个valve。
-------------------------
nginx配置:
(1)、自定义配置文件,放置于/etc/nginx/conf.d文件夹下,xxx.conf
(2)、引入该文件nginx/nginx.conf文件的http模块最后加入include /etc/nginx/conf.d/*.conf
(3)、nginx.conf文件中做ssl优化配置,http模块最后加入
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
(4)、自定义配置文件xxx.conf中做如下配置:
#HTTP server
server {
#监听端口
listen 80;
#监听域名/IP
server_name abc.e-lingcloud.com;
#请求的重定向,该功能的含义及用法请搜索rewrite,该命令可添加在server、location、if模块下。
#本例由于要求转发所有80的http请求,因此rewrite放置于server模块下,且location已注销。
rewrite ^(.*) https://$host$1 permanent;
#location / {
# proxy_pass http://192.168.1.111:8080;
# proxy_set_header Host $host;
# proxy_redirect http://192.168.1.111:8080 http://abc.e-lingcloud.com:59998;
# 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_set_header Upgrade $http_upgrade;
# proxy_set_header Connection "upgrade";
#}
}
#HTTPS server
server {
#监听HTTPS默认端口443
listen 443;
#开启SSL
ssl on;
#监听域名/IP
server_name abc.e-lingcloud.com;
#HTTPS(若不在SSL的模块内,该命令默认为HTTP保持连接的时长)保持连接的时长,单位秒。具体用法自行搜索。
keepalive_timeout 70;
#SSL证书(公钥),证书生成方法参考购买证书的网站说明,本例中的证书来自于Godaddy,该证书包括中间证书和发给自己的证书。
ssl_certificate /etc/ssl/private/e-lingcloud.crt;
#SSL私钥,该私钥通常在申请证书前生成。记得备份文件。需要注意的是,私钥非常重要,不可泄露,需要存放在访问受限的文件中,当然,nginx主进程必须有读取密钥的权限。私钥和证书可以存放在同一个文件中。
ssl_certificate_key /etc/ssl/private/e-lingcloud.key;
location / {
proxy_pass http://192.168.1.111:8080;
#代理重定向,作用是将上游服务器返回链接中的第一个参数替换为第二个参数。此处比较重要,tomcat和程序不做任何特定配置的话(如tomcat新加valve将http头信息赋到request中),上游服务器(如tomcat)将返回http协议及其链接,用此处重定向为https和指定的服务器域名返回给客户端。
proxy_redirect http://abc.e-lingcloud.com https://abc.e-lingcloud.com;
proxy_redirect https://192.168.1.111:8443 https://abc.e-lingcloud.com;
proxy_redirect http://192.168.1.111:8080 https://abc.e-lingcloud.com;
#以下为nginx转发给tomcat的时候,将数据加到http头信息中。具体参数含义和变量的用法请搜索。
proxy_set_header Host $host:$server_port;
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_set_header Upgrade $http_upgrade;
#proxy_set_header Connection "upgrade";
}
-----------------------------------------
资料链接及其说明:
nginx的一些配置,需要注意,有错误的地方。
http://blog.csdn.net/na_tion/article/details/17334669nginx与tomcat之间传递http,使用request.getScheme()取到的仍为http,需要注意,个人建议程序里别用request.getScheme,而是取http头部信息,用该文章提供的方案需要侵入tomcat做配置。
http://feitianbenyue.iteye.com/blog/2056357与第二条资料配合,tomcat官网关于valve参数的API。告诉你配置的这几项作用是什么。
http://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/valves/RemoteIpValve.html与第二条资料配合,第二条资料的灵感出处。需要注意的地方同第二条。
http://han.guokai.blog.163.com/blog/static/136718271201211631456811/
以上就介绍了SSL在NGINX的配置方法实践无需修改tomcat和程序配置,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。