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


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 사용자는 인증서 파일과 키 파일에 액세스 할 수 있습니까? 파일에 대한 읽기 액세스 권한만으로는 충분하지 않으며, 사용자는 파일의 체인에있는 모든 디렉토리에 대한 읽기 및 실행 권한이 있어야합니다.
Jenny D는 Reinstate Monica가

답변:


25

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


2
빙고! 필자의 경우 vhost mail.mydomain에 대한 구성 파일을 작성하므로 도브 코트 설치를위한 LE 인증서를 작성하고 구성 파일에 추가하는 것을 잊어 버릴 수 있습니다.
마르코스 레지스

7

오늘 아침 일찍이 동일한 문제를 해결 했으므로 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가 작동하게합니다. :)


5

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


에 아주 좋은 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에 대한 단서를 제공했습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.