こんにちは、ドローンがめちゃくちゃ欲しくなって毎日手を滑らせかけてます石川です。
ちょっとした理由からOTPをSSL(TLS)化しなきゃいけなかったのでその手順について記しておきます。
Why SSL(TLS)?
ある日開発をしているとある問題が起きていました。
そう、Mixed Contentです。HTTPS通信とHTTP通信をページ内で混在させてはいけないというアレです。詳しいことはGoogleのガイドページが詳しそうなのでそちらをどうぞ。
まあよくある話なんですがApacheとかNginxで動いてるものなら証明書を食わせてそれっぽいポートで接続しに行けば解決できます。
ただ今回は違った……
OpenTripPlannerくん
少し前からチラホラこのブログ内に登場しているOTPくん、実はjavaのGrizzly Serverで動いています。
OTPに関しての記事は以下をどうぞ
いざ、SSL(TLS)対応!
「まあそれっぽくやればできるでしょ」
まずは調べます。
すると Security - OpenTripPlannerというページが!
ン……?
self-signed key for testing
自己署名証明書使ってるのね……
テスト用だとこれでいいですが実際に使うことを考えるとブラウザから警告が出てまともに使えないので別手段を考えないといけません。
ともあれ、証明書を食わせることはできるみたいなので用意してあげましょう。
証明書準備
証明書ですが数年前から無料でSSL(TLS)証明書を発行してくれるサービスがあるので利用します。
まずはVMに証明書を作ってくれるクライアントを入れます。
今回はUbuntu 18.04で行っています。
Bashsudo apt install certbot
インストールできたら実行しましょう。
Bashsudo certbot certonly -d (VMのドメイン名) --email (運営者のメールアドレス)
ここでエラーが出る場合は80番ポートが使用中でないか確認しましょう。もちろん、外から繋がるように開放も必須です。
Congraturations!とか出てきたら成功です。以下のパスに証明書が作成されています。
/etc/letsencrypt/live/(ドメイン名)/
証明書を食わせる
証明書できたから食わせたらできるな~~~
そんなことはなかった……
certbotで作成してくれる証明書の形式はpem形式、OTPはJKS形式じゃないと食ってくれない……
詰んだ……
いや変換すればいいじゃん!
証明書を変換する
OpenSSLが必要なのでとりあえず入れます。
Bashsudo apt install openssl
あとはゴリゴリ変換するだけです。
Bashsudo openssl rsa -des3 -in /etc/letsencrypt/live/(ドメイン名)/privkey.pem -out key.encrypted.pem
sudo openssl pkcs12 -inkey key.encrypted.pem -in /etc/letsencrypt/live/(ドメイン名)/cert.pem -export -out key.encrypted.pkcs12
sudo keytool -importkeystore -srckeystore key.encrypted.pkcs12 -srcstoretype pkcs12 -destkeystore keystore
これで変換完了です。
OTPに食わせる場合、途中でパスワードを求められますがすべて opentrip
じゃないと食ってくれません。
偏食がすぎるぞ。
証明書を配置する
OTPが読みに行くディレクトリに配置してあげるだけです。ないならディレクトリから作ってください。
Bashsudo cp keystore /var/otp
あとは起動すると証明書を読み込んでくれます。ポートは8080ではなく8081で接続しましょう。
SSL(TLS)化完了!
さよならMixed Content!
おつかれさまでした。