TL; DR
- プライベートネットワーク内のFileMaker Serverを外部に公開せずに無料でSSL化する手順
- 公式サポートされた方法ではないので自己責任で!
背景
今までプライベートネットワーク内部だけで利用してきたFileMaker Serverに、リモートアクセスVPN経由で外部のFileMaker Goからアクセスしたい要件が発生しました。
VPN越しとはいえ、暗号化なしでインターネット側からのアクセスをさせたくはないので、Let's Encryptで発行した証明書を使ってSSL化することにしました。
ところが、インターネット上に公開されたサーバーをSSL化する方法はたくさん見つかりましたが、プライベートネットワーク内部にサーバーを置いたままでSSL化する事例は全然見つからず苦労しました。
需要があるかどうかは微妙ですが、同じようなことをしたい人がもしいたら参考になればと思い、作業手順を公開します。
まだ実運用はしていませんので、いろいろ荒削りです。
作業環境
Mac OS Sierra (10.12)
FileMaker Server 15, FileMaker Server 16
事前準備
Homebrewでcertbotをインストール
$ brew install certbot
Homebrewをインストールしていない場合はこちらから。
https://brew.sh/index_ja.html
certbotやLet's Encryptの詳しい使い方はこちらを御覧ください。
https://letsencrypt.jp/usage/
FileMaker Serverに割り当てるドメインを用意
ほとんど使っていないドメインがあったので、とりあえず流用することにしました。
このドメインはレンタルサーバーでホストされていてcertbotが動かせないので、自動更新することが出来ません。
本番運用する場合は適当なLinuxサーバーを用意した方が良さそうです。
FileMaker Serverのサーバー名をドメイン名に合わせて変更
Admin Consoleにログインして「一般設定」→「サーバー名」をドメイン名に合わせて変更します。
証明書の取得とFileMaker Serverの設定
Let's Encryptで証明書を取得
ドメインをホストしているサーバー上でcertbotを実行できれば楽でしたが、今回使用したサーバーでは不可能だったため、FileMaker Serverを動かしているローカルのサーバー上でマニュアル実行します。
$ sudo certbot certonly --manual -d [ドメイン名] --agree-tos
Password:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for [ドメイン名]
-------------------------------------------------------------------------------
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.
Are you OK with your IP being logged?
-------------------------------------------------------------------------------
(Y)es/(N)o: Y
-------------------------------------------------------------------------------
Create a file containing just this data:
HogeHv1AHc49M8YQ9xLH5DkgHvY2jJecHQDhqxdV3rU.fugarlvxDdW8F9Qwgx0rkE6Nb9tQLwSev9ExpldZANg
And make it available on your web server at this URL:
http://[ドメイン名]/.well-known/acme-challenge/HogeHv1AHc49M8YQ9xLH5DkgHvY2jJecHQDhqxdV3rU
-------------------------------------------------------------------------------
Press Enter to Continue
ここまで来たら別のターミナルでcertbotに指定されたテキストファイルを作成します。この場合は「HogeHv1AHc49M8YQ9xLH5DkgHvY2jJecHQDhqxdV3rU.fugarlvxDdW8F9Qwgx0rkE6Nb9tQLwSev9ExpldZANg」という内容のテキストファイルを「HogeHv1AHc49M8YQ9xLH5DkgHvY2jJecHQDhqxdV3rU」という名前で保存すれば良いので、次のようにします。
$ echo HogeHv1AHc49M8YQ9xLH5DkgHvY2jJecHQDhqxdV3rU.tlx7rlvxDdW8F9Qwgx0rkE6Nb9tQLwSev9ExpldZANg > HogeHv1AHc49M8YQ9xLH5DkgHvY2jJecHQDhqxdV3rU
ファイルができたらSFTPなどでサーバー(ドメインをホストしているサーバーの方)へアップロードします。Webサーバーのルートにあたるディレクトリに「.well-known/acme-challenge/」というディレクトリを作成し、その中に格納しましょう。
以下のURLにアクセスして「HogeHv1AHc49M8YQ9xLH5DkgHvY2jJecHQDhqxdV3rU.fugarlvxDdW8F9Qwgx0rkE6Nb9tQLwSev9ExpldZANg」というリプライが返ってくればOKです。
http://[ドメイン名]/.well-known/acme-challenge/HogeHv1AHc49M8YQ9xLH5DkgHvY2jJecHQDhqxdV3rU
問題なければ最初のターミナルでEnterを入力して処理を続行します。
-------------------------------------------------------------------------------
Create a file containing just this data:
HogeHv1AHc49M8YQ9xLH5DkgHvY2jJecHQDhqxdV3rU.fugarlvxDdW8F9Qwgx0rkE6Nb9tQLwSev9ExpldZANg
And make it available on your web server at this URL:
http://[ドメイン名]/.well-known/acme-challenge/HogeHv1AHc49M8YQ9xLH5DkgHvY2jJecHQDhqxdV3rU
-------------------------------------------------------------------------------
Press Enter to Continue
[ここでEnterを入力]
Waiting for verification...
Cleaning up challenges
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/[ドメイン名]/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/[ドメイン名]/privkey.pem
Your cert will expire on 2018-01-18. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
これで/etc/letsencrypt/live/
配下に証明書が生成されます。
FileMaker Serverの設定
先ほど生成した証明書をFileMaker Serverの管理下にコピーします。
$ sudo su -
# cd /etc/letsencrypt/live/[ドメイン名]/
# # ls
README cert.pem chain.pem fullchain.pem privkey.pem
# cp cert.pem chain.pem privkey.pem /Library/FileMaker\ Server/CStore/
# exit
既存の証明書を削除します。
$ fmsadmin certificate delete
新しい証明書をインポートします。
$ fmsadmin certificate import /Library/FileMaker\ Server/CStore/cert.pem --keyfile /Library/FileMaker\ Server/CStore/privkey.pem --intermediateCA /Library/FileMaker\ Server/CStore/chain.pem
FileMaker Serverを再起動します。
$ fmsadmin close -y
$ fmsadmin restart server
FileMaker Serverを外部に公開している場合はこれで作業終了です。
今回はプライベートネットワーク内にFileMaker Serverがいるので、DNSサーバーの設定を変更する必要があります。
DNSサーバーの設定
ドメイン名に割り当てられたIPアドレスはグローバルIPですが、実際のFileMaker ServerはローカルIPしか持っていないので、そのままではドメイン名でアクセスすることは出来ません。
そこで、プライベートネットワークのDNSサーバーに細工をして、プライベートネットワーク内部からドメイン名にアクセスしたときだけFileMaker ServerのローカルIPを返すようにします。
YAMAHAのルーターでは次のようなコマンドで設定できます。(この例ではFileMaker ServerのIPアドレスが192.168.100.100という想定)
ip host [ドメイン名] 192.168.100.100
動作確認
FileMaker proのメニューから「ファイル」→「共有ファイルを開く」でドメイン名にアクセスします。
リストに出てこない場合は「お気に入りのホストを追加します。」アイコンから追加しましょう。
ファイル一覧からファイルを開いた後、ウィンドウ左下(15の場合)か右上(16の場合)に緑色の鍵アイコンが表示されれば成功です。
注意事項
Let's Encryptの証明書は3か月ごとに更新する必要があります。
今回は手動で実行しましたが、実運用では自動更新する仕組みを作らないと大変です。
そもそもFileMaker社はLet's Encrypt発行の証明書を公式にサポートしていないので、全て自己責任でお願いします。