ネイティブ・イメージのJCAセキュリティ・サービス
この項では、Java暗号化アーキテクチャ(JCA)フレームワークによって提供されるサービスの使用について説明します。詳細は、JDK8およびJDK11のガイドを参照してください。
JCAフレームワークは、プロバイダ・アーキテクチャを使用して、デジタル署名、メッセージ・ダイジェスト、証明書と証明書検証、暗号化(対称/非対称ブロック/ストリーム暗号)、キーの生成と管理、および安全な乱数生成などのセキュリティ・サービスにアクセスします。アルゴリズムの独立性と拡張性を実現するには、リフレクションに依存するため、ネイティブ・イメージでのカスタム構成が必要です。デフォルトでは、ネイティブ・イメージ・ビルダーは静的分析を使用して、これらのサービスのうちどれが使用されているかを検出します(詳細は、次の項を参照してください)。セキュリティ・サービスの自動登録は、-H:-EnableSecurityServicesFeature
で無効にできます。次に、カスタム・リフレクション構成ファイルまたは機能を使用して、特定のアプリケーションに必要なセキュリティ・サービスを登録できます。セキュリティ・プロバイダの自動登録が無効になっている場合、すべてのプロバイダはセキュリティ機能に必要な特別なJDKキャッシュからデフォルトでフィルタ処理されることに注意してください。この場合、使用するプロバイダに-H:AdditionalSecurityProviders
を使用して手動でマークする必要があります。
セキュリティ・サービスの自動登録
このメカニズムは、com.oracle.svm.hosted.SecurityServicesFeature
クラスで実装され、どのセキュリティ・サービスを使用するかを判断するために、JCAフレームワークの特定のAPIメソッドの到達可能性を使用します。
各JCAプロバイダは、サポートするアルゴリズムの具象実装クラスを登録します。各サービス・クラス(Signature
、Cipher
、Mac
、KeyPair
、KeyGenerator
、KeyFactory
、KeyStore
など)は、具象サービス実装を提供する一連のgetInstance(<algorithm>, <provider>)
ファクトリ・メソッドを宣言します。特定のアルゴリズムが要求されると、フレームワークは、登録されたプロバイダで対応する実装クラスを検索し、具象サービス実装のオブジェクトを動的に割り当てます。ネイティブ・イメージ・ビルダーは、静的分析を使用して、これらのサービスのどれが使用されているかを検出します。これは、各getInstance()
ファクトリ・メソッドの到達可能性ハンドラを登録することによって行われます。実行時にgetInstance()
メソッドに到達可能であると判断されると、対応するサービス・タイプのすべての具象実装に対してリフレクション登録が自動的に実行されます。
セキュリティ・サービスの自動登録のトレースは、-H:+TraceSecurityServices
を使用して有効化できます。レポートには、登録されているすべてのサービス・クラス、登録をトリガーしたAPIメソッド、および到達可能な各APIメソッドの解析コンテキストの詳細が表示されます。
ノート: --enable-all-security-services
オプションは非推奨になり、将来のリリースでは削除される予定です。
プロバイダ登録
ネイティブ・イメージ・ビルダーでは、基礎となるJVMからプロバイダのリストとそれらの優先順位が取得されます。プロバイダの順序は、<java-home>/lib/security/java.security
の下のjava.security
ファイルで指定されます。新しいセキュリティ・プロバイダを実行時に登録することはできません。いずれのプロバイダもネイティブ・イメージのビルド時に静的に構成する必要があります。
実行時のプロバイダの順序変更
実行時にセキュリティ・プロバイダの順序を変更できますが、既存のプロバイダ・インスタンスのみを使用できます。たとえば、BouncyCastleプロバイダがビルド時に登録され、実行時に位置1に挿入する場合:
Provider bcProvider = Security.getProvider("BC");
Security.removeProvider("BC");
Security.insertProviderAt(bcProvider, 1);
SecureRandom
SecureRandom実装は、エントロピのソースとして使用される/dev/random
および/dev/urandom
ファイルを開きます。これらのファイルは通常、クラス初期化子で開かれます。ネイティブ・イメージ・ビルダーを実行するマシンから状態が取得されることがないように、実行時にこれらのクラスを初期化する必要があります。
カスタム・サービス・タイプ
デフォルトでは、JCAで指定されたサービスのみが自動的に登録されます。カスタム・サービス・タイプを自動的に登録するには、-H:AdditionalSecurityServiceTypes
を使用します。自動登録が機能するには、サービス・インタフェースにgetInstance
メソッドがあり、サービス・タイプと同じ単純名が必要であることに注意してください。前述の要件に準拠しないサード・パーティ・コードに依存する場合は、手動構成が必要になります。その場合、このようなサービスのプロバイダは、-H:AdditionalSecurityProviders
を使用して明示的に登録する必要があります。これらのオプションは、非常に特殊なケースでのみ必要であり、通常は必要ないことに注意してください。