0

Jose ( https://bitbucket.org/b_c/jose4j/wiki/Home ) を使用して、署名済みの JsonWebToken を生成しようとしています。トークンの署名に使用する必要がある RsaKeyPairs の作成で問題が発生しています。

これは、公開/秘密キーを生成するために使用しているコードです。データベースに保存してから取得できるように、これを文字列に変換する必要があります。

    WebKeyManager wkm = null;
    Object obj;
    EncryptionKey encKey = null;
    RsaJsonWebKey rsaJsonWebKey = null;

    try
    {
         wkm = new WebKeyManager();
         int    keySize = 512;

         // Initialize KeyPairGenerator.

         SecureRandom random = SecureRandom.getInstanceStrong(); //cryptographically strong random number generator

        // Generate an RSA key pair, which will be used for signing and verification of the JWT, wrapped in a JWK               
        rsaJsonWebKey = RsaJwkGenerator.generateJwk(keySize, random.getProvider().getName(),random);

       // Give the JWK a Key ID (kid), which is just the polite thing to do
        rsaJsonWebKey.setKeyId(""+System.currentTimeMillis());

       String json = rsaJsonWebKey.toJson(OutputControlLevel.INCLUDE_PRIVATE);

}
catch (Exception e)
{
    e.printStackTrace();
}

私が遭遇している問題は、rsaJsonWebKey.toJson(OutputControlLevel.INCLUDE_PRIVATE) を実行するときです。

次のエラーが表示されます。

java.lang.ClassCastException: sun.security.mscapi.RSAPrivateKey cannot be cast to java.security.interfaces.RSAPrivateKey
    at org.jose4j.jwk.RsaJsonWebKey.getRsaPrivateKey(RsaJsonWebKey.java:123)
    at org.jose4j.jwk.RsaJsonWebKey.fillPrivateTypeSpecificParams(RsaJsonWebKey.java:135)
    at org.jose4j.jwk.PublicJsonWebKey.fillTypeSpecificParams(PublicJsonWebKey.java:122)
    at org.jose4j.jwk.JsonWebKey.toParams(JsonWebKey.java:166)
    at org.jose4j.jwk.JsonWebKey.toJson(JsonWebKey.java:178)

Jose でコードをデバッグしようとしましたが、エラーは PublicJsonWebKey クラスの次の行にあります。

protected void fillPrivateTypeSpecificParams(Map<String,Object> params)
{
    RSAPrivateKey rsaPrivateKey = getRsaPrivateKey();

rsaPrivateKey は java.security.interfaces.RSAPrivateKey ですが、getRsaPrivateKey() は org.jose4j.jwk.RsaJsonWebKey を返します。

私は何を間違っていますか?

私の要件は、KeyPairs を生成し、それらを varchar 型フィールドまたは同様のものでデータベースに保存することです。その後、必要に応じて、データベースから文字列を取得し、秘密鍵/公開鍵に変換し、それらを使用してトークンに署名できますか?

4

1 に答える 1