nginx: Comment empêcher qu'un bloc de server SSL nommé exactement agisse comme le catch pour tous les SSL

J'ai un server Web avec de nombreux servers virtuels. Seulement 1 dont SSL. Le problème est, car il n'y a pas de bloc de server catchall en écoute de SSL, toute request https vers les autres sites est desservie par le 1 bloc SSL.

Ma configuration, essentiellement, ressemble à ceci:

# the catch all server { listn 80 default; # I could add this, but since I have no default cert, I cannot enable SSL, # and this listn ends up doing nothing (apparently). # listn 443; server_name _; # ... } # some server server { listn 80; server_name server1.com; # ... } # some other server ... server { listn 80; server_name server2.com; # ... } # ... and it's https equivalent server { listn 443; ssl on; server_name server2.com; # ... } 

Maintenant, il n'y a pas d'auditeur par défaut pour 443, une request comme https://server1.com finira par être desservie par le bloc https server2.com . Ceci suit la logique du server_name dans les documents.

S'il n'y a pas de correspondance, un bloc de server {…} dans le file de configuration sera utilisé en fonction de l'ordre suivant:

  1. le bloc server avec une directive d'écoute correspondante marquée comme [default | default_server]
  2. le premier bloc de server avec une directive d'écoute correspondante (ou écoute implicite 80;)

Quelle est la solution privilégiée pour ce problème? Est-ce que je dois configurer le cert mannequin pour que je capture tous les blocs du server afin de pouvoir écouter 443 et gérer les mauvaises requests? Y at-il un paramètre dont je ne suis pas conscient qui force une correspondance de nom d'hôte exacte avec le server ?

Idéalement, je voudrais que nginx ne serve plus à https, à less que le nom d'hôte ne corresponde ou qu'il redirige vers HTTP sur le même hôte.

Il n'est pas possible non plus. La connection d'un client qui va à https://foo.example.com/ ne peut être acceptée par un certificate SSL avec "foo.example.com" comme l'un de ses noms. Il n'y a pas de possibilité de redirect jusqu'à ce que la connection SSL soit acceptée.

Si vous configurez chaque site pour SSL, un user qui clique sur l'erreur du certificate obtiendra le site qu'il a demandé. Si vous configurez un site "attraper tous" pour SSL qui fournit uniquement une page d'erreur et configurez l'hébergement virtuel basé sur les noms pour un seul site qui est censé prendre en charge SSL, vous pouvez envoyer une page d'erreur aux clients.

L'hébergement virtuel SSL et HTTP ne fonctionne pas bien set.

La seule façon de faire est de créer un certificate SSL auto-signé et de l'utiliser pour prendre le contrôle des requests https entrantes. Vous pouvez créer votre certificate SSL auto-signé en quelques étapes simples décrites dans cette publication .

Disons que vous créez un certificate auto-signé avec un nom de file de server.crt. Vous ajoutez ensuite ce qui suit dans votre configuration nginx:

 server { listn 443; ssl on; ssl_certificatee /etc/nginx/ssl/server.crt; ssl_certificatee_key /etc/nginx/ssl/server.key; server_name server1.com; keepalive_timeout 60; rewrite ^ http://$server_name$request_uri? permanent; } 

Vous recevrez toujours le message d'avertissement SSL du browser, mais au less vous aurez le contrôle de ce qui se passe ensuite.

Rediriger vers http:

 server { listn 443; server_name *.com; rewrite ^ http://$host$request_uri? permanent; } 

Retour 404:

 server { listn 443; server_name *.com; return 404; }