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