java - 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)
解决方案
推荐阅读
- join - Apache Flink:我们可以从窗口连接应用函数中获取 windowStartTime 和 windowEndTime 吗?
- gatling - Gatling tryMax 即使重试成功也报错
- css - :nth-child (或类似)公式仅在存在少于三个子元素时才隐藏 div (需要是 CSS)
- c++ - 无法在不敏感的情况下比较字符串/字符(错误 - 未找到方法)
- pandas - Pandas:如何根据多个条件创建新列?
- reactjs - 使用 Touch API 和 Drag API 拖放
- python - python 3.8中字典的pop操作
- elasticsearch - 自动更新 IndexFormat Serilog
- javascript - 通过JS添加类无法正常工作
- amazon-web-services - 使用 AWS Amplify 反应本机身份验证 - 登录时的 Hub.Listen 行为不一致