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.

iş

# 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.