nginx(https)到tomcat(https)

时间:2015-03-02 21:28:52

标签: tomcat nginx https

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

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"

设置如下:

browser -> nginx(https) -> tomcat(https) /app

有了这个结果:

OK:   wget https://localhost:8443/app
FAIL: wget https://localhost/app

所以我可以直接进入tomcat https端口,但不能通过nginx代理。以下是我如何创建证书并设置tomcat和nginx。

Nginx的

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的

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
  • Darwin内核版本13。4。0:2014年8月17日星期日19:50:11 PDT; root:xnu-2422.115.4~1 / RELEASE_X86_64 x86_64
  • java 1.8.0_31

在Windows 8.1上进行相同的设置完全正常。

1 个答案:

答案 0 :(得分:0)

有些事情是错的:

首先,当我使用最新的ssl模块从源代码重建并纠正了一些错误时,我看起来似乎是一个有缺陷的nginx构建。

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

127.0.0.1    nginx.localhost.com tomcat.localhost.com

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

我从JRE cacerts和Mac的Keychains中删除了所有旧的localhost证书。然后启动了nginx和tomcat。然后使用safari访问网址https://nginx.localhost.comhttps://tomcat.localhost.com。 Safari会弹出一个证书对话框,然后点击show certificate,然后展开证书的Trust部分,然后选择&#34; Always Trust&#34; for&#34;使用此证书时#34;选项。然后单击信任证书按钮。这将在Macs Keychain中的浏览器中添加两个证书,这些证书位于&#39; login&#39;链

现在浏览器很开心,但我有两个tomcat webapps通过nginx相互通信,他们需要创建两个证书来验证他们连接的ssl主机名,所以我通过这样做将它们添加到Java cacerts文件中: / p>

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

openssl s_client -connect tomcat.localhost.com:8443

openssl s_client -connect nginx.localhost.com:443

并复制从此标记开始写入屏幕的证书&#39; ----- BEGIN CERTIFICATE -----&#39;并以此标记结尾----- ---- END CERTIFICATE -----&#39;

然后使用以下命令将这些服务器证书导入java cacerts文件:

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,现在一切正常。