JBoss 7.1.1 部署使用 `bcprov-jdk16-146.jar` 的應用,啟動報 `java.lang.SecurityException: JCE cannot authenticate the provider BC`。
JBoss 模組類載入器隔離導致 BouncyCastle 簽名驗證失敗。JCE 要求 Provider JAR 必須經過**官方簽名**,且由**系統類載入器**或**受信任模組**載入。應用內嵌 JAR 會被應用類載入器載入,簽名驗證通過但不被 JCE 信任。
$JBOSS_HOME/modules/org/bouncycastle/main/
├── bcprov-jdk16-146.jar
└── module.xml
<module xmlns="urn:jboss:module:1.1" name="org.bouncycastle">
<resources>
<resource-root path="bcprov-jdk16-146.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="sun.jdk"/>
</dependencies>
</module>
<subsystem xmlns="urn:jboss:domain:ee:1.0">
<global-modules>
<module name="org.bouncycastle" slot="main"/>
</global-modules>
</subsystem>
Security.insertProviderAt(new org.bouncycastle.jce.provider.BouncyCastleProvider(), 1);
仍需模組可見性,且簽名驗證問題依存。
JBoss 7+ **必須**將 BouncyCastle 安裝為**全域模組** (`global-modules`),移除應用內嵌 JAR,才能通過 JCE 簽名驗證並被所有應用共享。