首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JBoss 7.1.1 部署 BouncyCastle Provider 解決 JCE cannot authenticate the provider BC

     編輯:程式設計綜合問答

錯誤現象

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 Module 方式

  1. 建立模組目錄結構**:
    $JBOSS_HOME/modules/org/bouncycastle/main/
    ├── bcprov-jdk16-146.jar
    └── module.xml
  2. 編寫 `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>
  3. 修改 `standalone.xml` 將模組加入系統模組**:
    <subsystem xmlns="urn:jboss:domain:ee:1.0">
        <global-modules>
            <module name="org.bouncycastle" slot="main"/>
        </global-modules>
    </subsystem>
  4. 移除應用內的 `bcprov*.jar`**:`WEB-INF/lib`、`EAR/lib` 皆不可包含。
  5. 重啟 JBoss**。

為何不放 `JAVA_HOME/jre/lib/ext`?

  • JBoss 模組系統不掃描 `ext` 目錄,類載入器隔離導致 `ClassNotFoundException: org.bouncycastle.jce.provider.BouncyCastleProvider`。
  • 污染系統 JRE,影響其他應用。

替代:程式碼動態註冊 (不推薦)

Security.insertProviderAt(new org.bouncycastle.jce.provider.BouncyCastleProvider(), 1);

仍需模組可見性,且簽名驗證問題依存。

結論

JBoss 7+ **必須**將 BouncyCastle 安裝為**全域模組** (`global-modules`),移除應用內嵌 JAR,才能通過 JCE 簽名驗證並被所有應用共享。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved