nginx 反向代理到谷歌云功能?

nginx 反向代理到谷歌云功能?

到目前为止已尝试,但无法从其端点获得有效响应(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;

相关内容