ネイティブイメージにおけるJCAセキュリティサービス

このページでは、Java暗号化アーキテクチャ(JCA)フレームワークのネイティブイメージのサポートについて説明します。

JCAフレームワークは、プロバイダーアーキテクチャを使用して、デジタル署名、メッセージダイジェスト、証明書と証明書の検証、暗号化(対称/非対称ブロック/ストリーム暗号)、鍵の生成と管理、安全な乱数生成などのセキュリティサービスにアクセスします。アルゴリズムの独立性と拡張性を実現するために、リフレクションに依存しているため、ネイティブイメージではカスタム構成が必要です。デフォルトでは、native-imageビルダーは静的分析を使用して、これらのサービスのどれが使用されているかを検出します(詳細は次のセクションを参照)。セキュリティサービスの自動登録は、-H:-EnableSecurityServicesFeatureで無効にすることができます。その後、カスタムリフレクション構成ファイルまたは機能を使用して、特定のアプリケーションに必要なセキュリティサービスを登録できます。セキュリティプロバイダーの自動登録が無効になっている場合、デフォルトでは、すべてのプロバイダーがセキュリティ機能に必要な特別なJDKキャッシュから除外されることに注意してください。この場合、使用されているプロバイダーを-H:AdditionalSecurityProvidersで手動でマークする必要があります。

セキュリティサービスの自動登録 #

com.oracle.svm.hosted.SecurityServicesFeatureクラスに実装されているメカニズムは、JCAフレームワーク内の特定のAPIメソッドの到達可能性を使用して、どのセキュリティサービスが使用されているかを判断します。

各JCAプロバイダーは、サポートするアルゴリズムの具体的な実装クラスを登録します。各サービス クラス (SignatureCipherMacKeyPairKeyGeneratorKeyFactoryKeyStore など) は、具体的なサービス実装を提供する一連の getInstance(<algorithm>, <provider> ファクトリメソッドを宣言します。特定のアルゴリズムが要求されると、フレームワークは登録されたプロバイダーを検索して対応する実装クラスを見つけ、具体的なサービス実装のオブジェクトを動的に割り当てます。native-imageビルダーは、静的分析を使用して、これらのサービスのどれが使用されているかを検出します。これは、各getInstance()ファクトリメソッドに到達可能性ハンドラーを登録することによって行われます。実行時にgetInstance()メソッドが到達可能であると判断すると、対応するサービスタイプのすべての実装のリフレクション登録を自動的に実行します。

セキュリティサービスの自動登録のトレースは、-H:+TraceSecurityServicesで有効にすることができます。レポートには、登録されているすべてのサービス クラス、登録をトリガーした API メソッド、および到達可能な各 API メソッドの解析コンテキストが詳述されます。

注:--enable-all-security-servicesオプションは非推奨になり、将来のリリースで削除される予定です。

プロバイダーの登録 #

native-imageビルダーは、基盤となる JVM からプロバイダーのリストとその優先順位を取得します。プロバイダーの順序は、<java-home>/conf/security/java.security の下の java.security ファイルで指定されます。新しいセキュリティプロバイダーを実行時に登録することはできません。すべてプロバイダーは、実行可能ファイルのビルド時に静的に構成する必要があります。

実行時のプロバイダーの並べ替え #

実行時にセキュリティプロバイダーを並べ替えることは可能ですが、既存のプロバイダーインスタンスのみを使用できます。たとえば、ビルド時にBouncyCastleプロバイダーが登録されていて、実行時に位置1に挿入する場合

Provider bcProvider = Security.getProvider("BC");
Security.removeProvider("BC");
Security.insertProviderAt(bcProvider, 1);

SecureRandom #

SecureRandom実装は、ソースとして使用される/latest/randomおよび/latest/urandomファイルを開きます。これらのファイルは通常、クラスイニシャライザーで開かれます。 native-imageビルダーを実行するマシンの状態を取得しないようにするために、これらのクラスは実行時に初期化する必要があります。

カスタムサービスタイプ #

デフォルトでは、JCA フレームワークで指定されたサービスのみが自動的に登録されます。カスタム サービス タイプを自動的に登録するには、 `-H:AdditionalSecurityServiceTypes` オプションを使用します。自動登録が機能するには、サービス インターフェースに `getInstance` メソッドがあり、サービス タイプと同じ名前である必要があることに注意してください。上記の要件に準拠していないサードパーティのコードに依存している場合は、手動構成が必要になります。その場合、そのようなサービスのプロバイダーは、`-H:AdditionalSecurityProviders` オプションを使用して明示的に登録する必要があります。これらのオプションは非常に特殊な場合にのみ必要であり、通常は必要ないことに注意してください。

参考資料 #

お問い合わせ