エラーなしで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
私の推測では、ポート443でリッスンしている別のサーバーがあります。このサーバーにはssl_certificateが定義されておらず、自動的に選択されています(SNI)。/etc/nginx/sites-enabledからすべてのシンボリックリンクを削除してみてください(ただし、可能であれば、正しく構成されていないすべてのサーバーで443をリッスンしていないか確認してください)。
今朝、この同じ問題を修正したので、ここで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 -t
とサービスのリロードがあっても)ソリューション:
今朝、デフォルトのサーバーブロックを削除することで問題を修正し、SNIがSSLリスナーで一致できるようにしました。
別の解決策は、ssl
リスナーとssl_certificate
行をサーバーブロックに追加して、SNIが基本的にデフォルトのホストで有効になるようにすることです。 SSLエラーが発生するため、最善の解決策ではありませんが、SNIを機能させることができます。
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
パラメーターが他の場所で定義されていないことを確認してください。
いつものようにゲームに遅れますが、助けになったので...証明書の形式が間違っていないか確認してください。 「統一された」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がエラーになる手がかりをくれました。