My PHP send a JWT (RS256) and the public key to my android application. I successfully retrieve those.
With Android, i'm trying de decode the JWT, with the public key but got some error :
java.lang.IllegalArgumentException: Key bytes can only be specified for HMAC signatures. Please specify a PublicKey or PrivateKey instance.
My code :
Jws<Claims> jws = null;
try {
jws = Jwts.parserBuilder().setSigningKey(pubkey).build().parseClaimsJws(jwt);
} catch (JwtException ex) {
}
The JWT :
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJjb21wYWdub24ub3JnIiwiYXVkIjoiY29tcGFnbm9uLm9yZyIsImlhdCI6MTM1Njk5OTUyNCwibmJmIjoxMzU3MDAwMDAwLCJ1c2VyX2lkIjo0M30.ecAQDJ1i5ZKVTLVgxBphRgpdCeieXY_J3yCR5rBk-TOVeZAMGVywUmK8bE8F8MQ5-4ua6utKppbku8UMdqqrk7XM8tOT7A6vRyL6yDHYHOu-YHvusS1gvJ6vyzpFP-_VohadF6lXBUhp_yX4a4B-UZHPTwCO1LcR1MvcCcxcN9nQPBkv3UZmm9aiJpAIb1nnEL35kviWhAFFMovk00X2H5vNMIj9xwIESDCErpk9HpLIsydpmK36KuSRvMoG1tm2EV5Qp_xD-8EZdeORb68sxx51fM-CUEiaCYq3hQGcpqs80Hhl_MSXTr-kR7z8BhPqY32LvwzorrIULc-Y2KrUWfucEPSafq56Fc3DgR-XVl26ZbxVSQ1eAvkLm90negAotTGIKQh5UdH0fZVKrg13PGONaUopnW07xyJtkT6-AMxm3gQmIX5UBR2rGRBuKpe5gDUOMqIJhwjL67ta6V5VBS6Yci7owO33UMKn0Pc7JQP3hCSztPpfaEGsVlDTk_ksxTgeNfgDc7FBgQdPHevieEc0Pwg0X7byUhDuZ4iWKtXAM8c_lB6yBn8K6gfr1WUuyXHDeYdiSadvItYfBfsRRVzNh-j5A8tRmksUaJ1UQBRIW-nbiKMshJBLwo6uradhVMAg4lVVjuZLL4AxwUK85-1rrGOH3mL4GxBw2jYYsRY
The public key :
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwMbvDPB+qOgep7tIkJul
yEF2Ru5ZBAZsdWePfqETmZOvYYXQgp6dkGLCzzpoLHkUWrzxtCLXdqtpEHIdK9LI
gEMxv409mViWVD1O+nNcJ5xoYQ8ix2Ge7h6u03IjrDkZfwV+4z4YERnbmGDmYhO5
ub7/pWLVfUJNj4cvgaXMT2MdtS9dXiInogLGlQ+0iKqfALEEbB/qQP3QoTxGVUcW
HT0pGU5kzqXyrcKk0VZWy8mi9BsuD1MbmKfI4YkbJFjlZJHduSmhWC/6h6O1K/FO
F4XzHa6ChqhqiTXcgO+kOmIFajKzSGK/YIOTeL0RwV3b8cp/qMlsOQcQ/2V2mDkP
2i0mNz+W7HbJF3XBg4fnSB8QaEAv1IFPiIdaNM7ogzFy7SyES7CpmdVzWhzboKZY
1xoluajSlkgZKIwhsEu8Btq6nJxs7cf1iKO8v0nl21GbYjSPBk0X3ntMljJoys9Z
Owc+0Zv/24e5/V21OctZNftge6TfmzRtoZxYglvfdX1LdUf2aj1togZDslq1B8ix
Apk8rHRCA5ERWKZtlvYYBHD+pNtyVPQTNYxSd2pSzz2eOX+10Q1Olvnlut1WMwxf
B+k7NWHe9KgYeVDHrwCv2lqvr8duqsqpuhONYwjKbcg3UuSR4EnGy4XyFm1ivxJl
XdyEq+C2GqMUTI9/wl03ZW0CAwEAAQ==
-----END PUBLIC KEY-----
So I try to create a PublicKey object :
PublicKey key = null;
try {
byte[] publicBytes = Base64.decode(pubkey, Base64.DEFAULT);
X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(publicBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
key = keyFactory.generatePublic(pubKeySpec);
} catch (Exception e) {
e.printStackTrace();
}
But I have this error :
W/System.err: java.security.spec.InvalidKeySpecException: com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException: Error parsing public key
I tried differents format of my public key : in one line, with the \n, with or without the "-----BEGIN PUBLIC KEY-----" ... I always have the same error.
I tried the public key on https://jwt.io/ and it works.
Thank's for help !