欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

SSL在NGINX的配置方法实践无需修改tomcat和程序配置

程序员文章站 2022-04-20 08:42:32
...
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/17334669
nginx与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教程有兴趣的朋友有所帮助。