SSL & Ngnix: không có ssl_certert nào được xác định trong máy chủ nghe trên cổng SSL trong khi bắt tay SSL


23

Tôi đã quản lý để tạo chứng chỉ của mình với LE không có lỗi, tôi cũng đã chuyển hướng lưu lượng truy cập của mình từ cổng 80 sang cổng 443. Nhưng khi tôi tải lại máy chủ nginx của mình, tôi không thể truy cập trang web của mình. Nhật ký lỗi Ngnix hiển thị dòng này:

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

Tôi nghĩ điều này có nghĩa là nó không thể tìm thấy các chứng chỉ mà sau đó tôi đã điều hướng đến đường dẫn của các chứng chỉ và cả hai đều ở đó, vấn đề có thể là gì? Đây là cách cấu hình Ngnix của tôi trông như thế nào:

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

}

Tất cả dường như khá thẳng về phía trước Tôi không hiểu vấn đề có thể ở đâu.

Sau khi chạy nginx -t tất cả có vẻ ổn:

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

Bạn có serverkhối nào khác không? Chính xác bạn đã làm gì khi gặp lỗi đó?
Tero Kilkanen

1
Người dùng nginx có quyền truy cập vào tệp chứng chỉ và tệp chính không? Không đủ để có quyền truy cập đọc vào các tệp, người dùng cũng cần phải có quyền đọc và thực thi các quyền đối với tất cả các thư mục trong chuỗi đối với tệp.
Jenny D nói Phục hồi lại

Câu trả lời:


25

Tôi đoán là bạn có một máy chủ khác đang nghe trên cổng 443. Máy chủ này không có ssl_certert được xác định và nó tự động được chọn (SNI). Cố gắng xóa tất cả các liên kết tượng trưng khỏi / etc / nginx / trang web được kích hoạt ngoại trừ máy chủ này bạn muốn thực hiện công việc (nếu có thể, nếu không, hãy kiểm tra tất cả các máy chủ của bạn để nghe 443 mà không được định cấu hình chính xác).


2
CHƠI LÔ TÔ! Trong trường hợp của tôi, tôi tạo tệp cấu hình cho vhost mail.mydomain, vì vậy tôi có thể xây dựng chứng chỉ LE cho cài đặt dovecot của mình và quên thêm vào tệp cấu hình.
Marcos Regis

7

Tôi đã khắc phục vấn đề tương tự vào sáng sớm hôm nay, vì vậy tôi ở đây để làm rõ quan điểm của CA (mà bây giờ tôi hiểu vấn đề đã được thực hiện tốt), rất có thể bạn có hai khối máy chủ:

# mặc định
máy chủ {
    nghe 443 default_server; # Lưu ý việc thiếu `ssl`
    tên máy chủ _;
    # ...
}

trang web #real
máy chủ {
    nghe 443 ssl;
    tên máy chủ ;
    # ...
}

SNI sẽ chỉ khớp với những người được gắn nhãn với sslngười nghe. Tuy nhiên, máy chủ mặc định sẽ lấy tất cả lưu lượng truy cập đến trên 443, bất kể SSL hay không. Do đó, SNI thực sự muốn SNI thực sự hoạt động, ngay lập tức, bằng cách tích trữ tất cả lưu lượng truy cập cho chính nó.

Triệu chứng:

  • Có vẻ như nginx không tải cấu hình của bạn (ngay cả khi nginx -ttải lại và dịch vụ)
  • Lỗi ghi rõ "không tìm thấy ssl_certert trong khối máy chủ"
  • nginx chỉ đang áp dụng máy chủ của bạn cho trình nghe 443 mặc định.

Các giải pháp:

Tôi đã khắc phục sự cố sáng nay bằng cách xóa khối máy chủ mặc định, do đó cho phép SNI khớp với người nghe SSL.

Giải pháp thay thế sẽ là thêm sslngười nghe và các ssl_certificatedòng vào khối máy chủ để SNI được kích hoạt cơ bản trên máy chủ mặc định của bạn. Bạn vẫn sẽ gặp lỗi SSL, vì vậy đây không phải là giải pháp tốt nhất, nhưng nó sẽ cho phép SNI của bạn hoạt động :)


5

Bạn cần xác định một default_servertham số duy nhất trong cấu hình nginx.

Áp dụng default_servertrên example.com hoặc www.example.com. Không phải cả hai.

Do đó, điều này sẽ làm việc:

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

Lưu ý về máy chủ ảo: Đảm bảo default_servertham số không được xác định ở bất kỳ nơi nào khác - nếu bạn có nhiều máy chủ trên máy chủ.


ssl rất hay đang làm việc cho tôi
Josua Marcel Chrisano

1

Đến trễ trò chơi như thường lệ, nhưng vì nó giúp tôi ... Kiểm tra xem chứng chỉ có bị sai không. Khi xây dựng crt "hợp nhất" (crt + trung gian), thực hiện

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

Tôi bằng cách nào đó đã mất một chiếc LF và có một dòng như thế này:

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

thay vì

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

và nginx sẽ không lấy chứng chỉ và thất bại với lỗi được đề cập ở trên.

Đang làm

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

đã cho tôi manh mối cho openssl sẽ lỗi.


-1

Kiểm tra xem quyền của tập tin của bạn cho các chứng chỉ là chính xác. Vui lòng gửi danh sách thư mục ( ls -la)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.