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

X.509 認証

概要

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

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

Spring Security で証明書を使用する前に、証明書の使用とサーブレットコンテナーのクライアント認証の設定に精通している必要があります。ほとんどの作業は、適切な証明書とキーの作成とインストールです。例: Tomcat を使用している場合は、こちらの手順 https://tomcat.apache.org/tomcat-9.0-doc/ssl-howto.html (英語) を参照してください。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 で保護されたオブジェクトにアクセスできません。