SSL & Ngnix : SSL 핸드 쉐이킹 동안 SSL 포트에서 수신 대기하는 서버에 “ssl_certificate”가 정의되어 있지 않습니다

오류없이 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


답변

내 생각에 포트 443에서 수신 대기하는 다른 서버가 있다고 가정합니다.이 서버에는 ssl_certificate가 정의되어 있지 않으며 자동으로 선택됩니다 (SNI). 작업하려는이 서버를 제외하고 / etc / nginx / sites-enabled에서 모든 심볼릭 링크를 삭제하십시오 (가능한 경우 올바르게 구성하지 않고 443을 수신하는지 모든 서버를 확인하십시오).


답변

오늘 아침 일찍이 동일한 문제를 해결 했으므로 CA의 요점을 분명히하기 위해 왔습니다 (지금은 문제를 이해 했으므로 잘 작성되었습니다). 두 개의 서버 블록이있을 가능성이 큽니다.

# 기본
서버 {
    들어 443 default_server; #`ssl`의 부족에 주목
    서버 이름 _;
    # ...
}

# 실제 사이트
서버 {
    443 ssl을 듣고;
    서버 이름 ;
    # ...
}

SNI는 리스너 로 레이블이 지정된 항목 에서만 일치합니다 ssl. 그러나 기본 서버는 SSL에 관계없이 443에서 들어오는 모든 트래픽을 가져옵니다 . 따라서 실제로 SNI는 모든 트래픽 자체를 저장함으로써 박쥐에서 직접 작업하는 것을 실제로 예방하고 있습니다.

조짐:

  • nginx가 구성을로드하지 않는 것처럼 보입니다 ( nginx -t및 서비스를 다시로드 하더라도 )
  • “서버 블록에 ssl_certificate가 없습니다”라는 오류
  • nginx는 호스트를 기본 443 리스너에 적용하고 있습니다.

솔루션 :

오늘 아침 기본 서버 블록을 제거하여 SNI가 SSL 리스너에서 일치하도록하여 문제점을 수정했습니다.

대체 솔루션은 SNI가 기본 호스트에서 기본적으로 사용되도록 ssl리스너와 ssl_certificate라인을 서버 블록 에 추가하는 것 입니다. 여전히 SSL 오류가 발생하므로 최상의 솔루션은 아니지만 SNI가 작동하게합니다. 🙂


답변

default_servernginx 설정에서 단일 매개 변수 를 정의해야합니다 .

default_serverexample.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서버에 여러 개의 호스트가있는 경우 매개 변수가 다른 곳에 정의되어 있지 않은지 확인하십시오 .


답변

평소와 같이 게임에 늦었지만 도움이 되었기 때문에 … 인증서가 잘못되었는지 확인하십시오. “통합 된”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에 대한 단서를 제공했습니다.


답변

인증서에 대한 파일 권한이 올바른지 확인하십시오. 디렉토리 목록을 게시하십시오 ( ls -la)