使用Maven打包bouncycastle出現JCE cannot authenticate the provider BC的原因及解決辦法


先說解決方法 

1、推薦使用官方建議的使用jar in jar插件

官方文檔 https://pulsar.apache.org/docs/zh-CN/security-bouncy-castle/

打包插件 https://github.com/nthuemmel/executable-packer-maven-plugin

(如果你使用的是eclipse打包 直接有選項可以實現jar in jar。不需要使用插件)

 

插件使用方法  mainClass為啟動類。還有一些其他功能配置 可以自行在git倉庫查看

<plugin>
    <groupId>de.ntcomputer</groupId>
    <artifactId>executable-packer-maven-plugin</artifactId>
    <version>1.0.1</version>
    <configuration>
        <mainClass>com.example.MyMainClass</mainClass>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>pack-executable-jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

 

 

2、網上普遍使用的修改jre環境(不推薦)

將使用的bouncycastle jar包直接扔到jre/lib/ext下

再修改 jre/lib/security/java.security 添加一行security.provider.X=org.bouncycastle.jce.provider.BouncyCastleProvider (X為按實際內容順序的數字)

不推薦的原因是你的jar大概率不是你自己用的。而你可能很難去改所有使用者的jre環境

 

 

有興趣的可以繼續往下看看原因

問題原因

其實原因也很簡單 當在編輯器里運行的時候 使用的jar包是maven下載好的引用

而當使用maven打包的時候 mvn會將引用的jar包 解包然后重新打包(具體maven為什么這么做 我沒有深入研究 如有大神請不吝賜教)

但是因為bouncycastle包有簽名 maven的解包操作導致了簽名失效 從而無法再使用。而本地的jre環境也沒有這個jar包 就導致了JCE無法驗證。

這也是為什么可以直接把jar包扔到jre里可以解決這個問題。

 

最后說說executable-packer-maven-plugin插件做了啥

首先會將所有依賴的第三方jar包直接打到你的jar包中。然后修改啟動類為他的ExecutableLauncher

這個類會在啟動時加載所有的第三方jar包 最后再反射啟動你真正要用的mainClass

功能很簡單 有興趣的可以看看源碼

 

如果大家有什么其他方法 或者有什么不明白的歡迎留言

完結撒花


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM