Help us understand the problem. What is going on with this article?

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

ウェブクルー 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日までどうかお付き合いよろしくお願いいたします!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした