10
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ウェブクルーAdvent Calendar 2019

Day 1

DockerFileのBuild時に個別のSSL証明書をimportする

Last updated at Posted at 2019-11-30

ウェブクルー AdventCalendar 1日目の記事です。

今年のウェブクルーアドベントカレンダーは@kouchanne からスタートします
よろしくお願いします!

About me

@kouchanne はウェブクルーに2017年に新卒で入社した、今年3年目のバックエンドエンジニアです。(業務ではVue.js等も触ってますが…)

カレンダーの作者が何を隠そう私なので、トップバッターを飾らせていただきましたw
1日目は簡単に、今年業務で一番ハマったもと思うものの中から一つ書かせていただければと思います。

ハマったこと

ウェブクルーでは、バックエンドの実装で scala x play を使って実装しているのですが、
playのWSを使い、自社ドメインのAPIへリクエストを送ったときに返り値の WSRequest ではないエラーが返ってきた…

原因

APIと通信するときに使うSSL証明書(公開鍵)が使用しているJDKにデフォルトで入っていなかった

原因を特定するためにやったこと

  1. 処理自体をTry catch で囲んで拾ってみる ⇒ 拾えなかった
  2. JVMOption-Xdebugを追加して、拾えるものをとにかく拾ってみる ⇒ APIの通信をしている付近のログで、なにか失敗らしきものを発見
  3. 内容を見てみるとSSLの証明書の認証に失敗しているっぽいことが発覚

原因を解決するためにやったこと

  1. 証明書周りでエラーが起きていることが分かったので java store 証明書 エラー で調べてみる ⇒ 「Javaの環境に手動で証明書をインストールする」みたいなものがヒットする
  2. 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日までどうかお付き合いよろしくお願いいたします!

10
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?