首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nginx (https)到tomcat (https)

nginx (https)到tomcat (https)
EN

Stack Overflow用户
提问于 2015-03-02 21:28:51
回答 1查看 2.1K关注 0票数 0

让https nginx服务器连接到tomcat实例(也使用https )有困难。Nginx将此写入错误日志:

代码语言:javascript
复制
2015/03/02 23:15:34 [error] 20074#0: *11 SSL_do_handshake() failed (SSL: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol) while SSL handshaking to upstream, client: 127.0.0.1, server: localhost, request: "GET /app/ HTTP/1.1", upstream: "https://127.0.0.1:8443/app/", host: "127.0.0.1"

设置如下:

代码语言:javascript
复制
browser -> nginx(https) -> tomcat(https) /app

有了这个结果:

代码语言:javascript
复制
OK:   wget https://localhost:8443/app
FAIL: wget https://localhost/app

因此,我可以直接访问webapp,直接转到tomcat端口,而不是由nginx代理。下面是我如何创建证书和安装tomcat和nginx。

Nginx

代码语言:javascript
复制
Create the private server key:
    sudo openssl genrsa -des3 -out server.key 2048

Create a certificate signing request (common name set to localhost):
    sudo openssl req -new -key server.key -out server.csr

Remove the password:
    sudo cp server.key server.key.org
    sudo openssl rsa -in server.key.org -out server.key

Sign your SSL Certificate:
    sudo openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Edit nginx.conf to add this:
    server {
        listen       80;
        listen       443 ssl;
        server_name  localhost;

        ssl_certificate      server.crt;
        ssl_certificate_key  server.key;
        ssl_verify_client off;
        ssl_trusted_certificate tomcat.crt;
        ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;

        location / {        
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-Proto https;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_pass      https://127.0.0.1:8443;
        }
    }

Tomcat

代码语言:javascript
复制
Create a local self-signed Certificate:
    keytool -genkey -alias tomcat -keyalg RSA -keystore localhost.keystore

Edit server.xml config to add this:

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
           maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
           clientAuth="false" sslProtocol="TLS" keystoreFile="localhost.keystore" 
           keystorePass="password0" proxyPort="443" proxyHost="localhost"/>

这是在Mac上安装的

  • apache-tomcat-8.0.18
  • nginx/1.7.10
  • 达尔文内核版本13.4.0: Sun 8月17日19:50:11 PDT 2014;根:xnu-2422.115.4~1/ReleaseX86_64 x86_64
  • java 1.8.0_31

在Windows8.1上做同样的设置非常好。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-04 02:10:27

有几件事是错的:

首先,当我用最新的ssl模块从源代码中重建时,我得到了一个似乎是错误的nginx构建,并且纠正了一些错误。

其次,如果为nginx和tomcat创建了两个不同的证书,那么尝试使用localhost作为主机名是个坏主意。相反,我为tomcat和nginx添加了一些FQDN到/private/etc/host(在Mac上)

代码语言:javascript
复制
127.0.0.1    nginx.localhost.com tomcat.localhost.com

然后,我使用nginx证书和tomcat证书的公共名称“nginx.localhost.com”和“tomcat.localhost.com”重新创建了nginx和tomcat的证书。在tomcat步骤中记住当提示输入姓名时使用'tomcat.localhost.com‘(因为这实际上是公共名称字段,应该是主机或ip地址)。

我从JRE仙人掌和Mac的密钥链中删除了所有旧的本地主机证书。然后开始使用nginx和tomcat。然后使用safari访问urls https://nginx.localhost.comhttps://tomcat.localhost.com。Safari弹出一个证书对话框,然后单击“显示证书”,然后展开证书的“信任”部分,然后为“使用此证书”选项选择“始终信任”。然后单击“信任证书”按钮。这将在“登录”链下为Mac密钥链中的浏览器添加两个受信任的证书。

现在浏览器很高兴,但是我有两个tomcat webapps通过nginx互相交谈,他们需要创建两个证书来验证他们连接到的ssl主机名,所以我通过这样做将它们添加到Java仙人掌文件中:

通过运行以下命令获取tomcat和nginx服务器证书

代码语言:javascript
复制
openssl s_client -connect tomcat.localhost.com:8443

openssl s_client -connect nginx.localhost.com:443

并复制写到屏幕上的证书,从这个标签开始?开始证书?然后在这个标签中结束??结束证书?

然后使用以下方法将这些服务器证书导入java仙人掌文件:

代码语言:javascript
复制
sudo keytool -import -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/security/cacerts -file tomcat.localhost.com -alias tomcat.localhost.com 

sudo keytool -import -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/security/cacerts -file nginx.localhost.com -alias nginx.localhost.com 

重新启动nginx和tomcat,现在一切都正常了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28819767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档