開發(fā)銀聯(lián)支付功能,本地功能全部跑通,部署到測(cè)試環(huán)境報(bào)證書簽名錯(cuò)誤。 進(jìn)一步可以看到 FileInputStream 讀文件時(shí)拋出異常:
java.io.IOException: DER length more than 4 bytes: 111
一番追溯,最終 diff file 才發(fā)現(xiàn)證書文件 51offer_unionpay.pfx 服務(wù)器上與本地并不一致,竟然是 maven 打包時(shí)出的問題。
項(xiàng)目 maven 打包時(shí)用的是 maven-assembly-plugin (留意 maven-resources-plugin 也存在類似的問題) 證書文件的打包配置如下:
<fileSet>
<directory>src/main/resources/assets</directory>
<outputDirectory>conf/META-INF/assets</outputDirectory>
<includes>
<include>**/*.*</include>
</includes>
<filtered>true</filtered>
</fileSet>
留意 <filtered>true</filtered> 這行配置。 這是 maven-assembly-plugin 從 pom 配置 properties 變量所用的配置,在證書文件這個(gè)場景并不需要。 maven-assembly-plugin 自作多情的過濾讀寫了證書文件,卻沒能正確處理文件自身的內(nèi)容,導(dǎo)致了這個(gè)問題。
解決也很簡單:改為<filtered>false</filtered> 提交重新發(fā)布,問題解決。
總結(jié)
- 調(diào)試時(shí)留意報(bào)錯(cuò)細(xì)節(jié),問題偶爾也會(huì)發(fā)生在你完全想不到的地方。
- 配置也要力求精簡,不要引入無關(guān)內(nèi)容,拖泥帶水只會(huì)給自己挖坑。