JWT を検証するために、jose4j を使用して URL (この場合は Google) から証明書を取得しています。
HttpsJwks httpsJkws = new HttpsJwks("https://www.googleapis.com/oauth2/v3/certs");
HttpsJwksVerificationKeyResolver httpsJwksKeyResolver = new HttpsJwksVerificationKeyResolver(httpsJkws);
//httpsJkws.setSimpleHttpGet(simpleHttpGet);
JwtConsumer jwtConsumer = new JwtConsumerBuilder()
.setVerificationKeyResolver(httpsJwksKeyResolver)
.build(); // create the JwtConsumer instance
ただし、これにより証明書エラーが発生します。
PKIX パスの構築に失敗しました: sun.security.provider.certpath.SunCertPathBuilderException: 要求されたターゲットへの有効な証明書パスが見つかりません
はい、いくつかのスクリプトを使用して JVM のトラストストアに追加できますが、そうしたくありません (基本的に、これは自己署名証明書ではなく、通常のブラウザーを介して正常に動作します)。ほとんどの場合、私は Apache HTTP クライアント 4.x を使用していますが、何らかの理由で、呼び出しは問題なく機能します。
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpResponse httpResponse = httpClient.execute(new HttpGet("https://www.googleapis.com/oauth2/v3/certs"));
String response = (httpResponse.getEntity() != null) ? EntityUtils.toString(httpResponse.getEntity()) : null;
log.debug(response);
} catch (IOException e) {
log.error("I/O Error when retrieving content from '" + jwksEndpointUrl + "': " + e.getMessage());
}
のようなバニラJavaでも試してみましたがnew URL(jwksEndpointUrl).openStream()
、ここで同じ証明書の問題が発生します。
では、Apache HttpComponents クライアントは何が違うのでしょうか? jose4j を介した標準の Java HTTP GET で同じことを達成するにはどうすればよいでしょうか?