web-dev-qa-db-ja.com

アップストリームApacheへのNginx接続:再ネゴシエーションハンドシェイクが失敗しました

リバースプロキシとして使用される新しいNginxサーバーを構成しています。 Apacheが稼働している古いDebianサーバーがあります。このApacheサーバーには、プロキシの背後に隠したいHTTPSのみのアクセス権を持つサイトがあります。

プロキシからアップストリームApacheへの接続はHTTPS経由である必要があります(サーバーは異なる場所にあり、ApacheはHTTPSアクセスのみを許可します)。

私の問題は、NginxからApacheへの接続が失敗することです。 HTTPSを介したブラウザからアップストリームへの通常の接続は問題なく機能します。同じプロキシからNginxアップストリームへの接続が機能します。 NginxがアップストリームApache接続に接続しようとすると、次のように失敗します再ネゴシエーションハンドシェイクに失敗しました

プロキシNginx(デバッグレベル)からのログには、次のようにしか書かれていません。

2016/04/07 15:51:08 [error] 5855#0: *1 upstream prematurely closed connection while reading response header from upstream, client: 94.113.97.9, server: procrastination.com, request: "GET / HTTP/1.1", upstream: "https://77.240.191.234:443/", Host: "procrastination.com"

アップストリームApacheからのログ:

[Thu Apr 07 15:36:48 2016] [info] Initial (No.1) HTTPS request received for child 35 (server procrastination.com:443)
[Thu Apr 07 15:36:48 2016] [debug] ssl_engine_kernel.c(421): [client 83.167.254.21] Reconfigured cipher suite will force renegotiation
[Thu Apr 07 15:36:48 2016] [info] [client 83.167.254.21] Requesting connection re-negotiation
[Thu Apr 07 15:36:48 2016] [debug] ssl_engine_kernel.c(764): [client 83.167.254.21] Performing full renegotiation: complete handshake protocol (client does support secure renegotiation)
[Thu Apr 07 15:36:48 2016] [info] [client 83.167.254.21] Awaiting re-negotiation handshake
[Thu Apr 07 15:36:58 2016] [error] [client 83.167.254.21] Re-negotiation handshake failed: Not accepted by client!?

プロキシでのNginxサイトの構成:

server {
  listen 80;
  listen 443 ssl;

  server_name procrastination.com *.procrastination.com;

  ###
  # SSL
  ###
  ssl  on;
  ssl_certificate         /etc/ssl/localcerts/procrastination.com/fullchain.pem;
  ssl_certificate_key     /etc/ssl/localcerts/procrastination.com/privkey.pem;

  ##
  # Logging Settings
  ##
  access_log /var/log/nginx/procrastination_proxy-access.log;
  error_log /var/log/nginx/procrastination_proxy-error.log debug;


  include /etc/nginx/snippets/common;
  include /etc/nginx/snippets/proxy_params;

  location / {
    proxy_pass https://brigita_https;
    proxy_ssl_name $Host;
  }
}

プロキシ上のnginx.confのSSL関連部分:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

アップストリームでのApacheサイト構成:

<VirtualHost 77.240.191.234:80>
  ServerName procrastination.com
  ServerAlias *.procrastination.com
  DocumentRoot /var/www/procrastination-production/build/current/www
  php_value newrelic.appname /var/www/procrastination-production/build/current/www

  RewriteEngine On
  RewriteCond %{HTTPS} !=on
  RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [L]

</VirtualHost>


<VirtualHost 77.240.191.234:443>
  ServerName procrastination.com
  ServerAlias *.procrastination.com
  DocumentRoot /var/www/procrastination-production/build/current/www
  php_value newrelic.appname /var/www/procrastination-production/build/current/www

  SSLEngine On
  SSLCertificateFile /etc/Apache2/ssl/ssl_procrastination_com.crt
  SSLCertificateKeyFile /etc/Apache2/ssl/ssl_procrastination_com.key

  RewriteCond %{HTTP_Host} !^www\..*$
  RewriteRule (.*) https://www.%{HTTP_Host}%{REQUEST_URI} [L]

</VirtualHost>

他のApache設定値はデフォルトです。

何が原因である可能性があり、どこでより多くの診断データを探すべきかについて何か考えはありますか?

解決しました!

問題はApacheアップストリームのSNIにありました。 Nginxは正しいパラメーターを渡さず、Apacheは彼に間違った証明書を送信しました。

設定する必要がありますproxy_ssl_server_name on Nginx構成で。

変更するだけです:

  location / {
    proxy_pass https://brigita_https;
    proxy_ssl_name $Host;
  }

に:

  location / {
    proxy_pass https://brigita_https;
    proxy_ssl_name $Host;
    proxy_ssl_server_name on;
  }