web-dev-qa-db-fra.com

Nginx. Comment rejette-t-je la demande de serveur virtuel SSL non identifié?

J'ai un certificat SSL Wildcard et plusieurs sous-domaines sur la même adresse IP. Maintenant, je veux que mon Nginx gère uniquement les noms de serveurs mentionnés et rejeter la connexion des autres afin que cela ressemble à nginx _ ne fonctionne pas pour les noms de serveurs non cotés (ne répondant pas, rejetant, mort, pas un seul octet en réponse ). Je fais ce qui suit

ssl_certificate         tls/domain.crt;
ssl_certificate_key     tls/domain.key;

server {
  listen 1.2.3.4:443 ssl;
  server_name validname.domain.com;
  //
}

server {
  listen 1.2.3.4:443 ssl;
  server_name _;
  // deny all;
  // return 444;
  // return 404;
  //location {
  //  deny all;
  //}
}

J'ai presque tout essayé dans le dernier bloc serveur, mais pas de succès. Je reçois une réponse valide du serveur virtuel ou du code d'erreur connu. S'il vous plaît aider.

14
andbi

Cela ne fonctionne pas de cette façon: la poignée de main SSL arrive avant http, le nom du certificat sera donc évalué dans le navigateur avant de pouvoir rediriger ou faire autre chose à l'intérieur de la configuration Nginx.

7
cjc

La réponse de CJC a déjà signalé correctement le problème d'essayer de correspondre aux noms d'hôte lorsque SSL est activé. Cependant, il est possible de le faire, comme ceci:

server {
    ...

    if ($Host !~* ^validname\.domain\.com$ ) {
        return 444;
    }
    ...
}

Remarque: Oui, il est vrai qu'en général if est diabolique , mais il est prudent d'utiliser if dans ce cas. (Lisez la page liée si vous devez vous convaincre.)

Contrairement à ce qui a été suggéré, il suffit d'ajouter que le bloc suivant ne fonctionnera pas:

server {
    listen 80;
    listen 443 ssl;
    return 444;
}

parce qu'un certificat SSL correspondant à validname.domain.com ne correspond pas à un nom de domaine aléatoire. Je l'ai essayé et Nginx a agi comme le bloc n'était pas présent du tout.

Cela ne fonctionnera pas non plus:

server {
    listen       443;
    server_name    _;
    return 444; 
}

parce que cela fera chaque connexion HTTPS sur le port 443 échoue, même celles qui devraient passer. J'ai essayé celui-ci aussi. wget a signalé une erreur SSL Handshake.

14
Louis

J'ai mis en œuvre la solution ci-dessus aujourd'hui et cela a fonctionné à l'endroit. Toutes les URL non spécifiées sont abandonnées, maintenant. Placer ce code de serveur avant que la saisie du serveur virtuel réelle a été la clé - toutes les URL formées mal à la fois, passez à ce serveur 'Par défaut'.

... 
server {
     listen       443;
     server_name    _;
     return 444; }

server {
     listen       443;
     server_name  [URL]
1
david sexton

Vous devriez être capable de gérer cela en rendant le serveur qui gère les éléments non enregistrés le premier bloc de serveur dans votre config.

http {
    ...

    server {
        listen 80;
        listen 443 ssl;
        return 444;
    }

    server {
        server_name validname.domain.com;
        ...
    }
}

Tous les domaines non spécifiquement identifiés seront traités par ce bloc serveur.

0
Dayo