J'ai un serveur Web avec de nombreux serveurs virtuels. Seul 1 d'entre eux est SSL. Le problème est, car il n'y a pas de bloc serveur catchall à l'écoute de SSL, toute demande https vers les autres sites est servie par le bloc 1 SSL.
Ma configuration ressemble essentiellement à ceci:
# the catch all
server {
listen 80 default;
# I could add this, but since I have no default cert, I cannot enable SSL,
# and this listen ends up doing nothing (apparently).
# listen 443;
server_name _;
# ...
}
# some server
server {
listen 80;
server_name server1.com;
# ...
}
# some other server ...
server {
listen 80;
server_name server2.com;
# ...
}
# ... and it's https equivalent
server {
listen 443;
ssl on;
server_name server2.com;
# ...
}
Maintenant qu'il n'y a pas d'écouteur par défaut pour 443, une requête comme celle- https://server1.com
ci finira par être servie par le server2.com
bloc https. Cela fait suite à la logique server_name
dans la documentation.
S'il n'y a pas de correspondance, un bloc de serveur {...} dans le fichier de configuration sera utilisé selon l'ordre suivant:
- le bloc serveur avec une directive d'écoute correspondante marquée comme [default | default_server]
- le premier bloc serveur avec une directive d'écoute correspondante (ou écoute implicite 80;)
Quelle est la solution préférée pour ce problème? Dois-je configurer un certificat factice pour mon bloc de serveur catch all juste pour pouvoir écouter sur 443 et gérer les mauvaises demandes? Y a-t-il un paramètre que je ne connais pas qui force une correspondance exacte avec le nom d'hôte server
?
Réponses:
Ni l'un ni l'autre n'est possible. La connexion d'un client qui va à https://foo.example.com/ ne peut pas être acceptée par autre chose qu'un certificat SSL avec "foo.example.com" comme l'un de ses noms. Il n'y a aucune possibilité de rediriger jusqu'à ce que la connexion SSL soit acceptée.
Si vous configurez chaque site pour SSL, un utilisateur qui clique sur l'erreur de certificat obtiendra le site demandé. Si vous configurez un site «catch all» pour SSL qui ne fournit qu'une page d'erreur et configurez l'hébergement virtuel basé sur le nom pour le seul site censé prendre en charge SSL, vous pouvez servir une page d'erreur aux clients.
L'hébergement virtuel SSL et HTTP ne fonctionne tout simplement pas bien ensemble.
la source
La seule façon de le faire est de créer un certificat SSL auto-signé et de l'utiliser pour prendre le contrôle des demandes https entrantes. Vous pouvez créer votre certificat SSL auto-signé en quelques étapes simples décrites dans cet article .
Supposons que vous créez un certificat auto-signé avec un nom de fichier server.crt. Vous devez ensuite ajouter les éléments suivants dans votre configuration nginx:
Vous obtiendrez toujours le message d'avertissement SSL du navigateur, mais au moins vous aurez le contrôle sur ce qui se passera ensuite.
la source
Ajoutez un bloc serveur fourre-tout et renvoyez le code d'état 444. Il indique à nginx de fermer la connexion avant d'envoyer des données.
la source
De nos jours, vous pouvez utiliser l'extension TLS Server Name Indication (SNI, RFC 6066). L'écouteur HTTPS pourra reconnaître le nom de domaine avant de servir le certificat approprié.
Cela signifie que vous devrez disposer de certificats pour TOUS vos domaines, et lorsque SNI est utilisé pour reconnaître l'un des autres domaines, vous pouvez simplement utiliser la redirection HTTP 301 vers la version HTTP non chiffrée, sauf si le nom du serveur correspond à celui qui a besoin chiffrement.
Plus d'informations sur SNI disponibles dans la documentation nginx http://nginx.org/en/docs/http/configuring_https_servers.html
la source
Mappez le nom d'hôte demandé sur des noms d'hôte valides dans le
http {}
bloc:Et puis dans le
server {}
bloc tuer les connexions avec le mauvais nom d'hôte:Utilisez plusieurs cartes si nécessaire pour plusieurs blocs de serveur. La connexion sera toujours établie à l'aide de l'un de vos certificats, mais si ce dernier bloc est présent dans chaque bloc serveur qui sert SSL, vous "bloquerez" efficacement les connexions avec des noms d'hôte invalides. Il peut être nécessaire uniquement dans le premier bloc serveur, mais l'ajouter à chaque bloc serveur garantira que l'ordre n'a pas d'importance.
La
$ssl_server_name
variable est présente dans nginx 1.7 ou supérieur.la source
Voici comment j'ai résolu le problème:
openssl req -nodes -x509 -newkey rsa:4096 -keyout self_key.pem -out self_cert.pem -days 3650
cp self*.pem /etc/nginx/ssl/
Qu'est-ce que cela va faire: il vous donnera un avertissement (sans contournement) sur tout serveur qui n'a pas son propre certificat, mais l'avertissement ne dira pas le mauvais nom de certificat. Si l'utilisateur clique sur "visiter quand même", il sera redirigé vers la version non ssl du site qu'il a tapé.
mise en garde :
si votre site compatible SLL définit uniquement
www.example.com
(et nonexample.com
), votre itinéraire fourre-tout finira par servirhttps://example.com
avec le certificat auto-signé et l'avertissement correspondant.la source
Rediriger vers http:
Retour 404:
la source