Synology NASを社内専用Webサーバー化してHTTPS化するまでの記録
~DDNSとLet's Encryptで証明書を自動更新し、WebアプリでAndroidのカメラが利用できる環境を構築~
はじめに
社内向けWebアプリを開発していた際、Androidスマホでカメラが起動しない問題に遭遇しました。
調査したところ、ブラウザのカメラ機能は、 HTTPS環境でしか利用できない ことが判明しました。
社内専用システムだからHTTPでも問題ないと思っていましたが、最近のブラウザではカメラやマイクなどの機能利用時にHTTPSが必須となっています。
とはいえ、インターネットのWebサーバーにアプリを置きたくないですし、オレオレ証明書の発行では警告が出る問題があります。
そこで今回は、Synology NASを購入し、Webサーバー化し、Let's Encryptで証明書を自動更新する、以下の環境を構築しました。
- 社内専用システム
- 外部公開なし
- 正規SSL証明書利用
- 証明書自動更新
- Androidでカメラ利用可能
同じように社内向けカメラ機能付きWebアプリを開発している方の参考になれば幸いです。
システム構成
今回構築した構成は以下の通りです。
Androidスマホ(iPhoneでも問題ない)
↓
https://example.synology.me
↓
ルーター:RTX830(静的DNS)
↓
Synology NAS
↓
社内Webアプリポイントは、インターネットへ公開することなく、社内LANだけでHTTPS環境を実現していることです。
Step1. Synology DDNSを取得する
まずは、Synologyが提供する無料DDNSを取得します。
※DDNS:IPアドレスを、常に一定の「ドメイン名(ホスト名)」と自動で結びつける仕組み。
DSMから以下を開きます。
※DMS:Synology社のNAS専用のウェブ管理システム。
コントロールパネル
→ 外部アクセス
→ DDNS
サービスプロバイダに Synology を選択し、希望するホスト名を登録します。
例:example.synology.me
登録が完了すると、Synology DDNSが利用できるようになります。
※DDNS作成やLet's Encryptの利用には、Synologyアカウントが必要になるはずです。
Step2. Let's Encrypt証明書を取得する
続いて、先ほど作ったドメイン名に対するSSL証明書を取得します。
DSMから以下を選択します。
コントロールパネル
→ セキュリティ
→ 証明書
→ 追加
続いて Let's Encryptから証明書を取得 を選択します。
取得に成功すると、新しい証明書が追加されます。
※証明書の取得や更新時にルーターのポート80や443などを開放する必要はありません。
Step3. 証明書を既定値として割り当てる
ここで最初の落とし穴がありました。
私は最初、証明書を取得しただけで満足していたのですが、ブラウザでアクセスすると以下のように表示されてしまいました。
この接続ではプライバシーが保護されません
証明書を確認すると、以下になっており、Synology標準の自己署名証明書が利用されていました。
発行先:synology
発行元:Synology Inc. CA解決方法
取得したLet's Encrypt証明書を選択し、 設定 を開きます。
各サービスに割り当てられている証明書を、 synology から 取得したドメインの証明書 へ変更します。
さらに、 既定値として設定 を有効にします。
これでNAS全体がLet's Encrypt証明書を利用するようになります。
Step4. ドメインでアクセスしてみる
ブラウザで https://example.synology.me へアクセスしてみました。
次は、こんな表示になりました。
このサイトにアクセスできません
Step5. 原因調査
まず名前解決を確認します。
Windowsのコマンドラインで以下を実行します。
nslookup example.synology.me結果としてグローバルIPアドレス(社内のローカルIPではない)が返ってきました。
DDNSとしては正常ですが、今回は社内専用システムとして利用するため、社内からはNASのローカルIPへ接続しないといけません。
Step6. RTX830に静的DNSを設定する
そこで、ルーター:RTX830に静的DNSを設定しました。
dns static a example.synology.me 192.168.1.5これは、以下のような社内専用の名前解決ルールを作る設定です。
example.synology.me
↓
192.168.1.xxx (NASの固定IP)これにより、社内からドメインにアクセスした場合のみNASへ直接接続されます。
※インターネット(外部)からドメインにアクセスしても、外部サーバーからは接続先が分からないのでアクセス不可能となります。
※NASが固定IPになっていることが前提です。
Step7. 動作確認
再度確認します。
nslookup example.synology.me結果が以下になれば成功です。
Address: 192.168.1.xxx (NASの固定IP)ブラウザで以下にアクセスすると、鍵マーク付きで正常に表示されました。
https://example.synology.meAndroidのカメラが利用可能に
今回の最終目的だったカメラ機能も無事動作しました。
HTTPS化後はAndroid端末でも正常にカメラが起動し、ホーム画面へ追加したPWAからも問題なく利用できるようになりました。
この構成のメリット
- 正規SSL証明書を利用できる
- Let's Encryptで自動更新される
- Androidでカメラ機能を利用できる
- PWAの要件を満たせる
- ポート開放が不要
- 社内専用システムとして運用できる
- Synology標準機能のみで構築できる
ハマったポイント
証明書を取得しただけでは利用されない
取得後に「設定」から各サービスへ割り当てる必要があります。
IPアドレスでは証明書エラーになる
例えば、以下では証明書名と一致しないため警告が表示されます。
https://192.168.1.5社内からDDNS名でアクセスできない
RTX830へ静的DNSを設定することで解決しました。
dns static a example.synology.me 192.168.1.5まとめ
今回構築した環境は、以下の構成です。
Android
↓
HTTPS
↓
RTX830静的DNS
↓
Synology NAS
↓
社内Webアプリ「Androidでカメラを使いたい」「社内だけでHTTPS環境を作りたい」「証明書の更新を自動化したい」という場合には、Synology NASは非常に便利だと感じました。
同じ課題で悩んでいる方の参考になれば幸いです。
