証明書のエラーを回避するには、使用するドメインに一致する証明書を送信するためにpiが必要です。これには2つのアプローチがあります。
- piサーバーとメインサーバーの両方にインストールされた両方のドメインに1つの証明書を使用します。クライアントがクエリでどのドメインを使用したかは関係ありません。証明書は一致します。
- クライアントが期待する証明書を選択して送信します。
オプション1はより簡単で一般的な方法です。google.comの証明書を見てください!piとメインサーバーの両方に同じ証明書がインストールされます(両方のドメイン用)。Let's Encryptからこのような証明書を取得するには、メインサーバーでpiの動的ドメインのWebサイトを実行し、1つの certbotコマンドを使用して両方のドメインの制御を一度に確認する必要があります。メインサーバーのdyndns名のサイトは、piからのコンテンツをホストする必要はありません。Let's Encryptがそのサイトの制御権があることを確認できるようにします(更新の間にそのサイトをオフにすることもできます)。
このためのサンプルCertbotコマンド(メインWebサーバーで実行):
letsencrypt certonly --webroot --csr request.csr -w /http/pisite/www -d mypi.spdyn.de
-w /http/mainwebsite/www -d maindomain.de
どこrequest.csr
CNとしてドメインのいずれかを使用して、SANのフィールドに両方のドメインを持っている、/http/pisite/www
あなたはパイの動的な名前にバインドされた現行のサーバー上の別のウェブサイトのために作成したローカルディレクトリを参照し、/http/mainwebsite/www
あなたのメインのウェブサイトの既存のディレクトリです。
オプション2はより複雑ですが、「よりクリーンな」結果が生成されます。クライアントは、入力したドメインに一致する証明書を取得します。raspberry piで、TLS接続が開かれたときに(TLS接続を受け入れずに)SNIフィールドを調べ、そこに含まれるドメインに基づいて、転送するアップストリームを選択するストリームモジュール(または同等のもの)でnginxを実行しますへの接続。これにより、raspberry piに転送される外部ポート上のメインドメインからの要求を処理する方法を選択できます。それらが正しいポートで作成されたかのようにメインWebサーバーに送信できます。pi上の他のポート(Nextcloudなど)に送信でき、同じnginxインスタンスで終了できます。好きなページを表示するか、単に接続を閉じます。選択はあなた次第です。
このメソッドのサンプル設定は次のとおりです。
stream/sni-switch.conf
# Listen on 443, and on new connection:
# if the SNI is mapped herein, handle it on this Nginx
# else, forward the whole session to 192.168.1.80:443 (TCP passthrough, no decryption)
upstream mainwebserver {
server 192.168.1.80:443;
}
upstream local_https {
server 127.0.0.1:1443;
}
map $ssl_preread_server_name $name {
default mainwebserver;
pisite.spdyn.de local_https;
}
server {
listen 443;
ssl_preread on;
proxy_pass $name;
}
そして nginx.conf
load_module /usr/lib/nginx/modules/ngx_stream_module.so;
stream {
include /etc/nginx/stream/sni-switch.conf;
}
...
Apacheでこれを行うには、参照これを。次のようなサンプル構成:
<VirtualHost *:*>
ProxyPreserveHost On
ProxyPass "/" "http://192.168.1.80/"
ProxyPassReverse "/" "http://192.168.1.80/"
ServerName maindomain.de
</VirtualHost>