Native Image 中的 JCA 安全服務

本頁說明 Native Image 對 Java 加密架構 (JCA) 框架的支援。

JCA 框架使用供應商架構來存取安全服務,例如數位簽章、訊息摘要、憑證與憑證驗證、加密 (對稱/非對稱區塊/串流密碼)、金鑰產生與管理,以及安全亂數產生等等。為了達到演算法獨立性和可擴展性,它依賴反射,因此在 Native Image 中需要自訂組態。預設情況下,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 實作會開啟用作來源的 /dev/random/dev/urandom 檔案。這些檔案通常在類別初始化程式中開啟。為了避免擷取執行 native-image 建置器的電腦的狀態,這些類別需要在執行階段初始化。

自訂服務類型 #

依預設,只會自動註冊 JCA 框架中指定的服務。若要自動註冊自訂服務類型,您可以使用 -H:AdditionalSecurityServiceTypes 選項。請注意,若要讓自動註冊正常運作,服務介面必須具有 getInstance 方法,並且與服務類型具有相同的名稱。如果依賴不符合上述要求的協力廠商程式碼,則需要手動組態。在這種情況下,必須使用 -H:AdditionalSecurityProviders 選項明確註冊此類服務的供應商。請注意,這些選項僅在非常特定的情況下才需要,通常不需要。

進一步閱讀 #

與我們聯繫