java - 将 Base64 编码的 CER 文件保存到字符串

标签 java certificate rsa word-wrap

我目前可以使用此代码从 cer 文件中读取 key 模数,该代码也可以在 StackOverflow 上找到:

X509Certificate cert = null;
String source = "src/testCer.cer";
InputStream fis = null;                 
ByteArrayInputStream bais = null;               


fis = new FileInputStream(source);              
byte value[] = new byte[fis.available()];       
fis.read(value);                                
bais = new ByteArrayInputStream(value);             
java.security.cert.CertificateFactory cf = java.security.cert.CertificateFactory.getInstance("X.509");
cert = (X509Certificate)cf.generateCertificate(bais);    
RSAPublicKey pub = (RSAPublicKey) cert.getPublicKey();

System.out.println(pub.getModulus());

.cer 文件如下所示:(证书是在互联网上找到的 Alice 证书示例):

-----BEGIN CERTIFICATE-----
MIIBuTCCASKgAwIBAgIQNdNhtuV5GbNHYZsf+LvM0zANBgkqhkiG9w0BAQUFADAb
MRkwFwYDVQQDExBFZGlkZXYgU21va2VUZXN0MB4XDTA4MTExMjE5NTEzNVoXDTM5
MTIzMTIzNTk1OVowGzEZMBcGA1UEAxMQRWRpZGV2IFNtb2tlVGVzdDCBnzANBgkq
hkiG9w0BAQEFAAOBjQAwgYkCgYEAm6zGzqxejwswWTNLcSsa7P8xqODspX9VQBuq
5W1RoTgQ0LNR64+7ywLjH8+wrb/lB6QV7s2SFUiWDeduVesvMJkWtZ5zzQyl3iUa
CBpT4S5AaO3/wkYQSKdI108pXH7Aue0e/ZOwgEEX1N6OaPQn7AmAB4uq1h+ffw+r
RKNHqnsCAwEAATANBgkqhkiG9w0BAQUFAAOBgQCZmj+pgRsN6HpoICawK3XXNAmi
cgfQkailX9akIjD3xSCwEQx4nG6tZjTz30u4NoSffW7pch58SxuZQDqW5NsJcQNq
Ngo/dMoqqpXdi2/0BYEcJ8pjsngrFm+fM2BnyGpXH7aWuKsWjVFGlWlF+yi8I35Q
8wFJt2Z/XGA7WWDjvw==
-----END CERTIFICATE-----

经过 Base64 编码的精美换行文本。

我的问题:

如何将此证书保存到字符串中,并使用它而不是从文件中读取证书?

到目前为止我尝试过:

String cert_1= "-----BEGIN CERTIFICATE-----"
                + "MIIBuTCCASKgAwIBAgIQNdNhtuV5GbNHYZsf+LvM0zANBgkqhkiG9w0BAQUFADAb"
                + "MRkwFwYDVQQDExBFZGlkZXYgU21va2VUZXN0MB4XDTA4MTExMjE5NTEzNVoXDTM5"
                + "MTIzMTIzNTk1OVowGzEZMBcGA1UEAxMQRWRpZGV2IFNtb2tlVGVzdDCBnzANBgkq"
                + "hkiG9w0BAQEFAAOBjQAwgYkCgYEAm6zGzqxejwswWTNLcSsa7P8xqODspX9VQBuq"
                + "CBpT4S5AaO3/wkYQSKdI108pXH7Aue0e/ZOwgEEX1N6OaPQn7AmAB4uq1h+ffw+r"
                + "5W1RoTgQ0LNR64+7ywLjH8+wrb/lB6QV7s2SFUiWDeduVesvMJkWtZ5zzQyl3iUa"
                + "RKNHqnsCAwEAATANBgkqhkiG9w0BAQUFAAOBgQCZmj+pgRsN6HpoICawK3XXNAmi"
                + "cgfQkailX9akIjD3xSCwEQx4nG6tZjTz30u4NoSffW7pch58SxuZQDqW5NsJcQNq"
                + "Ngo/dMoqqpXdi2/0BYEcJ8pjsngrFm+fM2BnyGpXH7aWuKsWjVFGlWlF+yi8I35Q"
                + "8wFJt2Z/XGA7WWDjvw=="
                + "-----END CERTIFICATE-----";

    fis = new ByteArrayInputStream(cert_1.getBytes());

这会导致错误:java.io.IOException:不完整数据

fis.available 也不同于从文件加载的证书。 (短 2)。 我猜这与包装有关。我怀疑这一点,因为如果 header 不是像记事本中那样单独出现在第一行,则 .cer 文件无法工作,但否则可以工作。

最佳答案

问题是您的字符串文字没有任何换行符。为了忠实地表达原始文本,您需要:

String cert_1= "-----BEGIN CERTIFICATE-----\n"
    + "MIIBuTCCASKgAwIBAgIQNdNhtuV5GbNHYZsf+LvM0zANBgkqhkiG9w0BAQUFADAb\n"
    + "MRkwFwYDVQQDExBFZGlkZXYgU21va2VUZXN0MB4XDTA4MTExMjE5NTEzNVoXDTM5\n"
    + "MTIzMTIzNTk1OVowGzEZMBcGA1UEAxMQRWRpZGV2IFNtb2tlVGVzdDCBnzANBgkq\n"
    + "hkiG9w0BAQEFAAOBjQAwgYkCgYEAm6zGzqxejwswWTNLcSsa7P8xqODspX9VQBuq\n"
    + "CBpT4S5AaO3/wkYQSKdI108pXH7Aue0e/ZOwgEEX1N6OaPQn7AmAB4uq1h+ffw+r\n"
    + "5W1RoTgQ0LNR64+7ywLjH8+wrb/lB6QV7s2SFUiWDeduVesvMJkWtZ5zzQyl3iUa\n"
    + "RKNHqnsCAwEAATANBgkqhkiG9w0BAQUFAAOBgQCZmj+pgRsN6HpoICawK3XXNAmi\n"
    + "cgfQkailX9akIjD3xSCwEQx4nG6tZjTz30u4NoSffW7pch58SxuZQDqW5NsJcQNq\n"
    + "Ngo/dMoqqpXdi2/0BYEcJ8pjsngrFm+fM2BnyGpXH7aWuKsWjVFGlWlF+yi8I35Q\n"
    + "8wFJt2Z/XGA7WWDjvw==\n"
    + "-----END CERTIFICATE-----";

...但是您可能只需确保 BEGIN CERTIFICATEEND CERTIFICATE 标记位于其自己的行上即可:

String cert_1= "-----BEGIN CERTIFICATE-----\n"
    + "MIIBuTCCASKgAwIBAgIQNdNhtuV5GbNHYZsf+LvM0zANBgkqhkiG9w0BAQUFADAb"
    + "MRkwFwYDVQQDExBFZGlkZXYgU21va2VUZXN0MB4XDTA4MTExMjE5NTEzNVoXDTM5"
    + "MTIzMTIzNTk1OVowGzEZMBcGA1UEAxMQRWRpZGV2IFNtb2tlVGVzdDCBnzANBgkq"
    + "hkiG9w0BAQEFAAOBjQAwgYkCgYEAm6zGzqxejwswWTNLcSsa7P8xqODspX9VQBuq"
    + "CBpT4S5AaO3/wkYQSKdI108pXH7Aue0e/ZOwgEEX1N6OaPQn7AmAB4uq1h+ffw+r"
    + "5W1RoTgQ0LNR64+7ywLjH8+wrb/lB6QV7s2SFUiWDeduVesvMJkWtZ5zzQyl3iUa"
    + "RKNHqnsCAwEAATANBgkqhkiG9w0BAQUFAAOBgQCZmj+pgRsN6HpoICawK3XXNAmi"
    + "cgfQkailX9akIjD3xSCwEQx4nG6tZjTz30u4NoSffW7pch58SxuZQDqW5NsJcQNq"
    + "Ngo/dMoqqpXdi2/0BYEcJ8pjsngrFm+fM2BnyGpXH7aWuKsWjVFGlWlF+yi8I35Q"
    + "8wFJt2Z/XGA7WWDjvw==\n"
    + "-----END CERTIFICATE-----";

我还建议您在文本和二进制数据之间进行转换时显式指定字符集:

fis = new ByteArrayInputStream(cert_1.getBytes(StandardCharsets.UTF_8));

关于java - 将 Base64 编码的 CER 文件保存到字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25426786/

相关文章:

java - 无法生成签名的 APK

java - firebase电话号码身份验证获取空引用

Phpseclib key 使用

java - 从签名的 APK 或 JAR 中提取原始 X.509 证书

java - HTTP状态500-servlet mvc-dispatcher的Servlet.init()抛出异常

ssl - Apache2 SSL 证书/ key 不匹配

ios - 验证返回码 : 20 (unable to get local issuer certificate) while creating push notification P EM file

java - 帮助使用 Python 验证 RSA 签名文本

Erlang - 导入 GPG 公钥

linux - linuxserver之间的无密码SSH连接要求输入密码