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


23

エラーなしで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

他にserverブロックはありますか?そのエラーが発生したとき、正確に何をしましたか?
テロキルカネン

1
nginxユーザーは証明書ファイルとキーファイルにアクセスできますか?ファイルへの読み取りアクセス権だけでは十分ではありません。ユーザーは、ファイルへのチェーン内のすべてのディレクトリに対する読み取りおよび実行権限も必要です。
ジェニーDは、モニカを

回答:


25

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


2
ビンゴ!私の場合、vhost mail.mydomainの設定ファイルを作成し、dovecotのインストール用にLE証明書を作成し、設定ファイルを追加するのを忘れました。
マルコスレジス

7

今朝早くこの同じ問題を修正したので、CAのポイントを明確にするためにここに来ました(これで問題を理解したので、よくできました)。おそらく2つのサーバーブロックがあります。

# デフォルト
サーバー{
    listen 443 default_server; # `ssl`がないことに注意してください
    サーバーの名前 _;
    #...
}

#実際のサイト
サーバー{
    443 sslをリッスンします。
    サーバーの名前 ;
    #...
}

SNIは、リスナーでラベル付けされたものにのみ一致しsslます。ただし、デフォルトサーバーは、SSLの有無にかかわらず、443ですべての着信トラフィックを取得ます。したがって、実際には、SNIがすべてのトラフィックを大量に蓄積することで、実際に動作することをまったく禁止しています。

症状:

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

ソリューション:

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

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


5

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

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が私のために働いている
ジョシュアマルセル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.