ウェブクルー AdventCalendar 1日目の記事です。
今年のウェブクルーアドベントカレンダーは@kouchanne からスタートします
よろしくお願いします!
About me
@kouchanne はウェブクルーに2017年に新卒で入社した、今年3年目のバックエンドエンジニアです。(業務ではVue.js等も触ってますが…)
カレンダーの作者が何を隠そう私なので、トップバッターを飾らせていただきましたw
1日目は簡単に、今年業務で一番ハマったもと思うものの中から一つ書かせていただければと思います。
ハマったこと
ウェブクルーでは、バックエンドの実装で scala x play を使って実装しているのですが、
playのWSを使い、自社ドメインのAPIへリクエストを送ったときに返り値の WSRequest ではないエラーが返ってきた…
原因
APIと通信するときに使うSSL証明書(公開鍵)が使用しているJDKにデフォルトで入っていなかった
原因を特定するためにやったこと
- 処理自体を
Try
catch
で囲んで拾ってみる ⇒ 拾えなかった -
JVMOption
に -Xdebugを追加して、拾えるものをとにかく拾ってみる ⇒ APIの通信をしている付近のログで、なにか失敗らしきものを発見 - 内容を見てみるとSSLの証明書の認証に失敗しているっぽいことが発覚
原因を解決するためにやったこと
- 証明書周りでエラーが起きていることが分かったので
java store 証明書 エラー
で調べてみる ⇒ 「Javaの環境に手動で証明書をインストールする」みたいなものがヒットする - local環境のJDKにAPIのドメインで使っている証明書をインストールして実行してみる ⇒ 動いた
※サラッと書いてますが、ここに到達するのに5日くらいかかりましたw
本題
ローカルで動かすまではJDKに直接証明書をインストールするだけなので、良かったのですが
それをDockerFileでやっている人があまりいなかったので、共有します。
やり方
準備
- dockerコンテナが読み取れる場所に
hogehoge.cer
を配置する- 私は直接Githubにソースとして配置しています。
DockerFileに突っ込む
RUN keytool -noprompt -storepass changeit -import -alias play -keystore /usr/lib/jvm/java-1.8-openjdk/jre/lib/security/cacerts -file /home/work/hogehoge.cer
option説明
-
-noprompt
オプションでimport時の確認を省略することができる -
-storepass
パスワードを入力 Javaのkeysotreのデフォルトパスワードは changeit -
-keystore
keystoreの場所は使用しているimageに合わせてください$JAVA_HOME/jre/lib/security/cacerts とかでも良いかも -
-file
突っ込んだ証明書を指定
ポイント
- 通常のサーバーだと
keystore
ごと書き換えることが一般的らしいが、Dockerでは最新のversionでも対応できるようにkeytool
で個別にimportするのが理想 - play等のアプリケーションを起動するユーザーは
root
ではなくユーザーを切り替えるのが一般的ですが、証明書のインポートはroot
ユーザーしかできないため、ユーザーを切り替える前に対応する必要があります。
まとめ
DockerFileでSSL証明書のインポートする手順を書かせていただきました。
基本的に有名所の証明書を使っていれば、デフォルトで入っているのでハマることはないのですが、開発環境用の自己証明書とか比較的お安めの証明書の場合に発生するレアケースなので、あまり使わないかもしれませんが…
SSL証明書系の設定はどちらかというとインフラ寄りだと思いますが、
アプリケーションを開発しているときに、出ると普段あまり触らない領域でハマることになるのでバックエンドエンジニアもインフラの知識は最低限必要だと言うことをこの体験を通じて痛感しました。
さいごに
1日目はこんな形で締めくくらせていただきます。
今年のカレンダーはエンジニア以外の方にも記事を書いてもらうので、いろんな内容を楽しんでいただければと思います。
25日までどうかお付き合いよろしくお願いいたします!