Nginx

通過 cloudflare 在 nginx 網路伺服器上獲取 ERR_SSL_VERSION_OR_CIPHER_MISMATCH

  • April 20, 2018

我有一個 docker 基礎設施,包括

1 nginx 反向代理 1 nginx web 伺服器 1 php7.0 fpm 伺服器

nginx 反向代理和網路伺服器都使用相同的 docker 映像,但只是載入了不同的站點配置。

在反向代理上,它還提供靜態 javascript SPA 以及反向代理到為我的 api 提供服務的網路伺服器。

所以兩個 nginx 容器都執行相同的 /etc/nginx/nginx.conf

我的 ssl 配置是

##
# SSL Settings
##
ssl_stapling off;
ssl_session_timeout 1h;
ssl_session_tickets off;
ssl_stapling_verify off;
ssl_ecdh_curve secp384r1;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS;
ssl_certificate /srv/ssl/nginx-selfsigned.crt;
ssl_certificate_key /srv/ssl/nginx-selfsigned.key;
ssl_dhparam /srv/ssl/dhparam.pem;

我的反向代理站點配置是這樣的

server {

 listen 1025 ssl http2;
 listen [::]:1025 ssl http2;

 server_name api.site.com;

 location / {

   #include /etc/nginx/naxsi.rules;
   proxy_pass  https://td-api:1025;

   proxy_buffering on;
   proxy_buffers 256 16k;
   proxy_buffer_size 128k;
   proxy_read_timeout 300;
   proxy_intercept_errors on;
   proxy_max_temp_file_size 0;
   proxy_busy_buffers_size 256k;
   proxy_temp_file_write_size 256k;
   proxy_set_header Host $host;
   proxy_set_header Accept-Encoding "";
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-Proto $scheme;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 }
}

我的水療中心網站配置是

server {
   listen 1025 ssl http2;
   listen [::]:1025 ssl http2;

   server_name site.network;

   root /srv/agentfree-client/dist;

   limit_conn addr 10; 
   limit_req zone=one burst=15 nodelay;

   index index.html;

   autoindex off;

   location = /favicon.ico {
       log_not_found off;
       access_log off;
   }

   location = /robots.txt {
       allow all;
       log_not_found off;
       access_log off;
   }

   location / {
       if (!-e $request_filename){
           rewrite ^(.*)$ /index.html break;
       }
   }

   location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
       expires max;
       log_not_found off;
   }
}

我用於 api Web 伺服器的 nginx 配置是

server {

 listen 1025 ssl http2 default_server;
 listen [::]:1025 ssl http2 default_server;

 index index.php;

 root /srv/www/public;

 server_name api.site.com;

 limit_conn addr 10; 
 limit_req zone=one burst=15 nodelay;

 location / {
   #include /etc/nginx/naxsi.rules;  
   try_files $uri $uri/ /index.php?$query_string;
 }

 location ~ \.php$ {
   include snippets/fastcgi-php.conf;
   fastcgi_pass td-api-fpm:9000;
 }
}

我的 ssl 是自簽名並生成如下

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /srv/ssl/nginx-selfsigned.key -out /srv/ssl/nginx-selfsigned.crt

openssl dhparam -out /srv/ssl/dhparam.pem 2048

在此之前,我在關閉 tls1.3 beta 的情況下以完整模式執行 cloudflare ssl

當我載入靜態站點時,我得到了我的站點和 chrome 中漂亮的綠色 https

當我嘗試在我的 api 中點擊一條路線時,我遇到了這個錯誤

此站點無法提供安全連接

api.site.com 使用不受支持的協議。ERR_SSL_VERSION_OR_CIPHER_MISMATCH 隱藏詳細資訊 不支持的協議 客戶端和伺服器不支持通用 SSL 協議版本或密碼套件。

我在 ubuntu 16.10 上,docker 容器執行 16.10 我在 chrome 57.0.2987.110(官方建構)(64 位)中得到了這個我還在同一台機器和 ipad 上的 Firefox 中進行了測試。

如果我為 api url 繞過 cloudflare,我的網站會載入,儘管會出現自簽名 ssl 警告。

誰能解釋為什麼會發生這種情況,我為多個應用程序執行這個確切的設置沒有問題,但是這個 api 伺服器讓我發瘋

事實證明,您不能在免費計劃中使用帶有 ssl 的多級子域

引用自:https://serverfault.com/questions/852524