1. 概要

安全な通信は、最新のアプリケーションで重要な役割を果たします。 プレーンHTTPを介したクライアントとサーバー間の通信は安全ではありません。 本番環境に対応したアプリケーションの場合、アプリケーションでTLS(Transport Layer Security)プロトコルを介してHTTPSを有効にする必要があります。 このチュートリアルでは、Spring BootアプリケーションでTLSテクノロジーを有効にする方法について説明します。

2. TLSプロトコル

TLSは、クライアントとサーバー間で転送されるデータを保護し、HTTPSプロトコルの重要なコンポーネントです。 Secure Sockets Layer(SSL)とTLSは同じ意味で使用されることがよくありますが、同じではありません。 実際、TLSはSSLの後継です。 TLSは、一方向または双方向のいずれかで実装できます。

2.1. 一方向TLS

一方向TLSでは、クライアントのみがサーバーを検証して、信頼できるサーバーからデータを受信していることを確認します。 一方向TLSを実装するために、サーバーはその公開証明書をクライアントと共有します。

2.2. 双方向TLS

双方向TLSまたは相互TLS(mTLS)では、クライアントとサーバーの両方が相互に認証して、通信に関与する両方の当事者が信頼されていることを確認します。 mTLSを実装するために、両方の当事者が互いに公開証明書を共有します。

3. SpringBootでのTLSの構成

3.1. キーペアの生成

TLSを有効にするには、パブリック/プライベートキーペアを作成する必要があります。 このために、keytoolを使用します。 keytool コマンドには、デフォルトのJavaディストリビューションが付属しています。 keytool を使用してキーペアを生成し、それをkeystore.p12ファイルに保存してみましょう。

keytool -genkeypair -alias baeldung -keyalg RSA -keysize 4096 \
  -validity 3650 -dname "CN=localhost" -keypass changeit -keystore keystore.p12 \
  -storeType PKCS12 -storepass changeit

keystoreファイルはさまざまな形式にすることができます。 最も一般的な2つの形式は、Java KeyStore(JKS)とPKCS#12です。 JKSはJavaに固有ですが、PKCS#12は、公開鍵暗号化標準(PKCS)で定義されている標準ファミリーに属する業界標準形式です。

3.2. SpringでのTLSの構成

一方向TLSを構成することから始めましょう。 application.propertiesファイルでTLS関連のプロパティを構成します。

# enable/disable https
server.ssl.enabled=true
# keystore format
server.ssl.key-store-type=PKCS12
# keystore location
server.ssl.key-store=classpath:keystore/keystore.p12
# keystore password
server.ssl.key-store-password=changeit

SSLプロトコルを構成するときは、TLSを使用し、サーバーにTLS1.2を使用するように指示します。

# SSL protocol to use
server.ssl.protocol=TLS
# Enabled SSL protocols
server.ssl.enabled-protocols=TLSv1.2

すべてが正常に機能することを検証するには、SpringBootアプリケーションを実行する必要があります。

3.3. SpringでのmTLSの構成

mTLSを有効にするには、client-auth属性をneed値とともに使用します。

server.ssl.client-auth=need

need 値を使用する場合、クライアント認証が必要であり、必須です。 これは、クライアントとサーバーの両方が公開証明書を共有する必要があることを意味します。 クライアントの証明書をSpring Bootアプリケーションに保存するには、 truststore ファイルを使用し、application.propertiesファイルで構成します。

#trust store location
server.ssl.trust-store=classpath:keystore/truststore.p12
#trust store password
server.ssl.trust-store-password=changeit

truststore への場所のパスは、SSLサーバー認証のためにマシンによって信頼されている認証局のリストを含むファイルです。 truststore パスワードは、truststoreファイルにアクセスするためのパスワードです。

4. TomcatでのTLSの構成

デフォルトでは、Tomcatの起動時にTLS機能のないHTTPプロトコルが使用されます。 TomcatでTLSを有効にするには、server.xmlファイルを構成します。

<Connector
  protocol="org.apache.coyote.http11.Http11NioProtocol"
  port="8443" maxThreads="200"
  scheme="https" secure="true" SSLEnabled="true"
  keystoreFile="${user.home}/.keystore" keystorePass="changeit"
  clientAuth="false" sslProtocol="TLS" sslEnabledProtocols="TLSv1.2"/>

mTLSを有効にするには、 clientAuth =” true”を設定します。

5. HTTPSAPIの呼び出し

REST APIを呼び出すには、curlツールを使用します。

curl -v http://localhost:8443/baeldung

https を指定しなかったため、エラーが出力されます。

Bad Request
This combination of host and port requires TLS.

この問題は、httpsプロトコルを使用することで解決されます。

curl -v https://localhost:8443/baeldung

ただし、これにより別のエラーが発生します。

SSL certificate problem: self signed certificate

これは、自己署名証明書を使用している場合に発生します。 これを修正するには、クライアントリクエストでサーバー証明書を使用する必要があります。 まず、サーバー証明書baeldung.cerをサーバーkeystoreファイルからコピーします。 次に、 curl リクエストで、 –cacertオプションとともにサーバー証明書を使用します。

curl --cacert baeldung.cer https://localhost:8443/baeldung

6. 結論

クライアントとサーバー間で転送されるデータのセキュリティを確保するために、TLSは一方向または双方向のいずれかで実装できます。 この記事では、SpringBootアプリケーションでTLSを構成する方法をapplication.propertiesファイルとTomcat構成ファイルで説明します。 いつものように、このチュートリアルで使用されるすべてのコードサンプルはGitHubで入手できます。