到目前为止已尝试,但无法从其端点获得有效响应(ssl 握手失败)
server {
listen 443 ssl;
server_name xxx;
ssl on;
ssl_certificate /etc/letsencrypt/live/xxx/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/xxx/privkey.pem;
ssl_session_timeout 24h;
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'xxx';
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
resolver 127.0.0.1;
add_header Strict-Transport-Security max-age=31536000;
ssl_dhparam /xxx/dhparam.pem;
location / {
proxy_pass https://us-central1-project_id.cloudfunctions.net;
}
}
得到以下内容:
... peer closed connection in SSL handshake while SSL handshaking to upstream...
使用 openssl () 获取 enpointopenssl s_client -connect us-central1-project_id.cloudfunctions.net:443
将返回以下内容:
CONNECTED(00000003)
139669452420760:error:140790E5:SSL routines:ssl23_write:ssl handshake failure:s23_lib.c:177:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 305 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : 0000
Session-ID:
Session-ID-ctx:
Master-Key:
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1493734932
Timeout : 300 (sec)
Verify return code: 0 (ok)
---
我真的不知道如何分析这样的回应
通常设置这样的反向代理(到 SSL 端点)是否需要特定设置?还是只是 Google 阻止用户进行此类使用?
答案1
您需要为 nginx 提供一些客户端凭据,以便它能够进行 SSL 握手。没有默认设置;您需要明确提供这些。
与 Google API 本身交互可能需要做更多事情,可能需要使用 Bearer 令牌进行身份验证和其他标头操作。您可能需要操作标头,因此请准备花一些时间找出此 API 的标头需要是什么样子,并确保这就是您要发送的内容。
转发标头时,添加underscores_in_headers on
到您的服务器块以避免发送无效标头。
总结一下,这是此类事情的基本配置:
server {
...
# Server ssl directives
...
# Avoid sending invalid headers
underscores_in_headers on;
...
location / {
proxy_pass https://us-central1-project_id.cloudfunctions.net/;
# Client SSL certificate
proxy_ssl_certificate /etc/nginx/my_client.pem;
proxy_ssl_certificate_key /etc/nginx/my_client.key;
# Header configurations for google API
proxy_pass_request_headers on;
proxy_set_header Authorization: Bearer [bearer-id];
}
}
答案2
为了将 proxy_pass 传递到 google cloud (gcp) 函数,您必须告诉 nginx(Nginx 版本 1.7+)在您的位置块中使用以下指令来使用 SNI:
proxy_ssl_server_name on;
proxy_ssl_name $proxy_host;
为了调用谷歌云功能,你必须指定信噪比因为该函数不驻留在静态 IP 地址上。默认情况下,Nginx 不会将 SNI 信息发送到上游。
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_server_name
答案3
这是对我有用的解决方案。
用你的 URL 替换 SUBDOMAIN.DOMAIN.COM
proxy_set_header Host SUBDOMAIN.DOMAIN.COM;
proxy_ssl_server_name on;