web-dev-qa-db-ja.com

SSLおよびNginx:SSLハンドシェイク中にSSLポートでリッスンするサーバーで「ssl_certificate」が定義されていません

エラーなしでLEで証明書を作成できました。トラフィックをポート80からポート443にリダイレクトすることもできました。しかし、nginxサーバーをリロードすると、Webサイトにアクセスできません。 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
27
Rémi

私の推測では、ポート443でリッスンしている別のサーバーがあります。このサーバーにはssl_certificateが定義されておらず、自動的に選択されています(SNI)。/etc/nginx/sites-enabledからすべてのシンボリックリンクを削除してみてください(ただし、可能であれば、正しく構成されていないすべてのサーバーで443をリッスンしていないか確認してください)。

29
C.A. Vuyk

今朝、この同じ問題を修正したので、ここでC.Aの要点を明確にするためにここにいます(問題を理解したので、うまくできている)、おそらく2つのサーバーブロックがあります。

#default 
 server {
 listen 443 default_server; # `ssl` 
 server_name _; 
#... 
} 
 
#real site 
 serverがないことに注意してください{
 listen 443 ssl; 
 server_name; 
#... 
} 

SNIは、sslリスナーでラベル付けされたものとonlyで一致します。ただし、デフォルトのサーバーは、SSLかどうかに関係なく、443でall着信トラフィックを取得します。したがって、実際には、すべてのトラフィックをそれ自体のために蓄えているため、SNIが実際にまったく機能しないようになっています。

症状:

  • Nginxがあなたの設定をロードしていないようです(nginx -tとサービスのリロードがあっても)
  • 「サーバーブロックにssl_certificateが見つかりません」というエラー
  • nginxは、ホストをデフォルトの443リスナーに適用するだけです。

ソリューション:

今朝、デフォルトのサーバーブロックを削除することで問題を修正し、SNIがSSLリスナーで一致できるようにしました。

別の解決策は、sslリスナーとssl_certificate行をサーバーブロックに追加して、SNIが基本的にデフォルトのホストで有効になるようにすることです。 SSLエラーが発生するため、最善の解決策ではありませんが、SNIを機能させることができます。

9
Reverend Tim

Nginx設定で単一のdefault_serverパラメータを定義する必要があります。

Example.comまたはwww.example.comのいずれかにdefault_serverを適用します。両方ではありません。

したがって、これは機能します:

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パラメーターが他の場所で定義されていないことを確認してください。

5
ingo

いつものようにゲームに遅れますが、助けになったので...証明書の形式が間違っていないか確認してください。 「統一された」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
cucu8