SSL & Ngnix: ไม่มี“ ssl_certificate” ถูกกำหนดในการฟังเซิร์ฟเวอร์บนพอร์ต SSL ในขณะที่จับมือ SSL


23

ฉันจัดการเพื่อสร้างใบรับรองด้วย LE โดยไม่มีข้อผิดพลาดฉันยังจัดการเปลี่ยนเส้นทางปริมาณการใช้งานของฉันจากพอร์ต 80 ไปยังพอร์ต 443 แต่เมื่อฉันรีโหลดเซิร์ฟเวอร์ nginx ของฉันฉันไม่สามารถเข้าถึงเว็บไซต์ของฉันได้ บันทึกข้อผิดพลาด Ngnix แสดงบรรทัดนี้:

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

ฉันคิดว่านี่หมายความว่าไม่ได้หาใบรับรองที่ฉันไปแล้วไปที่เส้นทางของใบรับรองและทั้งคู่อยู่ที่นั่นสิ่งที่อาจเป็นปัญหา นี่คือลักษณะการกำหนดค่า 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;
    }

}

ทุกอย่างดูเหมือนจะตรงไปตรงมาฉันไม่เข้าใจว่าปัญหาจะเป็น

หลังจากรัน nginx -t ทุกอย่างดูโอเค:

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

คุณมีserverบล็อกอื่น ๆบ้างไหม? คุณทำอะไรอย่างแน่ชัดเมื่อเกิดข้อผิดพลาดนั้น?
Tero Kilkanen

1
ผู้ใช้ nginx มีสิทธิ์เข้าถึงไฟล์ใบรับรองและไฟล์คีย์หรือไม่ ยังไม่เพียงพอที่จะมีสิทธิ์อ่านเพื่อเข้าถึงไฟล์ผู้ใช้ยังจำเป็นต้องมีสิทธิ์ในการอ่านและดำเนินการสำหรับไดเรกทอรีทั้งหมดในห่วงโซ่ของไฟล์
เจนนี่ดีพูดว่า Reinstate Monica

คำตอบ:


25

ฉันเดาว่าคุณมีเซิร์ฟเวอร์อื่นฟังพอร์ต 443 เซิร์ฟเวอร์นี้ไม่มีการกำหนด ssl_certificate และจะถูกเลือกโดยอัตโนมัติ (SNI) ลองลบลิงก์สัญลักษณ์ทั้งหมดจาก / etc / nginx / sites-enabled ยกเว้นเซิร์ฟเวอร์ตัวเดียวที่คุณต้องการใช้งาน (ถ้าเป็นไปได้มิฉะนั้นตรวจสอบเซิร์ฟเวอร์ทั้งหมดของคุณเพื่อรับฟัง 443 โดยไม่ต้องกำหนดค่าอย่างถูกต้อง)


2
บิงโก! ในกรณีของฉันฉันสร้างไฟล์ปรับแต่งสำหรับ vhost mail.mydomain ดังนั้นฉันสามารถสร้างใบรับรอง LE สำหรับการติดตั้ง dovecot ของฉันและลืมเพิ่มลงในไฟล์ปรับแต่ง
Marcos Regis

7

ฉันแก้ไขปัญหาเดียวกันนี้เมื่อเช้านี้ดังนั้นฉันมาที่นี่เพื่อชี้แจงประเด็นของ CA (ซึ่งตอนนี้ฉันเข้าใจปัญหาได้ดีขึ้นแล้ว) คุณน่าจะมีบล็อกเซิร์ฟเวอร์สองตัว:

# ค่าเริ่มต้น
เซิร์ฟเวอร์ {
    ฟัง 443 default_server; # สังเกตการขาด `ssl '
    ชื่อเซิร์ฟเวอร์ _;
    # ...
}

# ไซต์จริง
เซิร์ฟเวอร์ {
    ฟัง 443 ssl;
    ชื่อเซิร์ฟเวอร์ ;
    # ...
}

SNI จะเพียงตรงกับในผู้ที่มีความโดดเด่นด้วยการsslฟัง อย่างไรก็ตามเซิร์ฟเวอร์เริ่มต้นจะรับส่งข้อมูลขาเข้าทั้งหมดใน 443 โดยไม่คำนึงถึง SSL หรือไม่ ดังนั้นมันจึงเป็นการป้องกัน SNI จากการทำงานจริง ๆ ทั้งหมดทันทีจากค้างคาวโดยกักตุนการจราจรทั้งหมดไว้สำหรับตัวมันเอง

อาการ:

  • ดูเหมือนว่า nginx จะไม่โหลดการกำหนดค่าของคุณ (แม้จะมีnginx -tและโหลดบริการ)
  • ข้อผิดพลาดที่ระบุว่า "ไม่พบ ssl_certificate ในบล็อกเซิร์ฟเวอร์"
  • nginx กำลังใช้โฮสต์ของคุณกับผู้ฟัง 443 ที่เป็นค่าเริ่มต้น

Solutions:

ฉันแก้ไขปัญหาเมื่อเช้านี้โดยการลบบล็อกเซิร์ฟเวอร์เริ่มต้นดังนั้นจึงอนุญาตให้ SNI จับคู่กับ SSL listeners

ทางเลือกอื่นคือการเพิ่มsslฟังและssl_certificateบรรทัดไปยังบล็อกเซิร์ฟเวอร์เพื่อให้เปิดใช้งาน SNI บนโฮสต์เริ่มต้นของคุณเป็นหลัก คุณจะยังคงได้รับข้อผิดพลาด SSL ดังนั้นจึงไม่ใช่วิธีที่ดีที่สุด แต่จะทำให้ SNI ของคุณทำงานได้ :)


5

คุณต้องกำหนดdefault_serverพารามิเตอร์เดียวในการกำหนดค่า nginx

ใช้default_serverกับ example.com หรือ www.example.com ไม่ใช่ทั้งคู่

ดังนั้นสิ่งนี้จะทำงาน:

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

หมายเหตุเกี่ยวกับโฮสต์เสมือน: ตรวจสอบให้แน่ใจว่าไม่ได้กำหนดdefault_serverพารามิเตอร์ไว้ที่อื่น - หากคุณมีหลายโฮสต์บนเซิร์ฟเวอร์


ssl ที่ดีมากทำงานให้ฉัน
Josua Marcel Chrisano

1

มาช้าไปตามเกมตามปกติ แต่เนื่องจากมันช่วยฉัน ... ตรวจสอบว่าใบรับรองผิดรูปหรือไม่ เมื่อสร้าง "รวม" crt (crt + ระดับกลาง) ให้ทำ

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

ฉันสูญเสีย LF และได้รับสายเช่นนี้:

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

แทน

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

และ nginx จะไม่ใช้ใบรับรองและล้มเหลวด้วยข้อผิดพลาดที่กล่าวถึงข้างต้น

การทำ

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

ให้ฉันเบาะแสสำหรับ openssl จะผิดพลาด


-1

ตรวจสอบว่าการอนุญาตไฟล์ของคุณสำหรับใบรับรองถูกต้องหรือไม่ กรุณาโพสต์รายชื่อไดเรกทอรี ( ls -la)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.