Nginx + Tomcat + HTTPS 配置原来不需要在 Tomcat 上启用 SSL 支持

标签: | 发表时间:2018-01-18 15:56 | 作者:
出处:https://zhuanlan.zhihu.com

之前在网上搜索到的很多文章在描述 Nginx + Tomcat启用 HTTPS 支持的时候,都必须在 Nginx 和 Tomcat 两边同时配置 SSL 支持。但我一直在想为什么就不能按照下面的方式来配置呢?就是 Nginx 上启用了 HTTPS,而 Nginx 和 Tomcat 之间走的却是普通的 HTTP 连接。但是搜索很多没有解决办法,最后还是老老实实的 Nginx 和 Tomcat 同时配置的 SSL 支持。


最近给 OSChina 买了个新的支持 *. http://oschina.net泛域名的证书,然后我又开始偷懒的想为什么 Tomcat一定要配 HTTPS 呢? 没道理啊。然后潜心搜索终于找到了解决方案。原来却是如此的简单。

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

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

Nginx这一侧的配置没什么特别的:

        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 这两项配置,其他的按正常配置。不过多了一个 proxy_set_header X-Forwarded-Proto https; 配置。

最主要的配置来自 Tomcat,下面是我测试环境中的完整 server.xml:

        <?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="443"
               proxyPort="443"/>

    <Engine name="Catalina" defaultHost="localhost">

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
            <Valve className="org.apache.catalina.valves.RemoteIpValve"
                  remoteIpHeader="x-forwarded-for"
                  remoteIpProxiesHeader="x-forwarded-by"
                  protocolHeader="x-forwarded-proto"
            />
            <Context path="" docBase="/oschina/webapp" reloadable="false"/>
      </Host>
    </Engine>
  </Service>
</Server>

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

文章来源:Nginx + Tomcat + HTTPS 配置原来不需要在 Tomcat 上启用 SSL 支持 - 开源中国

相关 [nginx tomcat https] 推荐:

Nginx + Tomcat + HTTPS 配置原来不需要在 Tomcat 上启用 SSL 支持

- -
之前在网上搜索到的很多文章在描述. Nginx + Tomcat启用 HTTPS 支持的时候,都必须在 Nginx 和 Tomcat 两边同时配置 SSL 支持. 但我一直在想为什么就不能按照下面的方式来配置呢. 就是 Nginx 上启用了 HTTPS,而 Nginx 和 Tomcat 之间走的却是普通的 HTTP 连接.

Nginx 安装 HTTPS 证书

- - idea's blog
基本步骤可以参考 这篇文章, 但这篇文章有一个致命错误, 就是没有安装 INTERMEDIATE CA, 照样会被浏览器显示证书不可信.. 生成 server.key.orig. 生成 server.csr 和 server.key. 拿着 server.csr 去证书厂商买证书. 买完后, 厂商会给你发两个证书 server.crt 和 server.intermediate.crt.

https单向/双向认证及tomcat配置https方法

- - 行业应用 - ITeye博客
https单向/双向认证及tomcat配置https方法. 1.单向认证,就是传输的数据加密过了,但是不会校验客户端的来源. 2.双向认证,如果客户端浏览器没有导入客户端证书,是访问不了web系统的,找不到地址. 如果想要用系统的人没有证书就访问不了系统的话,就采用双向. 使用keytool为Tomcat生成证书,假定目标机器的域名是“localhost”,keystore文件存放在“C:\OctopusStoreKey\SP2014.keystore”,口令为“123456”,使用如下命令生成:.

nginx 配置 https 的双向认证

- - 操作系统 - ITeye博客
SSL 的双向认证就是,客户端要获取服务端的证书,检查下服务端是不是我可以信任的主机,否则我就认为那个站点的内容不可信任,不应该去访问你(浏览器会告诉你),同时服务端也要检查客户端的证书,客户端如果不是服务端所信任的,那服务端也会认为,你不是我的合法用户,我拒绝给你提供服务. 所以,要让 HTTPS 的双向认证顺利完成,就要在服务端给定一个证书,这个证书是浏览器可信任的,同时客户端(浏览器)也要发送给服务端一个证书,服务器端也要信任这个证书.

Nginx+Tomcat+Memcached共享session集群配置

- ENOCH - ITeye论坛最新讨论
2、memcached共享session. 3、tomcat集群配置(3台CentOS 6). (172.18.188.64): 操作系统CentOS 6; 安装nginx、memcached和tomcat 6. (172.18.188.76): 操作系统CentOS 6; 安装tomcat 6. (172.18.188.78): 操作系统CentOS 6; 安装tomcat 6.

nginx+tomcat+redis完成session共享

- - 企业架构 - ITeye博客
本文记录nginx+redis+tomcat实现session共享的过程. nginx安装: http://blog.csdn.net/grhlove123/article/details/47834673. redis安装: http://blog.csdn.net/grhlove123/article/details/47783471.

nginx强制使用https访问的多种方法(http跳转到https)

- - C1G军火库
nginx强制使用https访问的多种方法(http跳转到https). 先说明一下HTTP跳转的状态码. 301 Moved Permanently:该方式将所有的 HTTP 请求重定向到 HTTPS 上,并且该重定向是永久性的. 客户端在收到 301 响应后,会自动将 HTTP 请求转为 GET 请求,同时将请求地址修改为重定向后的地址.

基于 Nginx 的 HTTPS 性能优化实践

- - 编程学习网
分享一个HTTPS优化案例(文章稍长. 随着相关浏览器对HTTP协议的“不安全”、红色页面警告等严格措施的出台,以及向 iOS 应用的 ATS 要求和微信、支付宝小程序强制 HTTPS 需求,以及在合规方面如等级保护对传输安全性的要求都在推动 HTTPS 的发展. 虽然 HTTPS 优化了网站访问体验(防劫持)以及让传输更加安全,但是很多网站主赶鸭子上架式的使用了 HTTPS 后往往都会遇到诸如:页面加载速度变慢、服务器负载过高以及证书过期不及时更新等问题.

centos下搭建nginx+tomcat实现集群负载与session复制

- - CSDN博客系统运维推荐文章
系统均选用最小化安装的centos 5.7. 客户端通过访问nginx做的负载均衡层去访问后端的web运行层(tomcat),如下图:. 另外,关于session复制原理,简单来说如下图:. 负载层:192.168.254.200. 安装:pcre、nginx、nginx-upstream-jvm-route-0.1.

Nginx+keepalived做双机热备加tomcat负载均衡

- - 开心平淡对待每一天。热爱生活
   Nginx+keepalived做双机热备加tomcat负载均衡. 一.Nginx配置. 1.安装Nginx所需pcre库. 2.安装Nginx. ./configure: error: SSL modules require the OpenSSL library.Centos需要安装openssl-devel Ubuntu则需要安装:sudo apt-get install libssl-dev.