Spring BootでMVCを自己署名証明書(オレオレ証明書)を使ってHTTPSでListenさせる方法
オレオレ証明書を使ってSpring Bootをhttpsで起動させてると、macがcatalinaでブラウザがchromeの場合にアクセスしてもERR_CERT_REVOKED
と表示されて先に進めない(警告を無視するオプションが提示されない)事象に出くわして4時間溶けました。
めちゃくちゃハマって辛かったので未来の自分と同じことにハマってる誰かのために記事を残しておきます。
何が起きていたか
macOSがCatalinaでブラウザがChromeだと動かないという事象が起きていました。
Spring BootでMVCをhttpsを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
なお、対話モードをスキップするために-dname
とstorepass
も入ってますがここはお好みです。
また、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で書く必要があります。
-
ググっては試すの繰り返し。証明書の仕様に詳しくないのでtry & errorが早いと判断した↩