0

我有一个正在处理的应用程序处理证书,我遇到了一个问题,当我在笔记本电脑上通过 JUnit 测试本地运行时,我的代码可以正常工作,但是当我实际将代码部署到我的服务器时,我得到了一个例外。从存储在字符串中的 RSA 公钥创建 PublicKey 时发生异常。我希望有人能给我指出一个方向,看看为什么它在服务器上失败但在 Junit 中工作。

我的 RSA 公钥:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvNEz3+TStAAndHTc1qwT
NGvZYyB7DD1FshQf+mbQUGJ9HccOXNn5oHB7fWQjODjlDrYyCs7FclSMTLxA3lHX
98QWeWHL2O8t8qrJQQEUWZITmr/ddiNJOOvMeYF0K5if4m84vjgx/pTwwAVyU0Yo
MMXPnRozO8o7zSyRsH4jixALDugrsveEjLQI/cIEFvNjqlhyfumHyJKywNkMH1oJ
4e/f89FkpeDV694lsLs1jguuLLnvroXYJ5Uzeos+F0Pj1zFDUvhWrjVwxsUfAxS8
5uFGTUm6EEl9XiKwi+mgg8ODrY5dh3uE2yKB2T1Qj8BfK55zB8cYbORSsm6/f6Bi
BwIDAQAB
-----END PUBLIC KEY-----

我的 Junit 代码:<- 适用于笔记本电脑

@Test
public void testkey() throws Exception {
    String pem = "-----BEGIN PUBLIC KEY-----"+
                "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvNEz3+TStAAndHTc1qwT"+
                "NGvZYyB7DD1FshQf+mbQUGJ9HccOXNn5oHB7fWQjODjlDrYyCs7FclSMTLxA3lHX"+
                "98QWeWHL2O8t8qrJQQEUWZITmr/ddiNJOOvMeYF0K5if4m84vjgx/pTwwAVyU0Yo"+
        "MMXPnRozO8o7zSyRsH4jixALDugrsveEjLQI/cIEFvNjqlhyfumHyJKywNkMH1oJ"+
        "4e/f89FkpeDV694lsLs1jguuLLnvroXYJ5Uzeos+F0Pj1zFDUvhWrjVwxsUfAxS8"+
        "5uFGTUm6EEl9XiKwi+mgg8ODrY5dh3uE2yKB2T1Qj8BfK55zB8cYbORSsm6/f6Bi"+
        "BwIDAQAB"+
        "-----END PUBLIC KEY-----";
    PublicKey willNotWork = decodeKey(pem); 
}

我的实际代码:<- 在服务器上运行时引发异常

@Override
public PublicKey getKey() {
    PublicKey pk = null;
     try {
        String crt =  "-----BEGIN PUBLIC KEY-----"+
                "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvNEz3+TStAAndHTc1qwT"+
                "NGvZYyB7DD1FshQf+mbQUGJ9HccOXNn5oHB7fWQjODjlDrYyCs7FclSMTLxA3lHX"+
                "98QWeWHL2O8t8qrJQQEUWZITmr/ddiNJOOvMeYF0K5if4m84vjgx/pTwwAVyU0Yo"+
                "MMXPnRozO8o7zSyRsH4jixALDugrsveEjLQI/cIEFvNjqlhyfumHyJKywNkMH1oJ"+
        "4e/f89FkpeDV694lsLs1jguuLLnvroXYJ5Uzeos+F0Pj1zFDUvhWrjVwxsUfAxS8"+
        "5uFGTUm6EEl9XiKwi+mgg8ODrY5dh3uE2yKB2T1Qj8BfK55zB8cYbORSsm6/f6Bi"+
        "BwIDAQAB"+
        "-----END PUBLIC KEY-----";
        System.out.append("crt == " + crt);
        pk = decodeKey(crt);
    }  catch(Exception ex){
        System.out.println("getKey caught: " + ex.getMessage()); 
    }  
    return pk;
}

解码密钥代码:

public PublicKey decodeKey(String text) throws CryptographyException {
    String content = text;
    if( text.contains("-----BEGIN PUBLIC KEY-----") ) {
      content = text.replace("-----BEGIN PUBLIC KEY-----", "").replace("-----END PUBLIC KEY-----", "");
    }
    if( text.contains("-----BEGIN RSA PUBLIC KEY-----") ) {
      content = text.replace("-----BEGIN RSA PUBLIC KEY-----", "").replace("-----END RSA PUBLIC KEY-----", "");
    }
    byte[] der = Base64.decodeBase64(content);
    return decodeDerKey(der);
}

public PublicKey decodeDerKey(byte[] publicKeyBytes) throws CryptographyException {
   try {
      KeyFactory factory = KeyFactory.getInstance("RSA"); 
      PublicKey publicKey  = factory.generatePublic(
                                 new X509EncodedKeySpec(publicKeyBytes)); 
      return publicKey;
    }
    catch(Exception e) {
        throw new CryptographyException(e);
    }
}

这是我在服务器上运行代码时引发的异常:

Could not parse certificate: java.io.IOException: DerInputStream.getLength():
lengthTag=111, too big`

所以我猜我的笔记本电脑和服务器之间必须存在某种差异。我已经验证两者都运行基本相同版本的 Java(“1.7.0_17”)。我还检查了的提供者,KeyFactory它们也是一样的。那么我从这里看哪里呢?

4

0 回答 0