最新の安定バージョンについては、Spring Security 6.3.1 を使用してください!

X.509 認証

X.509 証明書認証の最も一般的な使用箇所は、SSL を使用する場合、最も一般的にはブラウザーから HTTPS を使用する場合に、サーバーの ID を確認することです。ブラウザーは、サーバーによって提示された証明書が、サーバーが保持している信頼できる認証局のリストの 1 つによって発行された(デジタル署名された)ことを自動的にチェックします。

「相互認証」で SSL を使用することもできます。次に、サーバーは SSL ハンドシェイクの一部としてクライアントに有効な証明書をリクエストします。サーバーは、クライアントの証明書が受け入れ可能なオーソリティによって署名されていることを確認することにより、クライアントを認証します。有効な証明書が提供されている場合は、アプリケーションのサーブレット API を介して取得できます。Spring Security X.509 モジュールは、フィルターを使用して証明書を抽出します。証明書をアプリケーションユーザーにマップし、標準の Spring Security インフラストラクチャで使用するためにそのユーザーに付与された権限のセットをロードします。

「相互認証」で SSL を使用することもできます。次に、サーバーは SSL ハンドシェイクの一部としてクライアントに有効な証明書をリクエストします。サーバーは、クライアントの証明書が受け入れ可能なオーソリティによって署名されていることを確認することにより、クライアントを認証します。例: Tomcat を使用する場合は、TomcatSSL 命令 [Apache] (英語) を読む必要があります。Spring Security で試す前に、これを機能させる必要があります。

Web アプリケーションへの X.509 認証の追加

X.509 クライアント認証の有効化は非常に簡単です。これを行うには、<x509/> 要素を http セキュリティ名前空間構成に追加します。

<http>
...
	<x509 subject-principal-regex="CN=(.*?)," user-service-ref="userService"/>;
</http>

要素には 2 つのオプション属性があります。

  • subject-principal-regex。証明書のサブジェクト名からユーザー名を抽出するために使用される正規表現。デフォルト値は前のリストに示されています。これは、ユーザーの権限をロードするために UserDetailsService に渡されるユーザー名です。

  • user-service-ref。これは、X.509 で使用される UserDetailsService の Bean ID です。アプリケーションコンテキストで定義されているものが 1 つしかない場合は、必要ありません。

subject-principal-regex には単一のグループが含まれている必要があります。例: デフォルトの式(CN=(.*?))は一般名フィールドと一致します。証明書のサブジェクト名が "CN=Jimi Hendrix, OU= … " の場合、これは "JimiHendrix" のユーザー名になります。一致では大文字と小文字は区別されません。"emailAddress=(.*?)," は "EMAILADDRESS= [ メール保護 ] (英語) ,CN= … " と一致し、ユーザー名に "[ メール保護 ] (英語) " を付けます。クライアントが証明書を提示し、有効なユーザー名が正常に抽出された場合、セキュリティコンテキストに有効な Authentication オブジェクトが存在する必要があります。証明書が見つからないか、対応するユーザーが見つからない場合、セキュリティコンテキストは空のままです。これは、フォームベースのログインなどの他のオプションで X.509 認証を使用できることを意味します。

Tomcat で SSL をセットアップする

Spring Security サンプルリポジトリ [GitHub] (英語) には、事前に生成された証明書がいくつかあります。独自に生成したくない場合は、これらを使用してテスト用の SSL を有効にすることができます。server.jks ファイルには、サーバー証明書、秘密鍵、発行オーソリティの証明書が含まれています。サンプルアプリケーションのユーザー用のクライアント証明書ファイルもいくつかあります。これらをブラウザーにインストールして、SSL クライアント認証を有効にすることができます。

SSL をサポートする Tomcat を実行するには、server.jks ファイルを tomcat conf ディレクトリにドロップし、次のコネクターを server.xml ファイルに追加します。

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" scheme="https" secure="true"
			clientAuth="true" sslProtocol="TLS"
			keystoreFile="${catalina.home}/conf/server.jks"
			keystoreType="JKS" keystorePass="password"
			truststoreFile="${catalina.home}/conf/server.jks"
			truststoreType="JKS" truststorePass="password"
/>

クライアントが証明書を提供しなくても SSL 接続を成功させたい場合は、clientAuth を want に設定することもできます。証明書を提示しないクライアントは、フォーム認証などの非 X.509 認証メカニズムを使用しない限り、Spring Security によって保護されているオブジェクトにアクセスできません。