首页 > 解决方案 > Nginx 服务器使用 SSL 连接到 Java Spring

问题描述

我有 2 个 Docker 容器,一个带有使用 SSL(443) 的 nginx,一个带有 Java/spring api,它也需要在 HTTPS(8443) 上公开。

我从前端证书转换的 java 证书并创建了一个 .p12 证书,使用如下:

server:
    port: 8443
    ssl:
        key-store: certificate.p12
        key-store-password: 123456
        key-store-type: PKCS12

这是 nginx.conf:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    server {
        listen 80;

        location /api {
            proxy_pass https://app.site.com:8443;
        }

        location /signin {
            proxy_pass https://app.site.com:8443;
        }

        location /social/signup {
            proxy_pass https://app.site.com:8443;
        }

        server_name app.competithor.com;
        return 301 https://$server_name$request_uri;
      }
    server {
        listen 443 ssl;

        ssl on;
        ssl_certificate /etc/ssl/app.site.com.crt;
        ssl_certificate_key /etc/ssl/app.site.com.key;

        ssl_session_timeout 5m;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;

        server_name  localhost;

        root   /usr/share/nginx/html;
        index  index.html index.htm;
        include /etc/nginx/mime.types;

        gzip on;
        gzip_min_length 1000;
        gzip_proxied expired no-cache no-store private auth;
        gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        location / {
            try_files $uri $uri/ /index.html;
        }

        location /api {
            proxy_pass https://app.site.com:8443;
            proxy_ssl_protocols TLSv1.2;
            proxy_ssl_name $host;
            proxy_ssl_server_name on;

            proxy_set_header  Host              $host;
            proxy_set_header  X-Real-IP         $remote_addr;
            proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
            proxy_set_header  X-Forwarded-Proto $scheme;
            proxy_pass_header Authorization;
        }

        location /signin {
            proxy_pass https://app.site.com:8443;
            proxy_ssl_protocols TLSv1.2;
            proxy_ssl_name $host;
            proxy_ssl_server_name on;

            proxy_set_header  Host              $host;
            proxy_set_header  X-Real-IP         $remote_addr;
            proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
            proxy_set_header  X-Forwarded-Proto $scheme;
            proxy_pass_header Authorization;
        }

        location /social/signup {
            proxy_pass https://app.site.com:8443;
           proxy_ssl_protocols TLSv1.2;
           proxy_ssl_name $host;
           proxy_ssl_server_name on;

           proxy_set_header  Host              $host;
           proxy_set_header  X-Real-IP         $remote_addr;
           proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
           proxy_set_header  X-Forwarded-Proto $scheme;
           proxy_pass_header Authorization;
        }
    }
}

我总是有这个错误:[error] 6#6: *4 SSL_do_handshake() failed (SSL: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure) 当 SSL 握手到上游

我在 nginx 和 java config 中尝试了许多设置,但同样的错误。有人知道这种握手/连接如何工作吗?

更新: java 应用程序是 Maven,我应该在 mvnw 文件中配置密钥库吗?

UPDATE2:openssl s_client -connect localhost:8443 返回:CONNECTED(00000003)

140514309248664:错误:14077410:SSL 例程:SSL23_GET_SERVER_HELLO:sslv3 警报握手失败:s23_clnt.c:769:

没有可用的对等证书

未发送客户端证书 CA 名称

SSL 握手已读取 7 个字节并写入 305 个字节

新,(NONE),密码是 (NONE) 不支持安全重新协商 压缩:NONE 扩展:NONE 没有 ALPN 协商 SSL-会话:协议:TLSv1.2 密码:0000 会话 ID:会话 ID-ctx:主密钥: Key-Arg : 无 PSK 身份: 无 PSK 身份提示: 无 SRP 用户名: 无 开始时间: 1549049020 超时: 300 (sec) 验证返回码: 0 (ok)

标签: javaspringsslnginxhttps

解决方案


推荐阅读