Nginx(Https) + Tomcat 启用 Https(SSL) 支持

   在搭建之前我们先了解一些https相关的名词:

   TLS:传输层安全协议 Transport Layer Security的缩写
   SSL:安全套接字层 Secure Socket Layer的缩写
   TLS与SSL对于不是专业搞安全的开发人员来讲,可以认为是差不多的,这二者是并列关系,详细差异见 http://kb.cnblogs.com/page/197396/
    KEY 通常指私钥。
   CSR 是Certificate Signing Request的缩写,即证书签名请求,这不是证书,可以简单理解成公钥,生成证书时要把这个提交给权威的证书颁发机构。
   CRT 即 certificate的缩写,即证书。
   X.509 是一种证书格式.对X.509证书来说,认证者总是CA或由CA指定的人,一份X.509证书是一些标准字段的集合,这些字段包含有关用户或设备及其相应公钥的信息。
   X.509的证书文件,一般以.crt结尾,根据该文件的内容编码格式,可以分为以下二种格式:
   PEM - Privacy Enhanced Mail,打开看文本格式,以"-----BEGIN..."开头, "-----END..."结尾,内容是BASE64编码.Apache和*NIX服务器偏向于使用这种编码格式.

   DER - Distinguished Encoding Rules,打开看是二进制格式,不可读.Java和Windows服务器偏向于使用这种编码格式

    OpenSSL 相当于SSL的一个实现,如果把SSL规范看成OO中的接口,那么OpenSSL则认为是接口的实现。接口规范本身是安全没问题的,但是具体实现可能会有不完善的地方,比如之前的"心脏出血"漏洞,就是OpenSSL中的一个bug.

   参考地址:https://www.cnblogs.com/lan1x/p/5872915.html

    针对nginx搭载tomcat做负载均衡环境下启用https方案,网上很多解决方案是在nginx和tomcat版本两边同时启用https支持,这个比较麻烦,我在想能不能nginx启用https,而tomcat不启用?

     经过一段时间搜索,终于找到了一种解决方案,大家可以参考下,亲测可用:

方案:浏览器和 Nginx 之间走的 HTTPS 通讯,而 Nginx 到 Tomcat 通过 proxy_pass 走的是普通 HTTP 连接。

    下面是详细的配置(Nginx 端口 80/443,Tomcat 的端口 8080):

 nginx的nginx.conf配置:

upstream tomcat {
    server 127.0.0.1:8080 fail_timeout=0;
}
 
# HTTPS server
server {
    listen       443 ssl;
    server_name  localhost;
 
    ssl_certificate      /Users/winterlau/Desktop/SSL/oschina.bundle.crt;
    ssl_certificate_key  /Users/winterlau/Desktop/SSL/oschina.key;
 
    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;
 
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;
 
    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-Proto https;
        proxy_redirect off;
        proxy_connect_timeout      240;
        proxy_send_timeout         240;
        proxy_read_timeout         240;
        # note, there is not SSL here! plain HTTP is used
        proxy_pass http://tomcat;
    }
}

关键说明:

ssl_certificate 和 ssl_certificate_key 这两项配置服务器https证书。

proxy_set_header X-Forwarded-Proto https:正确地识别实际用户发出的协议是 http 还是 https

tomcat的配置文件server.xml:



  
    
 
    
 
      
        

 
            
      
    
  

特别特别注意的是必须有 proxyPort="443",这是整篇文章的关键,当然 redirectPort 也必须是 443。同时  节点的配置也非常重要,否则你在 Tomcat 中的应用在读取 getScheme() 方法以及在 web.xml 中配置的一些安全策略会不起作用


参考文章:SSL证书与Https应用部署小结 

参考文章: Nginx + Tomcat + HTTPS 配置原来不需要在 Tomcat 上启用 SSL 支持




你可能感兴趣的:(https,nginx,Tomcat)