我的供应商在.p7b
文件中向我发送了一份证书。我需要从中提取证书。所以我在cmd:上运行这个
openssl pkcs7 -inform DER -outform PEM -in in.p7b -print_certs > cer_bundle.cer
我打开cer_bundle.cer
,看到三个证书。前两个看起来不错。当通过Base64.getDecoder().decode(myCert)
时,最终证书会抛出一个错误,如:
java.lang.IllegalArgumentException: Last unit does not have enough valid bitsntat
java.util.Base64$Decoder.decode0(Base64.java:734)ntat
java.util.Base64$Decoder.decode(Base64.java:526)ntat
java.util.Base64$Decoder.decode(Base64.java:549)nt
...
然后我把证书的内容放在我的终端上
CERT=MIIFDj...
base64 --decode <<< $CERT
我在控制台上看到一个没有错误的输出。
java的Base64解码器发生了什么?
Base64编码使用四个字符来编码三个字节,因此长度应该是四个字符的倍数。如果输入是三个字节的倍数,则不需要填充,否则将添加=
。将有一个或两个";余数";字节。
- 用一个";余数";字节,后面的四个字符是
XY==
,其中X
编码六个比特,Y
编码两个比特 - 用两个";余数";后面四个字符的字节是
XYZ=
,其中X
编码六位,Y
编码第一个字节的两位和第二个字节的四位,而Z
编码第二个比特的四位
您得到的错误表明最后四个字符本质上是X===
(可以省略=
),这在64进制编码中没有意义。