2

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 で同じことを達成するにはどうすればよいでしょうか?

4

1 に答える 1