証明書の処理に取り組んでいるアプリケーションがあり、ラップトップでローカルに JUnit テストを実行するとコードが正しく動作するという問題が発生していますが、実際にコードをサーバーにデプロイすると、例外。String に格納されている 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
、それらも同じです。では、ここからどこを見ればよいのでしょうか。