OpenID ConnectではRSA関連アルゴリズムで生成された署名検証のために、OPは以下の2つの方法で公開鍵を提示する。
- PEM形式のX.509証明書を提供
- JSON Web Key(JWK)形式でmodulusとexponentの値を提供
今回はRP側が(2)の形式で与えられた情報から署名検証のための公開鍵を取得するまでの手順をまとめる。
必要なモジュール
手順
次のような形式でModulusとExponentを取得する。
{"keys":
[
{
"kty":"RSA",
"n": "0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx
4cbbfAAtVT86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMs
tn64tZ_2W-5JsGY4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FDW2
QvzqY368QQMicAtaSqzs8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n91CbOpbI
SD08qNLyrdkt-bFTWhAI4vMQFh6WeZu0fM4lFd2NcRwr3XPksINHaQ-G_xBniIqb
w0Ls1jF44-csFCur-kEgU8awapJzKnqDKgw",
"e":"AQAB",
"alg":"RS256",
"kid":"2011-04-29"
}
]
}
- modulus(n), exponent(e)をそれぞれBase64 decodeする
- Crypt::OpenSSL::Bignum->new_from_binによりBignumを生成
- Crypt::OpenSSL::RSA->new_key_from_parametersにnとeの値を指定
- Crypt::OpenSSL::RSA->get_public_key_x509_stringにより公開鍵を取得
Crypt::OpenSSL::RSAを利用するモジュールであればこの公開鍵を署名検証メソッドに利用できる
詳細
gistを参照 openssl-rsa-pubkey-handling.pl
コメントアウトされているがCrypt::OpenSSL::Bignum->new_from_binを使っている部分に注目。