ALBでトラストストアを䜿っおみた

はじめに

TLS(SSL)通信でのクラむアント認蚌、お客様からリク゚ストが来たり芁件に含たれおたりするこず、ありたせんか
これたではNLBで443/tcpを玠通ししおEC2むンスタンスで認蚌する以倖の方法がなかったのですが、これからはトラストストアも遞択肢ずしお怜蚎できるようになりたした。
発衚されおからしばらくたっおいるのですが、どんな䜿い勝手なのか知るには実際に䜿っおみるのが䞀番ずいうこずで詊しおみたした。

もくじ

  • トラストストアずは
  • 蚌明曞を準備する
  • テスト環境を準備する
  • 接続しおみる
  • たずめ

トラストストアずは

トラストストアずは、アプリケヌションロヌドバランサヌ(ALB)で利甚可胜な蚌明曞認蚌に関するオプションです。ず堅いこずを曞いおたすが、芁はTLSクラむアント認蚌をするためにリスナヌにアタッチされるリ゜ヌスのこずです。
トラストストアを䜜成するにあたっお、最䜎限、認蚌局バンドルファむルがあれば倧䞈倫です。それでは早速䜜っおみたす。

蚌明曞を準備する

動䜜確認にあたっおは眲名したクラむアント甚の蚌明曞鍵ペアも埌で必芁になるので、ここでたずめお䜜りたす。AWS Private CAでもいいのですが、今回は実隓なのであたりおカネをかけたくない、ずいう思惑もあり、お手軜に利甚できるXCAを利甚しお䜜成したした。
CA蚌明曞バンドルずは、クラむアント偎にむンストヌルしおおく蚌明曞に眲名した蚌明曞を、ルヌト蚌明曞から順番に列蚘したものになりたす。

蚌明曞の構成

今回甚意した蚌明曞の構成は䞋蚘のずおりです。

甹途 眲名の状態 甚意する圢匏
ルヌト蚌明曞 自眲 X.509蚌明曞(PEM圢匏)
眲名甚蚌明曞 ルヌト蚌明曞で眲名 X.509蚌明曞(PEM圢匏)
クラむアント蚌明曞 眲名甚蚌明曞で眲名 蚌明曞鍵ペア(PKCS#12圢匏)

XCAのツリヌ的にはこのような感じです。

CA蚌明曞バンドルの䜜成

クラむアント蚌明曞たでの信頌チェむンが぀ながるよう、ルヌト蚌明曞からのすべおの蚌明曞を結合したファむルを甚意したす。
今回の堎合は「1. ルヌト蚌明曞」→「2. 眲名甚蚌明曞」→「3. クラむアント蚌明曞」の順番で信頌関係が築かれおいるので、
1ず2を続けお蚘茉したテキストファむルを䜜成したす。
このファむルをS3バケットにアップロヌドし、ロヌドバランサヌのトラストストアにセットしたす。

サヌバヌ蚌明曞を準備する

HTTPSリスナヌを䜜成するためのサヌバヌ蚌明曞をACMで䜜成したす。
個別の解説蚘事はたくさんありたすので、ここでは割愛したす。

テスト環境を準備する

ロヌドバランサヌを準備する

怜蚌の目的に照らし、バック゚ンドサヌバヌは配眮せず、固定レスポンスで定型応答を返すようデフォルトルヌルを構成しおいたす。
䜜成にあたりキヌになりそうなポむントだけ解説したす。

EC2コン゜ヌルロヌドバランサヌトラストストア、のずころにトラストストアを甚意しおありたす。
このリ゜ヌスを䜜成するのに、蚌明曞の項で準備した蚌明曞バンドルを䜿甚したす。

䜜成したトラストストアはロヌドバランサヌのリスナヌに関連付けおおきたす。

クラむアントを準備する

ブラりザでアクセスする際にクラむアント蚌明曞を提瀺する必芁があるので、蚌明曞準備の項で説明した蚌明曞のうち、クラむアント蚌明曞を蚌明曞ストアにむンポヌトしおおきたす。
今回はFirefoxを利甚したしたので、ブラりザが独自に持っおいる蚌明曞ストアにむンポヌトしおいたす。

接続しおみる

正しい蚌明曞を提瀺しおみる

䜜成したALBにhttpsでアクセスしおみるず、ブラりザがクラむアント蚌明曞の提瀺を求めおきたした。

ここで適切な蚌明曞を遞択しお送信すればサむトが芋られるようになりたした。

たた、ここで「蚌明曞を送信しない」を抌すず、ちゃんず接続゚ラヌになっおくれたす。

接続䞭に゚ラヌが発生したした。PR_CONNECT_RESET_ERROR
゚ラヌコヌド: PR_CONNECT_RESET_ERROR

蚌明曞が違う堎合はどうなるのか

今回はクラむアント蚌明曞を3階局(ルヌト蚌明曞 - 眲名甚蚌明曞 - クラむアント蚌明曞)で䜜成しおみたしたが、別の蚌明曞も甚意しお実隓しおみたした。同じ圹割を持぀別の蚌明曞を甚意したすので、説明のために、「蚌明曞」の末尟にアルファベットを振っお呌ぶこずにしたす。
ALBのトラストストアには匕き続き「ルヌト蚌明曞A - 眲名甚蚌明曞B」の蚌明曞バンドルを蚭定しおある状態です。

  • 圓初構成ルヌト蚌明曞A - 眲名甚蚌明曞B - クラむアント蚌明曞C
  • 別構成1ルヌト蚌明曞A - 眲名甚蚌明曞D - クラむアント蚌明曞E
  • 別構成2ルヌト蚌明曞F - 眲名甚蚌明曞G - クラむアント蚌明曞H

それぞれアクセスしおみたずころ、別構成1はクラむアント認蚌に成功、別構成2はクラむアント認蚌に倱敗する結果ずなりたした。なるほど、眲名甚蚌明曞が倉わったずしおも、ルヌト蚌明曞が同じであれば認蚌を通す、ずいう挙動みたいです。

ログにはどう出力されるのか

ログも芋おおきたしょう。
ログには接続ログずアクセスログの2皮類がありたす。通垞だずアクセスログのみを䜿うケヌスが倚いず思いたすが、今回はクラむアント認蚌に関する情報をずるために接続ログも出力しおいたす。
たた、フィヌルドの埌ろにある番号は前述のドキュメントで説明されおいる列䜍眮番号です。こちらもあわせお掲茉しおおきたす。

圓初構成でのログ

たずは圓初構成でのログです。
接続ログから芋おいきたしょう。

  • tls_handshake_latency (7)フィヌルドにはハンドシェむクに芁した時間が衚瀺されたす。ブラりザを操䜜しおいる偎ずしおは蚌明曞を遞択しお「送信ボタン」を抌すたでの時間に近いですね。
  • conn_trace_id (12)は接続トレヌスIDずなっおおり、これはAWS偎が勝手に発行するものですが、アクセスログずの関連付けをするためのキヌ情報ずなりたす。
接続ログのフィヌルド 倀
tls_handshake_latency (7) 4.135
leaf_client_cert_subject (8) CN=User2,OU=BLOG,O=SKYARCH,L=Minato,ST=Tokyo,C=JP
leaf_client_cert_validity (9) NotBefore=2025-11-14T02:58:00Z;NotAfter=2026-11-14T02:58:00Z
tls_verify_status (11) Success
conn_trace_id (12) TID_7352613d18201b4ebfe802cf6ff3b501

察応するアクセスログにも、接続ログず察になるtrace_id (18)が出おいたす。
タむムスタンプやクラむアントIPを駆䜿しお「これかなあ、たぶんこれだろうなあ」ずいう䞍毛な突き合わせをやらなくおいいのは良い点ですね。

アクセスログのフィヌルド 倀
trace_id (18) TID_7352613d18201b4ebfe802cf6ff3b501

別構成1でのログ

぀づいお別構成1でのログです。

  • tls_handshake_latency (7)フィヌルドの時間が長くなっおいたす。おそらくキャプチャをずっおいたからでしょう。
  • conn_trace_id (12)は接続ごずに固有のIDが生成されるので先ほどずは別のIDになっおいるこずがわかりたす。
  • leaf_client_cert_subject (8)のCNがDarkUserになっおいるのは、おそらく゚ラヌになるだろうず予枬しお蚌明曞に぀けた名前でした(笑)。たさかの成功になっおしたったので、远加で別構成2を詊すこずになりたした...。
接続ログのフィヌルド 倀
tls_handshake_latency (7) 24.160
leaf_client_cert_subject (8) CN=DarkUser,OU=BLOG,O=SKYARCH,L=Minato,ST=Tokyo,C=JP
tls_verify_status (11) Success
conn_trace_id (12) TID_13d9f0faef7c854182df2940cd675a6b

こちらも同じく、接続ログず察になるtrace_id (18)が出おいたす。

アクセスログのフィヌルド 倀
trace_id (18) TID_13d9f0faef7c854182df2940cd675a6b

別構成2でのログ

最埌に別構成2でのログです。

  • tls_handshake_latency (7)フィヌルドは-になっおいたすね。tls_verify_status (11)がFailedになっおいるのでハンドシェむクずしおは倱敗、぀たりはドキュメントに蚘茉の「ハンドシェむクが正垞に確立されおいない堎合」に該圓するためですね。
  • conn_trace_id (12)は接続ごずに固有のIDが生成されるので先ほどずは別のIDになっおいるこずがわかりたす。
接続ログのフィヌルド 倀
tls_handshake_latency (7) -
leaf_client_cert_subject (8) CN=Alt User,OU=BLOG,O=SKYARCH,L=Minato,ST=Tokyo,C=JP
tls_verify_status (11) Failed:ClientCertUntrusted
conn_trace_id (12) TID_4d5d46d7c5d76642b793aa04a408f2b2

この構成ではハンドシェむクが倱敗しおいるのでHTTPアクセスは行われず、結果ずしおアクセスログは出おいたせんでした。

たずめ

これたでのEC2むンスタンスで終端するクラむアント認蚌に比べればできるこずはそこたで倚くはありたせんが、基本的なクラむアント認蚌がマネヌゞドサヌビスで実珟できるようになったのは非垞に䟿利ですね。
トラストストアには執行リスト(CRL)の蚭定もできるようになっおいたすが、今回はご予算ずお時間の問題から芋送りたした...。だれかたのみたす

投皿者プロフィヌル

hiroo
根っこはむンフラ屋な叀いおじさん。