解決異常:Invalid?keystore?format,springboot配置ssl證書格式不合法問(wèn)題
一、異常:Invalid keystore format
spring boot下配置ssl,使用jks證書,開始的時(shí)候啟動(dòng)沒(méi)有問(wèn)題,打的第一個(gè)包也沒(méi)有問(wèn)題,但是后來(lái)不斷出現(xiàn)證書格式不合法的異常。
有的時(shí)候就算改了證書名稱,還是出如此錯(cuò)誤。
異常如下:
Caused by: java.lang.IllegalArgumentException: Invalid keystore format
at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:99) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:71) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:218) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1142) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:1228) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:586) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.catalina.connector.Connector.startInternal(Connector.java:1005) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
... 14 common frames omitted
Caused by: java.io.IOException: Invalid keystore format
at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:650) ~[na:1.8.0_20]
at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:55) ~[na:1.8.0_20]
at java.security.KeyStore.load(KeyStore.java:1433) ~[na:1.8.0_20]
at org.apache.tomcat.util.security.KeyStoreUtil.load(KeyStoreUtil.java:69) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.tomcat.util.net.SSLUtilBase.getStore(SSLUtilBase.java:217) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.tomcat.util.net.SSLHostConfigCertificate.getCertificateKeystore(SSLHostConfigCertificate.java:206) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.tomcat.util.net.SSLUtilBase.getKeyManagers(SSLUtilBase.java:283) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.tomcat.util.net.SSLUtilBase.createSSLContext(SSLUtilBase.java:247) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:97) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
... 20 common frames omitted
二、出現(xiàn)問(wèn)題的原因
1、原因
會(huì)出現(xiàn)Invalid keystore format 不合法的證書秘鑰庫(kù)的主要原因是證書的內(nèi)容發(fā)生了變化,我們使用IDEA或者eclipse的時(shí)候自動(dòng)打開證書,保存的時(shí)候發(fā)生了變化,或者是使用Git從Windos提交文件的時(shí)候,讀文件以后發(fā)生了變化。
不過(guò)這兩個(gè)可能原因可能性不是很高,最后的一個(gè)重要原因就是使用maven編譯或者打包的時(shí)候,對(duì)文件的內(nèi)容進(jìn)行了修改(maven編譯的時(shí)候使用了占位符,替換的時(shí)候使文件發(fā)生了變化);
2、鑒別
如何鑒別SSL證書內(nèi)容是否發(fā)生了變化,主要是通過(guò)對(duì)面源文件的大小與編譯后的ssl證書文件的大小。
例如我的正常的SSL證書大小為5.4kb,編譯后的證書大小為8.6kb。
啟動(dòng)程序發(fā)現(xiàn)出現(xiàn)異常Invalid keystore format。
三、解決
方法一:不要?jiǎng)?/h3>
將SSL證書文件放到項(xiàng)目中以后,不要用編程工具等的嘗試打開它,證書文件在IDEA中會(huì)有一個(gè)?符號(hào)顯示。
或者將文件刪除,重新拷貝一份新的文件過(guò)來(lái);(PS:個(gè)人經(jīng)過(guò)實(shí)操,沒(méi)用)
方法二:轉(zhuǎn)換文件格式
將證書文件格式轉(zhuǎn)換為其它的文件格式,可以通過(guò)keytool、openssl、或者是其它帶有轉(zhuǎn)換SSL證書的工具,將JKS后綴的證書轉(zhuǎn)換為PFX格式的(PS:個(gè)人覺(jué)得太麻煩,而且也沒(méi)必要)
方法三:禁用Maven動(dòng)靜態(tài)資源
在項(xiàng)目的POM文件中添加如下配置:
<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>false</filtering> </resource> </resources> </build> </project>
方法四:配置MAVEN過(guò)濾JKS等格式的文件
在項(xiàng)目的POM文件中添加如下插件配置:
<plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.2.0</version> <configuration> <nonFilteredFileExtensions> <!--<nonFilteredFileExtension>p12</nonFilteredFileExtension>--> <nonFilteredFileExtension>jks</nonFilteredFileExtension> </nonFilteredFileExtensions> </configuration> </plugin> </plugins>
ps: jks使用小寫,如果大寫的話,package的時(shí)候會(huì)出現(xiàn)異常。
四、最后
上述問(wèn)題是使用JKS后綴格式的證書發(fā)現(xiàn)了有此問(wèn)題,使用pfx后綴的證書未發(fā)現(xiàn)有上述問(wèn)題
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
你肯定能看懂的Java IO相關(guān)知識(shí)總結(jié)
群里有大佬說(shuō)想讓我寫一篇NIO,一直也沒(méi)寫,但是和同事聊天也說(shuō)對(duì)Java的IO不是很清晰,因此今天就寫下Java的io,先打個(gè)基礎(chǔ),下次寫NIO,需要的朋友可以參考下2021-05-05Java實(shí)現(xiàn)的漢語(yǔ)拼音工具類完整實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)的漢語(yǔ)拼音工具類,結(jié)合完整實(shí)例形式分析了java基于pinyin4j包實(shí)現(xiàn)編碼轉(zhuǎn)換的相關(guān)操作技巧,需要的朋友可以參考下2017-11-11Java調(diào)用pyzbar解析base64二維碼過(guò)程解析
這篇文章主要介紹了Java調(diào)用pyzbar解析base64二維碼過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08SpringBoot中集成串口通信的項(xiàng)目實(shí)踐
本文主要介紹了SpringBoot中集成串口通信,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08springboot版本升級(jí)以及解決springsecurity漏洞的問(wèn)題
這篇文章主要介紹了springboot版本升級(jí)以及解決springsecurity漏洞的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08