通过 cloudflare 在 nginx 网络服务器上获取 ERR_SSL_VERSION_OR_CIPHER_MISMATCH

use*_*509 3 ssl nginx https cloudflare docker

我有一个码头基础设施,包括

1 个 nginx 反向代理 1 个 nginx 网络服务器 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;
Run Code Online (Sandbox Code Playgroud)

我的反向代理站点配置是这样的

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

我的水疗中心站点配置是

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我用于 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

我的 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
Run Code Online (Sandbox Code Playgroud)

在此之前,我然后在关闭 tls1.3 beta 的情况下以完整模式运行 cloudflare ssl

当我加载静态站点时,我会在 chrome 中得到我的站点和一个漂亮的绿色 https

当我尝试在我的 api 中点击一条路线时,我遇到了这个错误

此站点无法提供安全连接

api.site.com 使用不受支持的协议。ERR_SSL_VERSION_OR_CIPHER_MISMATCH HIDE DETAILS 不支持的协议 客户端和服务器不支持通用的 SSL 协议版本或密码套件。

我在 ubuntu 16.10 上,docker 容器在 16.10 上运行,我在 chrome 57.0.2987.110(官方版本)(64 位)中得到了这个我也在同一台机器和 ipad 上的 firefox 中进行了测试。

如果我为 api url 绕过 cloudflare,我的网站会加载,尽管带有自签名 ssl 警告。

谁能解释为什么会发生这种情况,我可以毫无问题地为多个应用程序运行这个确切的设置,但是这个 api 服务器让我发疯

use*_*509 10

原来你不能在免费计划中使用带有 ssl 的多级子域