FileMaker
letsencrypt

Let's EncryptでFileMaker ServerをSSL化

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の場合)に緑色の鍵アイコンが表示されれば成功です。
スクリーンショット 2018-01-09 15.45.45.png キャプチャ.PNG

注意事項

Let's Encryptの証明書は3か月ごとに更新する必要があります。
今回は手動で実行しましたが、実運用では自動更新する仕組みを作らないと大変です。
そもそもFileMaker社はLet's Encrypt発行の証明書を公式にサポートしていないので、全て自己責任でお願いします。