JavaによるOAuthでmixiアプリの署名付きリクエストがCertificateException

mixiアプリから署名付きリクエストをJavaServletGoogle App Engine)に送ってみたところ、下記の例外が発生しました。

net.oauth.OAuthException: java.security.cert.CertificateException: Could not parse certificate: java.io.EOFException
at net.oauth.signature.RSA_SHA1.initialize(RSA_SHA1.java:118)
at net.oauth.signature.OAuthSignatureMethod.newMethod(OAuthSignatureMethod.java:266)
at net.oauth.signature.OAuthSignatureMethod.newSigner(OAuthSignatureMethod.java:252)
at net.oauth.SimpleOAuthValidator.validateSignature(SimpleOAuthValidator.java:254)
at net.oauth.SimpleOAuthValidator.validateMessage(SimpleOAuthValidator.java:148)
(略)

公開鍵が解析できてないようです。
公開鍵は、mixi Developer Centerのサーバサイドコードからコピペしました。
外部サーバを呼び出してみよう << mixi Developer Center (ミクシィ デベロッパーセンター)

コピペ元を見直してみると怪しい箇所が。

private final static String CERTIFICATE =
"-----BEGIN CERTIFICATE-----\n"
+ "MIICdzCCAeCgAwIBAgIJANCWpLIspxwbMA0GCSqGSIb3DQEBBQUAMDIxCzAJBgNV\n"
+ "BAYTAkpQMREwDwYDVQQKEwhtaXhpIEluYzEQMA4GA1UEAxMHbWl4aS5qcDAeFw0x\n"
+ "MDAzMjMwODE1NTlaFw0xMjAzMjIwODE1NTlaMDIxCzAJBgNVBAYTAkpQMREwDwYD\n"
+ "VQQKEwhtaXhpIEluYzEQMA4GA1UEAxMHbWl4aS5qcDCBnzANBgkqhkiG9w0BAQEF\n"
+ "AAOBjQAwgYkCgYEAtbq5Rns5IEktXldZ+37Fjlavnuc4JuwrD4F+4NQwVwVtR5yw\n"
+ "Vg10EanXWSGIAbUFx6hlppYOb0x/3PBMG80643LmXSJmvv4ViRUBl2Ys9Ie2L/D9\n"
+ "KVQXDWgJjxBGqo5MO6rA/Ip78kbiNbIQJUIJtbuJZWL3LMVe6mpIO2SUi1UCAwEA\n"
+ "AaOBlDCBkTAdBgNVHQ4EFgQU8bp8/6lmt5L8em6dZyoGciUUmuUwYgYDVR0jBFsw\n"
+ "WYAU8bp8/6lmt5L8em6dZyoGciUUmuWhNqQ0MDIxCzAJBgNVBAYTAkpQMREwDwYD\n"
+ "VQQKEwhtaXhpIEluYzEQMA4GA1UEAxMHbWl4aS5qcIIJANCWpLIspxwbMAwGA1Ud\n"
+ "EwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEApalbBgXxnLJW8fM6W7E7GAE4QZbE\n "
+ "lvYqvtQSxwacGYoqF2FW1zrBkmTB12LTddFU01pqDaeels3Ru5TNOnTIJemFWW0D\n"
+ "viKtu9GqsrOye6AZR+XA5Iy/vq3EV1TCGuDNmhJaHAiLeYuLbEqmvH7/l9xNsafH\n"
+ "IpqnsHwF1pm0bTY="
+ "-----END CERTIFICATE-----";

いかにも余分そうなスペースがはいっていたり、改行があったほうがよさそうなところに改行がありません。

コピペする場合は2箇所の修正が必要

なので、おそるおそる下記のように修正してみたところ、上記例外は発生せず、署名の検証ができるようになりました。

private final static String CERTIFICATE =
"-----BEGIN CERTIFICATE-----\n"
+ "MIICdzCCAeCgAwIBAgIJANCWpLIspxwbMA0GCSqGSIb3DQEBBQUAMDIxCzAJBgNV\n"
+ "BAYTAkpQMREwDwYDVQQKEwhtaXhpIEluYzEQMA4GA1UEAxMHbWl4aS5qcDAeFw0x\n"
+ "MDAzMjMwODE1NTlaFw0xMjAzMjIwODE1NTlaMDIxCzAJBgNVBAYTAkpQMREwDwYD\n"
+ "VQQKEwhtaXhpIEluYzEQMA4GA1UEAxMHbWl4aS5qcDCBnzANBgkqhkiG9w0BAQEF\n"
+ "AAOBjQAwgYkCgYEAtbq5Rns5IEktXldZ+37Fjlavnuc4JuwrD4F+4NQwVwVtR5yw\n"
+ "Vg10EanXWSGIAbUFx6hlppYOb0x/3PBMG80643LmXSJmvv4ViRUBl2Ys9Ie2L/D9\n"
+ "KVQXDWgJjxBGqo5MO6rA/Ip78kbiNbIQJUIJtbuJZWL3LMVe6mpIO2SUi1UCAwEA\n"
+ "AaOBlDCBkTAdBgNVHQ4EFgQU8bp8/6lmt5L8em6dZyoGciUUmuUwYgYDVR0jBFsw\n"
+ "WYAU8bp8/6lmt5L8em6dZyoGciUUmuWhNqQ0MDIxCzAJBgNVBAYTAkpQMREwDwYD\n"
+ "VQQKEwhtaXhpIEluYzEQMA4GA1UEAxMHbWl4aS5qcIIJANCWpLIspxwbMAwGA1Ud\n"
+ "EwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEApalbBgXxnLJW8fM6W7E7GAE4QZbE\n"
+ "lvYqvtQSxwacGYoqF2FW1zrBkmTB12LTddFU01pqDaeels3Ru5TNOnTIJemFWW0D\n"
+ "viKtu9GqsrOye6AZR+XA5Iy/vq3EV1TCGuDNmhJaHAiLeYuLbEqmvH7/l9xNsafH\n"
+ "IpqnsHwF1pm0bTY=\n"
+ "-----END CERTIFICATE-----";