Spring BootでMVCを自己署名証明書(オレオレ証明書)を使ってHTTPSでListenさせる方法

オレオレ証明書を使ってSpring Bootをhttpsで起動させてると、macがcatalinaでブラウザがchromeの場合にアクセスしてもERR_CERT_REVOKEDと表示されて先に進めない(警告を無視するオプションが提示されない)事象に出くわして4時間溶けました。

めちゃくちゃハマって辛かったので未来の自分と同じことにハマってる誰かのために記事を残しておきます。

何が起きていたか

macOSがCatalinaでブラウザがChromeだと動かないという事象が起きていました。

Spring BootでMVChttpsをlistenさせる方法はググるとたくさん出てくるので簡単だと思っていたのですが全然そんなことありませんでした…。

どうも、Catalinaになったタイミングでセキュリティが厳しくなった?っぽいです。

keytoolのオプションの組み合わせや設定値をいろいろ工夫してもうまく動かず途方にくれていました。

ググるこんなのが出てきたりします。mojaveじゃ起きないらしいですが、私は試していません。

回避方法がないかkeytool localhost certificate chrome ”ERR_CERT_REVOKED"あたりのキーワードでいろいろググってると、海外のどっかの会社のなにかのプロダクトで同じ問題がおきていたらしく、そのコメントのやり取りの中にこのコマンドで再作成すれば動くようになったぜ(超意訳)!ってのを見つけて、動かすために必要なkeytoolのオプションを特定することができました。

Spring Bootで自己署名証明書オレオレ証明書)でHTTPS通信を受け付けるための設定

というわけで、それを踏まえた上で設定手順を書き出していきます。

動作確認環境

  • Spring Boot 2.1.2
    • 2.x系なら同じ設定で動くと思います。
  • macOS Catalina 10.15.2
    • mojaveなら再現しないっぽい…

自己署名証明書作成手順

以下のコマンドで作成できます。

$ keytool -genkey -alias localhost -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore /pass/to/your/keystore.p12 -dname "CN=localhost" -storepass yourpassword -ext ExtendedKeyUsage=serverAuth -validity 825

ポイントは次の2点です。

  • 有効期限を825日以下にする
  • -ext ExtendedKeyUsage=serverAuthのオプションを追加する ※X.509 証明書の拡張機能

この2点を突き止めるのにすごく時間がかかりました。1

なお、対話モードをスキップするために-dnamestorepassも入ってますがここはお好みです。

また、storetypeはPKCS12を指定していますが別にJWSでも問題なく動きました。

Spring Bootの設定内容

server:
  port: 8443 #任意のポート番号で良い
  ssl:
    enabled: true # sslのセクションがある時点でtrueがデフォルトなので省略可
    key-store: /path/to/your/keystore.p12
    key-store-password: yourpassword
    key-store-type: PKCS12
    key-alias: localhost

たったこれだけでhttpsでlistenするように変わっているはずです。

おまけ

httpsでlistenする場合、加えてhttpsのみ通信を許可する設定をいれたくなるかもしれませんが、1.x系で存在していたsecurity.require-ssl=trueが2.x系では削除されているのでJavaで書く必要があります。


  1. ググっては試すの繰り返し。証明書の仕様に詳しくないのでtry & errorが早いと判断した