SSL i Ngnix: brak zdefiniowania „certyfikatu ssl” w nasłuchiwaniu serwera na porcie SSL podczas uzgadniania SSL

23

Udało mi się utworzyć moje certyfikaty z LE bez błędów, udało mi się również przekierować mój ruch z portu 80 na port 443. Ale kiedy ponownie ładuję serwer nginx, nie mogę uzyskać dostępu do mojej witryny. Dzienniki błędów Ngnix pokazują ten wiersz:

4 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: 192.168.0.104, server: 0.0.0.0:443

Myślę, że to oznacza, że ​​nie może znaleźć certyfikatów, które następnie przeszedłem do ścieżki certyfikatów i są one dostępne, co może być problemem? Oto jak wygląda moja konfiguracja Ngnix:

server {
       listen         80;
       server_name    pumaportal.com www.pumaportal.com;
       return         301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;

    server_name pumaportal.com www.pumaportal.com;

    add_header Strict-Transport-Security "max-age=31536000";

    ssl_certificate /etc/letsencrypt/live/pumaportal.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/pumaportal.com/privkey.pem;

    ssl_stapling on;
    ssl_stapling_verify on;

    access_log /var/log/nginx/sub.log combined;

    location /.well-known {
       alias /[MY PATH]/.well-known;
    }

    location / {
        proxy_pass http://localhost:2000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-Forwarded-For $remote_addr;
    }

}

Wszystko wydaje się dość proste. Nie rozumiem, gdzie może być problem.

Po uruchomieniu nginx -t wszystko wydaje się w porządku:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Rémi
źródło
Czy masz jakieś inne serverbloki? Co dokładnie zrobiłeś, kiedy dostałeś ten błąd?
Tero Kilkanen 12.04.17
1
Czy użytkownik nginx ma dostęp do pliku certyfikatu i pliku klucza? Dostęp do plików nie wystarczy, użytkownik musi także mieć uprawnienia do odczytu i wykonywania dla wszystkich katalogów w łańcuchu do pliku.
Jenny D mówi Przywróć Monikę
1
Powiązane
mbomb007

Odpowiedzi:

25

Domyślam się, że inny serwer nasłuchuje na porcie 443. Ten serwer nie ma zdefiniowanego certyfikatu ssl_certyfikat i jest automatycznie wybierany (SNI). Spróbuj usunąć wszystkie dowiązania symboliczne z / etc / nginx / witryn z włączonym wyjątkiem tego jednego serwera, na którym chcesz pracować (jeśli to możliwe, w przeciwnym razie sprawdź wszystkie serwery pod kątem odsłuchiwania 443 bez prawidłowej konfiguracji).

CA Vuyk
źródło
2
BINGO! W moim przypadku tworzę plik konfiguracyjny dla vhost mail.mydomain, więc mogę zbudować certyfikat LE dla mojej instalacji dovecot i zapomniałem dodać plik konfiguracyjny.
Marcos Regis
7

Rozwiązałem ten sam problem wcześniej tego ranka, więc jestem tutaj, aby wyjaśnić punkt CA (który, gdy już rozumiem problem, został dobrze wykonany), najprawdopodobniej masz dwa bloki serwera:

# domyślna
serwer {
    Listen 443 default_server; # Zauważ brak „ssl”
    Nazwa serwera _;
    # ...
}

#real site
serwer {
    słuchaj 443 ssl;
    Nazwa serwera ;
    # ...
}

SNI będzie pasował tylko do tych, które są oznaczone jako ssldetektor. Jednak domyślny serwer będzie przechwytywał cały ruch przychodzący na 443, niezależnie od SSL czy nie. W związku z tym faktycznie uniemożliwia SNI, by działał od samego początku, gromadząc cały ruch dla siebie.

Objawy:

  • Wygląda na to, że nginx nie ładuje twojej konfiguracji (nawet przy nginx -tprzeładowaniu usługi i)
  • Błędy stwierdzające „nie znaleziono certyfikatu ssl w bloku serwera”
  • nginx po prostu stosuje hosta do domyślnego nasłuchiwania 443.

Rozwiązania:

Rozwiązałem problem dziś rano, usuwając domyślny blok serwera, umożliwiając w ten sposób dopasowanie SNI w odbiornikach SSL.

Alternatywnym rozwiązaniem byłoby dodanie ssldetektora i ssl_certificatewierszy do bloku serwera, aby SNI był zasadniczo włączony na domyślnym hoście. Nadal będziesz otrzymywać błędy SSL, więc nie jest to najlepsze rozwiązanie, ale pozwoli Ci działać SNI :)

Wielebny Tim
źródło
5

Musisz zdefiniować pojedynczy default_serverparametr w konfiguracji nginx.

Aplikuj default_serverna example.com lub www.example.com. Nie oba.

Dlatego to zadziała:

server {
    listen 443 ssl;
    listen 80;

    server_name example.com;
    return 301 https://www.example.com$request_uri;
}

server {
    listen 80 default_server;

    server_name www.example.com;
    return 301 https://www.example.com$request_uri;
}

server {
    listen 443 ssl default_server;

    server_name www.example.com;
    root /var/www/example.com/public;
    index index.php index.html index.nginx-debian.html;

    ssl on;
    ssl_certificate /etc/ssl/chain.crt;
    ssl_certificate_key /etc/ssl/examplecom.key;

    (rest of your nginx config goes here....)
}

Uwaga na temat hostów wirtualnych: Upewnij się, że default_serverparametr nie jest zdefiniowany nigdzie indziej - jeśli masz wiele hostów na serwerze.

ingo
źródło
bardzo fajny ssl na mnie działa
Josua Marcel Chrisano
1

Późno do gry jak zwykle, ale ponieważ pomogło mi to ... Sprawdź, czy certyfikat jest źle sformułowany. Podczas budowania „zunifikowanego” crt (crt + pośredni), robienie

$cat server.crt provider.intermediate > unified.crt

Jakoś straciłem LF i dostałem taką linię:

-----END CERTIFICATE----------BEGIN CERTIFICATE-----

zamiast

-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----

a nginx nie przejmie certyfikatu i nie powiedzie się z błędem wspomnianym powyżej.

Robić

# openssl x509 -in unified.cert -text -out

dał mi wskazówkę, że openssl się pomyli.

cucu8
źródło
-1

Sprawdź, czy uprawnienia do plików dla certyfikatów są prawidłowe. Proszę zamieścić listę katalogów ( ls -la)

śridhar pandurangiah
źródło