Nginx:服务器端SSL配置

一、nginx配置

upstream  tomcats_ssl
        {
              server   192.168.33.10:8090 srun_id=tomcat01; 
              server   192.168.33.11:8090 srun_id=tomcat02;
              jvm_route $cookie_JSESSIONID|sessionid reverse;      
              #保证session同步,参考http://hanqunfeng.iteye.com/blog/1920994
              #需要cas验证的应用更要配置,否则会造成死循环。
        }

server {  
        listen 443;  
        server_name nginx.server.name;  
  
        ssl on;   #开启ssl验证
        ssl_certificate /usr/local/nginx/sslkey/server.crt;  #证书
        ssl_certificate_key /usr/local/nginx/sslkey/server.key;   #密钥
        ssl_session_timeout 5m;  #session有效期,5分钟
        ssl_protocols SSLv2 SSLv3 TLSv1;   #ssl协议
        ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; #ssl加密算法
        ssl_prefer_server_ciphers on;  
        location /ssl_test/ {
                proxy_pass http://tomcats_ssl;
                include /usr/local/nginx/proxy.conf;
                access_log  /usr/local/nginx/logs/01.ssl.log  main;
        }    
}

二、生成证书(这里是测试证书)

[root@localhost sslkey]# openssl req -new -x509 -nodes -out server.crt -keyout server.key

三、测试

重启nginx,请求:https://nginx.server.name/ssl_test,普通应用即可成功打开。

四、需要cas验证的应用

如果后端应用是需要cas登录验证的,则在成功登录cas回调后端服务器时会发生https协议转换为http协议,同时端口443转换为80的情况,导致应用不可正常访问,

例如https://nginx.server.name/ssl_test被cas回调后变为http://nginx.server.name/ssl_test,

目前的解决方案是,在后端服务的tomcat的server.xml中增加如下配置:

将
<Connector port="8090" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" URIEncoding="UTF-8" />
修改为:
<Connector port="8090" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               scheme="https" proxyName="nginx.server.name"  proxyPort="443"
               redirectPort="8443" URIEncoding="UTF-8" />

 scheme

调用request.getScheme()时返回的协议名称。比如,在SSL Connector上可能将这个属性设为“https”。缺省值为“http”。

proxyName

如果connector在代理配置中使用,将这个属性设置成调用request.getServerName()时返回的服务器名称。

proxyPort

如果Connector在代理配置中使用,这个属性指定了调用request.getServerPort()返回的端口值。

在Tomcat位于代理服务器后面时,可以使用proxyName和proxyPort属性。这些属性修改了调用 requset.getServerName()和request.getServerPort()的返回值,用来构造重定向的绝对URL。如果不设置这 些值,返回值反映了代理服务器收到的连接的服务器名称和端口号,而不是客户端发起的服务器名称和端口号。

五、client&&server双向SSL配置

 参考了网上的资料:

http://blog.csdn.net/rosw/article/details/3441187

http://www.linuxidc.com/Linux/2012-11/75130.htm(亲测,见附件)

不过只有Google(双击证书)和Firefox(导入时要选择“您的证书”)浏览器可以通过验证,IE(IE10)虽然成功导入证书,但仍提示证书错误。

相关推荐