Nginx not loading different certs on two hosts

Maxim Dounin mdounin at mdounin.ru
Thu Dec 10 14:42:16 UTC 2020


Hello!

On Wed, Dec 09, 2020 at 11:34:38PM +0200, Nikolaos Milas wrote:

> Hello,
> 
> On a Centos 7 with nginx-1.18.0 I have configured two vhosts, as follows:
> 
> First one:
> 
> server {
> 
>      listen [::]:80 ipv6only=off;
> 
>      listen    443 ssl http2 default deferred;
>      listen    [::]:443 ssl http2 default deferred;
> 
>      server_name  site1.world.example.com;
> 
>      ssl_certificate     /etc/pki/tls/certs/star_world.crt;
>      ssl_certificate_key /etc/pki/tls/private/star_world.key;
> 
>      ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
>      ssl_ciphers 
> 'EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA256:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EDH+aRSA+AESGCM:EDH+aRSA+SHA256:EDH+aRSA:EECDH:!aNULL:!eNULL:!MEDIUM:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SEED';
>      ssl_prefer_server_ciphers on;
> 
>      ssl_session_cache shared:SSL:50m;
>      ssl_session_timeout  1d;
>      ssl_session_tickets off;
> 
>      ssl_dhparam /etc/pki/tls/certs/dhparam.pem;
>      ...
> 
> and the second:
> 
> server {
>      listen [::]:80;
>      listen [::]:443 ssl;
>      server_name  site2.local.world.example.com;
> 
>      ssl_certificate     /etc/pki/tls/certs/star_local_world.cer;
>      ssl_certificate_key /etc/pki/tls/private/star_local_world.key;
> 
>      ssl_protocols TLSv1.1 TLSv1.2;
>      ssl_ciphers 
> 'EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA256:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EDH+aRSA+AESGCM:EDH+aRSA+SHA256:EDH+aRSA:EECDH:!aNULL:!eNULL:!MEDIUM:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SEED';
>      ssl_prefer_server_ciphers on;
> 
>      ssl_session_cache shared:SSL:50m;
>      ssl_session_timeout  1d;
>      ssl_session_tickets off;
> 
>      ssl_dhparam /etc/pki/tls/certs/dhparam.pem;
>      ...
> 
> However, while the first one works correctly, the second one is clearly 
> using the SSL certs of the first vhost (and thus it produces a Risk 
> warning due to mismatch between name-cert) and not the ones configured 
> in its own config (the second).
> 
> (I confirmed that SNI support is enabled.)
> 
> What am I doing wrong? (Obviously I am a very basic nginx user.)

How do you test it?  Note well that the second vhost is only 
available on port 443 via IPv6.

> Finally, what is the best way to successfully listen (i.e. the suggested 
> way to configure the "listen" directives) to 80 and 443 ports on both 
> IPv4 and IPv6 on all hosts (each and every one of them)?

The recommended approach is to list all relevant "listen" 
directives in all relevant servers.  That is, for 80 ad 443 ports 
on both IPv4 and IPv6 you have to use (assuming no "ipv6only=off"):

    listen 80;
    listen [::]:80;
    listen 443 ssl;
    listen [::]:443 ssl;

If this looks too complex, consider using an include with all 
these listen directives (http://nginx.org/r/include).  Note though 
that using includes might introduce additional configuration 
errors by hiding parts of the configuration, so I usually 
recommend to refrain from using includes (except may be a few 
standard ones, such as mime.types) and use single self-consistent 
nginx.conf instead.

-- 
Maxim Dounin
http://mdounin.ru/


More information about the nginx mailing list