Demandez à Nginx de rejeter les noms de serveurs inconnus via HTTPS

7

J'ai une instance Nginx utilisant SNI pour servir plusieurs domaines HTTPS à partir d'une seule IP.

Le seul problème avec la configuration est que Nginx répond avec le premier domaine (agissant par défaut) chaque fois qu'une URL pour l'IP nue du serveur, ou un domaine répertorié à cette IP pour lequel il n'y a pas de bloc de serveur HTTPS correspondant, est demandé. Dans ce cas, je préférerais de loin simplement renvoyer un 403 Forbidden standard - je configurerais un bloc serveur par défaut pour cela, mais je ne vois pas de moyen de contourner les avertissements de non-concordance des certificats clients.

(Comment c | C) et je configure Nginx pour rejeter les demandes vers de tels domaines inconnus / non définis sans avoir besoin de spécifier un certificat SSL particulier qui dérangera les navigateurs? (c'est-à-dire que j'ai besoin que Nginx rejette la demande avec un 403 avant de déranger le client avec un "mauvais" certificat - à partir du POV du client, cela devrait être identique au cas où aucun bloc serveur HTTPS n'est défini du tout.)

Carlton Gibson
la source

Réponses:

7

Cette question assez similaire à celle à laquelle j'ai répondu hier: nginx et SNI: est-il possible de résoudre automatiquement le certificat SSL par nom de domaine

Il n'est pas possible de rejeter la connexion avant que l'utilisateur ne voit un message de certificat incorrect dans son navigateur. Au moment où Nginx peut renvoyer une réponse HTTP 403, la négociation SSL est terminée et pour terminer la négociation, le navigateur doit accepter le certificat fourni. Vous ne pouvez rejeter la connexion qu'après que l'utilisateur a accepté le certificat en configurant un serveur par défaut:

server {
    listen 433 default_server ssl;
    ssl_certificate       common.crt;
    ssl_certificate_key   common.key;
    return 403;
}

Cependant, la plupart des navigateurs récents prennent en charge l'indication de nom de serveur et si vous avez un ensemble de certificats pour chaque vhost, il est peu probable qu'un utilisateur normal voit ce message.

Il peut être possible de rejeter des connexions sans nom d'hôte valide indiqué par SSL avec iptables, mais cela est probablement assez délicat et ne serait conforme à aucune norme.

Informations mises à jour: il est possible d' return 444interrompre la connexion TCP immédiatement avant qu'une erreur de certificat ne s'affiche.

xblax
la source
En utilisant SNI, vous pourriez théoriquement abandonner la connexion lorsqu'il n'y a pas de certificat pour le nom de domaine donné, ce qui serait encore mieux que d'afficher une erreur de certificat. Sais-tu comment faire cela?
Yogu
Oui, j'ai découvert qu'il était possible d' return 444interrompre la connexion TCP avant qu'une erreur de certificat ne s'affiche.
xblax du
@xblax Pourriez-vous également nous dire COMMENT renvoyer 444 avant qu'un certificat ne soit affiché? Idéalement, je ne gaspillerais pas les ressources d'une poignée de main pour une demande à un nom_serveur que je ne connais pas. SNI devrait révéler le nom demandé avant même de décrypter la demande.
Static Storm
0

Si vos domaines sont des sous-domaines du même maître (* .example.com), vous pouvez utiliser un certificat générique. À défaut, je ne pense pas que vous puissiez fournir une certitude dont le navigateur sera satisfait.

Chris Nava
la source
Salut chris. J'apprécie le point générique, mais ce n'est pas vraiment ce que je demande. Oui, le navigateur n'aimera aucun cert MAIS existe-t-il un moyen de rejeter la connexion en fonction du nom de serveur demandé? (Je soupçonne que non, mais cela semble être l'endroit à demander ... :)
Carlton Gibson
Hypothèse non testée -> Vous devrez fournir un certificat valide ou le navigateur considérera la connexion comme non sécurisée. Le navigateur n'agira donc sur aucune redirection que vous lui enverrez tant que l'utilisateur n'aura pas autorisé une dérogation. La seule façon dont je peux penser pour effectuer automatiquement le remplacement est de fournir un certificat valide. :-(
Chris Nava