SSL ve Ngnix: SSL el sıkışması sırasında SSL portunu dinleyen sunucuda "ssl_certificate" tanımlanmaz


23

Hatalı LE ile sertifikaları oluşturmayı başardım, ayrıca trafiğimi 80 numaralı bağlantı noktasından 443 numaralı bağlantı noktasına yönlendirmeyi de başardım. Ngnix hata günlükleri şu satırı gösterir:

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

Bunun, sertifika yoluna gidemediğim sertifikaları bulamadığı anlamına geldiğini düşünüyorum ve ikisi de orada, sorun ne olabilir? Ngnix konfigürasyonum şöyle görünüyor:

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;
    }

}

Her şey oldukça açık görünüyor, sorunun nerede olabileceğini anlamıyorum.

Nginx -t çalıştırdıktan sonra her şey yolunda görünüyor:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Başka serverblokunuz var mı? Bu hatayı aldığında tam olarak ne yaptın?
Tero Kilkanen

1
Nginx kullanıcısı sertifika dosyasına ve anahtar dosyasına erişebiliyor mu? Dosyalara okuma erişiminin olması yeterli değildir, kullanıcının dosyadaki tüm dizinler için okuma ve yürütme izinleri olması gerekir.
Jenny D, Reinstate Monica'yı

Yanıtlar:


25

Tahminimce 443 numaralı bağlantı noktasını dinleyen başka bir sunucunuz var. Bu sunucunun tanımlanmış bir ssl_certificate'sı yok ve otomatik olarak seçildi (SNI). Çalışmak istediğiniz bu sunucu dışında, / etc / nginx / sites etkin tüm sembolik bağları silmeyi deneyin (eğer mümkünse, 443'ü doğru yapılandırılmadan dinlemek için tüm sunucularınızı kontrol edin).


2
BİNGO! Benim durumumda, vhost mail.mydomain için config dosyası oluşturdum, böylece dovecot kurulumum için bir LE sertifikası oluşturabilirim ve config dosyasına eklemeyi unuttum.
Marcos Regis

7

Bu sabah bu sorunu daha önce düzelttim, bu yüzden CA'nın konusunu açıklığa kavuşturmak için geldim (şimdi, sorunu anlıyorum, iyi yapıldı), muhtemelen iki sunucu bloğunuz var:

# varsayılan
sunucu {
    443 varsayılan dinle_server; # Ssl'nin eksikliğine dikkat edin
    sunucu adı _;
    # ...
}

#real site
sunucu {
    443 ssl dinle;
    sunucu adı ;
    # ...
}

SNI sadece bir ssldinleyici ile etiketlenmiş olanlarla eşleşecektir . Ancak, varsayılan sunucu , SSL'ye bakılmaksızın, gelen tüm trafiği 443'te alır. Bu nedenle, aslında SNI'nın aslında tüm trafiği kendisi için biriktirerek yarasadan tamamen çalışmasını engelliyor.

Semptomlar:

  • Nginx config ayarlarınızı yüklemiyor gibi görünecek (bir nginx -tve bir servis yüklemesiyle bile )
  • "Sunucu bloğunda ssl_certificate bulunamadı" belirten hatalar
  • nginx, sunucunuzu varsayılan 443 dinleyiciye uygulamaktadır.

Çözümler:

Bu sabah varsayılan sunucu bloğunu kaldırarak sorunu çözdüm, böylece SNI'nin SSL dinleyicileriyle eşleşmesini sağladım.

Alternatif çözüm, ssldinleyiciyi ve ssl_certificatesatırları sunucu bloğuna eklemek, böylece SNI temelde varsayılan ana makinenizde etkinleştirilebilir. Yine de SSL hataları alacaksınız, bu yüzden en iyi çözüm değil, ancak SNI'nizin çalışmasına izin verecek :)


5

default_serverNginx config dosyasında tek bir parametre tanımlamanız gerekir .

default_serverExample.com veya www.example.com adreslerine uygulayın . İkiside değil.

Dolayısıyla bu işe yarayacak:

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....)
}

Sanal ana bilgisayarlar hakkında not: default_serverParametrenin başka bir yerde tanımlanmadığından emin olun - eğer sunucuda birden fazla ana bilgisayar varsa.


çok güzel ssl benim için çalışıyor
Josua Marcel Chrisano

1

Oyuna her zamanki gibi geç kaldım, ama bana yardım ettiğinden beri ... Sertifikanın hatalı olup olmadığını kontrol et. "Birleştirilmiş" crt (crt + orta) oluştururken, yaparken

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

Her nasılsa bir LF'yi kaybettim ve şöyle bir çizgi aldın:

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

yerine

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

ve nginx onay alamaz ve yukarıda belirtilen hata ile başarısız olmaz.

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

openssl için bir ipucu verdi, hata yapardı.


-1

Sertifikalar için dosya izinlerinizin doğru olup olmadığını kontrol edin. Lütfen dizin listesini ( ls -la) gönderin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.