Question Routines SSL: SSL23_WRITE: échec de l'établissement de liaison SSL, nginx sur CentOS 7


Tout d’abord, qu'est-ce que j'ai:

OpenSSL 1.0.1e-fips 11 Feb 2013
nginx version: nginx/1.6.2
CentOS Linux release 7.0.1406 (Core)

et, à des fins de test, un certificat auto-signé:

openssl req -x509 -sha256 -newkey rsa:2048 -keyout private_key.pem -out certificate.pem -days 365
openssl rsa -in private_key.pem -out certificate_key.pem
openssl dhparam -out dhparam.pem 4096

Donc, le problème est le suivant: lorsque j'ouvre test.example.com dans un navigateur, j'obtiens ERR_CONNECTION_RESET. Dans le journal des erreurs nginx, je vois ce qui suit:

2015/02/07 03:18:34 [error] 27951#0: *17 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: my.computers.ip.address, server: 0.0.0.0:443

ma /etc/nginx/nginx.conf -

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user  nginx;
worker_processes  1;

error_log  /path/error_log.log;
#error_log  /var/log/nginx/error.log  notice;
#error_log  /var/log/nginx/error.log  info;

pid        /run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /path/access_log.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    index index.php index.html index.htm;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        listen       443 default ssl;
        server_name  localhost;
        root         /usr/share/nginx/html;

        #charset koi8-r;

        #access_log  /var/log/nginx/host.access.log  main;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        # redirect server error pages to the static page /40x.html
        #
        error_page  404              /404.html;
        location = /40x.html {
        }

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
        }
    }
}

ma /etc/nginx/conf.d/test.example.com.conf -

upstream php-handler {
  server 127.0.0.1:9000;
  #server unix:/var/run/php5-fpm.sock;
  }

server {
  listen 80;
  server_name test.example.com;
  # enforce https
  return 301 https://$server_name$request_uri;
  }

server {
  listen 443 ssl;
  server_name test.example.com;

  ssl on;
  ssl_certificate_key /path/certificate_key.pem;
  ssl_certificate /path/certificate.pem;

  ssl_ciphers 'AES128+EECDH:AES128+EDH:!aNULL';

  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_session_cache shared:SSL:10m;

  ssl_stapling on;
  ssl_stapling_verify on;
  resolver 8.8.4.4 8.8.8.8 valid=300s;
  resolver_timeout 10s;

  ssl_prefer_server_ciphers on;
  ssl_dhparam /path/dhparam.pem;

  add_header Strict-Transport-Security max-age=63072000;
  add_header X-Frame-Options DENY;
  add_header X-Content-Type-Options nosniff;

  # Path to the root of your installation
  root /usr/share/owncloud/;
  # set max upload size
  client_max_body_size 10G;
  fastcgi_buffers 64 4K;

  rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;
  rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;
  rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;

  error_page 403 /core/templates/403.php;
  error_page 404 /core/templates/404.php;

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

  location ~ ^/(?:\.htaccess|data|config|db_structure\.xml|README){
    deny all;
    }

  location / {
   # The following 2 rules are only needed with webfinger
   rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
   rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

   rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;
   rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;

   rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;

   try_files $uri $uri/ /index.php;
   }

   location ~ \.php(?:$|/) {
   fastcgi_split_path_info ^(.+\.php)(/.+)$;
   include fastcgi_params;
   fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
   fastcgi_param PATH_INFO $fastcgi_path_info;
   fastcgi_param HTTPS on;
   fastcgi_pass php-handler;
   }

   # Optional: set long EXPIRES header on static assets
   location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
       expires 30d;
       # Optional: Don't log access to assets
         access_log off;
   }

  }

Si je commente tous les problèmes liés à SSL de la seconde server bloquer, commenter en entier server bloquer et mettre listen 80; en deuxième bloc, alors cela fonctionne et donc je conclus que le problème est lié à SSL.

C'est ainsi que j'ai commencé à rechercher des cas similaires. Parmi la douzaine de questions que j'ai vérifiées ici, la paire suivante semble être particulièrement pertinente:

  1. Routines SSL: SSL23_WRITE: échec de l'établissement de liaison ssl 
  2. Échec de la prise de contact OpenSSL

De la première question, j'ai compris que je devrais essayer d'exécuter openssl s_client -connect test.example.com:443 et openssl s_client -tls1 -connect test.example.com:443.

Pour le premier, le résultat est:

[user@server nginx]# openssl s_client -connect test.example.com:443
CONNECTED(00000003)
140140897699744: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 249 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---

Pour ce dernier, le résultat est:

[user@server nginx]# openssl s_client -tls1 -connect test.example.com.com:443
CONNECTED(00000003)
140133453146016:error:1409E0E5:SSL routines:SSL3_WRITE_BYTES:ssl handshake failure:s3_pkt.c:598:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 0 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : 0000
    Session-ID:
    Session-ID-ctx:
    Master-Key:
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    Start Time: 1423271541
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
---

Compte tenu de ces réponses, ainsi que des informations des deux questions énumérées et de quelques autres questions, ainsi que de certaines questions mentionnées ailleurs, j'ai conclu comme suit:

  • J'ai peut-être une version OpenSSL avec un bug.
  • J'ai peut-être mal configuré mon SSL. En particulier, j'ai peut-être mal agi avec les cyphers.
  • J'ai peut-être rencontré une forme d'incompatibilité.

À partir de là, étant donné que la migration vers un autre serveur ou l'effacement du serveur pour le reconstruire avec un autre système d'exploitation n'est pas viable, je pense que j'ai les options suivantes:

  • Mettez à niveau OpenSSL sur mon serveur, par exemple, récemment publié 1.0.2. La question est la compatibilité et comment le faire - je semble avoir la dernière version d'OpenSSL à trouver sur repos je suis conscient de.
  • Installez en quelque sorte la deuxième étape OpenSSL, si c’est le cas possible, ou une alternative OpenSSL, s’il en existe une.
  • Désactivez le cryptage, qui n'est pas une solution de production viable à long terme.

Qu'est-ce que j'ai raté, j'espère? Si tout va bien, puisque je préfère éviter l'une des solutions assez radicales que j'ai proposées.


5
2018-02-07 01:28


origine


On dirait que vous suivez ce tutoriel. Bien qu’elle soit par ailleurs excellente, vous devriez envisager d’utiliser la liste de chiffrement avec compatibilité ascendante, du moins pour les tests. Assurez-vous également que vous avez installé toutes les mises à jour disponibles pour CentOS. - Michael Hampton♦
Les chiffrements à compatibilité ascendante ne résolvent malheureusement pas le problème central. «Terminer la configuration» est un conseil très vague sans spécifier la configuration à laquelle vous vous associez.
Vous pouvez commencer par poster votre réel configuration de nginx. :) - Michael Hampton♦
Voilà, complet nginx.conf et test.example.com.conf.
Eh bien, tout ce que je peux vous donner à ce stade est le vote positif. :) - Michael Hampton♦


Réponses:


Résolu en commentant les lignes

    listen       80 default_server;
    listen       443 default ssl;

dans nginx.confpour qu'ils deviennent

    #listen       80 default_server;
    #listen       443 default ssl;

1
2018-02-07 03:03



Ok, et quelle est la raison, pourquoi devez-vous désactiver le listen commandes? - sebix
Je ne parle pas assez bien nginx pour expliquer pourquoi exactement cela a fonctionné pour moi, mais il semblerait que ssl les écoutes du fichier principal ont interféré avec celles du fichier spécifique à l'application.


J'obtenais "aucun certificat ssl n'est défini dans l'écoute du serveur sur le port SSL lors de l'établissement du protocole SSL", aussi. Dans mon cas, l'explication était beaucoup plus simple: je faisais "service nginx start" au lieu de "service nginx restart". Doh!


0
2018-04-27 23:09



Vous répondez à une autre question. - Deer Hunter
C'est une réponse au premier problème de l'OP: "aucun certificat ssl n'est défini dans l'écoute du serveur sur le port SSL pendant l'établissement du protocole SSL". J'essaie juste d'aider les gens qui recherchent ce message d'erreur sur Google. - HostedMetrics.com