WebSphere LibertyでHTTPSを有効化する


やりたいこと

自作のWebアプリケーションをGoogleのLighthouseにかけてみようと思ったらHTTPS化することが必須のようだったので、LibertyでHTTPSを使う方法を試してみた。

SANが必要

自己署名証明書を利用してHTTPS通信をすれば良いので難しくないと思ったのだが、昔はCommon Name(CN)が設定されていればOKだったが、Chrome 58以降は証明書にSubject Alternative Name(SAN)が登録されていることを要求するため、SANを含む証明書を作る必要がある。

試した環境

  • AdoptOpenJDK HotSpot 11.0.3
  • WebSphere Liberty 19.0.0.4
  • macOS Mojave
  • Chrome 74

デフォルトで生成される証明書はどうなってる?

ssl-1.0またはtransportSecurity-1.0フィーチャーを有効化したWebSphere Libertyを起動するとuser/servers/(server-name)/resources/securitykey.p12というファイルが生成される。このファイルはPKCS12という形式のファイルで中に秘密鍵と公開鍵証明書が保存されている。ファイルにはパスワードがかかっていてserver.xml<keyStore>要素でパスワードを指定する。

内容の確認方法は以下の通り(パスワードは<keyStore>で指定したもの)。default という別名(alias)で証明書が登録されていることがわかる。パスワードを聞かれたくない場合は、-storepassで入力する。

keytool -v -list -storetype pkcs12 -keystore key.p12 

SAN付き証明書の作成手順

秘密鍵を入手してそこからSAN付きの証明書を作っていく。秘密鍵はデフォルトで生成されるp12ファイルから取り出すこともできるようだが(後述)、ここではゼロから作ってみる。iTerm.appだとopensslコマンドの実行時にパスワードを求められた場合のキーボード入力がうまくいかないのでTerminal.appを使った。

# 秘密鍵を作成する
openssl genrsa 2048 > default.key

# Certificate Signing Request(CSR, 証明書署名要求)を作成する
# Country Nameなどを聞かれる。最低限Common Name(CN)はlocalhostとする必要がある
openssl req -new -key default.key > default.csr

# SANがlocalhostとなるように入力ファイルを作成する
echo subjectAltName=DNS:localhost > default-san.ext

# 証明書を作成する
openssl x509 -days 3650 -sha256 -req -signkey default.key < default.csr > default.crt -extfile default-san.ext

# PKCS12形式の鍵ストアを作成する
openssl pkcs12 -export -in default.crt -inkey default.key -out default.p12 -name default

# 作成したp12ファイル内の証明書にSubjectAlternativeNameが記載されていることを確認する
keytool -v -list -keystore default.p12 -storetype pkcs12

Macのキーチェーンに証明書を登録する

キーチェーンアクセス.appを起動して、左ペインから「ログイン」、「証明書」を開く。右のペインに証明書の一覧が表示されるのでここに上記の手順で作成したdefault.crtをドラッグ&ドロップで追加する。追加したらSSLの部分を「常に信頼する」に変更する。

Chromeでアクセスし直すと、自己署名証明書利用時の警告メッセージなくアクセスできる。

参考

p12ファイルからの秘密鍵、証明書の取り出し方

以下のコマンドで取り出せる。前述の通りiTerm.appだとパスワード入力がうまくいかないのでTerminal.appを使った。

# 秘密鍵を取り出す
openssl pkcs12 -in key.p12 -nocerts -nodes -out privatekey
# 証明書を取り出す
openssl pkcs12 -in key.p12 -clcerts -nokeys -out default2.crt

p12かjksか

昔はp12ではなくjks形式だった気がすると思ってOpenLibertyのIssueをのぞいてみたところ19.0.0.3から変わったのかもしれない。一般的にp12が推奨されているっぽい。
- https://github.com/OpenLiberty/open-liberty/issues/7041