マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

以下の内容で最終確認済み。
https://tools.ietf.org/html/rfc7517

  • JWK : JSON Web Keyは、
  • JWSJWEなどで利用する公開鍵を JSON 形式で表現するための仕様、
    FIDO2.0 の Web Authentication API が生成する公開鍵なども、JWK で表現されている。
  • 複数の JWK のセットである JWK Set JSON データ構造も定義する。
    OpenID Connect Discovery をサポートしている IdP は公開鍵を JWK Set 形式で公開していることが多い。

JSON Web Key (JWK)

  • 暗号鍵を表現する JSON オブジェクト。
  • このオブジェクトの各要素は、鍵の各プロパティを表現する。

JWK Set

  • 1セットの JWK の集合を表現する JSON オブジェクト。
  • この JSON オブジェクトは必ず keys という要素を含み、その要素は JWK の配列となる。

詳細

パラメタ(JWK)

一覧

#キー説明
1kty (必須)key typeパラメタ。大文字・小文字を区別する。
RSA や EC といった暗号アルゴリズムファミリを示す。
2alg (任意)algorithmパラメタ。大文字・小文字を区別するASCII 文字列。
鍵で利用されるアルゴリズムを示す。
3kid (任意)Key IDパラメタ。大文字・小文字を区別するが、値の構造は未定義。
鍵のロールオーバー時に JWK Set の中から必要な鍵を特定するなど、特定の鍵を識別するために用いられる。
JWSJWE とともに利用する場合, Header に含まれる kid 値と一致させる。
kidの生成には、JWK Thumbprintという仕様が使用されることが多い。
4use (任意)public key useパラメタ。大文字・小文字を区別する。
当該公開鍵の用途を示す。暗号化目的 (sig) or 署名検証目的 (enc) or その他
5key_ops (任意)key operationsパラメタ。大文字・小文字を区別する。
公開鍵, 暗号鍵, 共通鍵のいずれのユースケースを想定した鍵のオペレーションを示す。
6x5u (任意)X.509 URLパラメタ。X.509 公開鍵証明書や証明書チェーンといったリソースを指し示す URI。
リソースは、PEM エンコード形式で、チェーンの先頭の証明書と一致させ、HTTPSのGETで取得する。
7x5c (任意)X.509 certificate chainパラメタ。PKIX 証明書(base64 エンコードされた DER 形式)のJSON 配列。
配列の先頭は、チェーンの先頭のPKIX 証明書で、その後に証明書を続けることもできる。
8x5t (任意)X.509 Certificate SHA-1 Thumbprintパラメタ。
DER エンコードされた X.509 証明書 の SHA-1 thumbprint (a.k.a. digest) の base64url エンコード値。
9x5t#S256 (任意)X.509 Certificate SHA-256 Thumbprintパラメタ。
DER エンコードされた X.509 証明書 の SHA-256 thumbprint (a.k.a. digest) の base64url エンコード値。

alg

JWSJWE用のalgはJWAのRFCを参照。

use と key_ops

  • use と key_ops は同時に利用すべきではない。
  • key_ops値
    #説明
    1signcompute digital signature or MAC
    2verifyverify digital signature or MAC
    3encryptencrypt content
    4decryptdecrypt content and validate decryption, if applicable
    5wrapKeyencrypt key
    6unwrapKeydecrypt key and validate decryption, if applicable
    7deriveKeyderive key
    8deriveBitsderive bits not to be used as a key

kty と kid

異なる鍵が同じ kid 値を持つケースがある。

ktyは異なるが, アプリケーションからはそれらが
互いに等価な代替手段であると考えられている場合。

パラメタ(JWA)

パラメタ(JWK)に含まれないパラメタは、
JWAのRFCで、アルゴリズム毎に定義されているパラメタになる。

Parameters for Symmetric Keys

"kty"=octの場合(、合わせて、"alg"も必要)、
"k"にbase64urlエンコードされたSymmetric Keysを保存する。

Parameters for RSA Keys

  • Parameters for RSA Public Keys
    #説明
    1n (必須)Base64urlUIntでエンコードされたRSA公開鍵のモジュラス値
    2e (必須)Base64urlUIntでエンコードされたRSA公開鍵の指数値(65537="AQAB")
  • Parameters for RSA Private Keys
    #説明
    1d (必須)Base64urlUIntでエンコードされた、RSA秘密鍵のプライベート指数値
    2p (任意)Base64urlUIntでエンコードされた、第1の素因数値
    3q (任意)Base64urlUIntでエンコードされた、第2の素因数値
    4dp (任意)Base64urlUIntでエンコードされた、第1のCRT指数値
    5dq (任意)Base64urlUIntでエンコードされた、第2のCRT指数値
    6qi (任意)Base64urlUIntでエンコードされた、第1(、第2)のCRT係数値。
    7oth (任意)Base64urlUIntでエンコードされた、3番目以降の素数に関する情報の配列
  • oth
    詳しくは、RFC 3447も参照。
    #説明
    1rBase64urlUIntでエンコードされた、3番目以降の素因数値
    2dBase64urlUIntでエンコードされた、3番目以降のCRT指数値
    3tBase64urlUIntでエンコードされた、3番目以降のCRT係数値

サンプル

キー値の改行は掲載上の都合による。

JWK

RSA

  • RS256で使用するRSA-256
    FIDO2.0 の Web Authentication API が生成する公開鍵
    {
       "alg": "RS256", 
       "e": "AQAB", 
       "ext": false, 
       "kty": "RSA", 
       "n": "・・・"
    }
  • "x5c" (X.509 Certificate Chain)
    RSA 公開鍵と x5c に指定された X.509 証明書の両者で表現される RSA 署名鍵の JWK 表現
    {
      "kty":"RSA",
      "use":"sig",
      "kid":"1b94c",
      "n":"vrjOfz9Ccdgx5nQudyhdoR17V-IubWMeOZCwX_jj0hgAsz2J_pqYW08
      PLbK_PdiVGKPrqzmDIsLI7sA25VEnHU1uCLNwBuUiCO11_-7dYbsr4iJmG0Q
      u2j8DsVyT1azpJC_NG84Ty5KKthuCaPod7iI7w0LK9orSMhBEwwZDCxTWq4a
      YWAchc8t-emd9qOvWtVMDC2BXksRngh6X5bUYLy6AyHKvj-nUy1wgzjYQDwH
      MTplCoLtU-o-8SNnZ1tmRoGE9uJkBLdh5gFENabWnU5m1ZqZPdwS-qo-meMv
      VfJb6jJVWRpl2SUtCnYG2C32qvbWbjZ_jBPD5eunqsIo1vQ",
      "e":"AQAB",
      "x5c":
       ["MIIDQjCCAiqgAwIBAgIGATz/FuLiMA0GCSqGSIb3DQEBBQUAMGIxCzAJB
       gNVBAYTAlVTMQswCQYDVQQIEwJDTzEPMA0GA1UEBxMGRGVudmVyMRwwGgYD
       VQQKExNQaW5nIElkZW50aXR5IENvcnAuMRcwFQYDVQQDEw5CcmlhbiBDYW1
       wYmVsbDAeFw0xMzAyMjEyMzI5MTVaFw0xODA4MTQyMjI5MTVaMGIxCzAJBg
       NVBAYTAlVTMQswCQYDVQQIEwJDTzEPMA0GA1UEBxMGRGVudmVyMRwwGgYDV
       QQKExNQaW5nIElkZW50aXR5IENvcnAuMRcwFQYDVQQDEw5CcmlhbiBDYW1w
       YmVsbDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL64zn8/QnH
       YMeZ0LncoXaEde1fiLm1jHjmQsF/449IYALM9if6amFtPDy2yvz3YlRij66
       s5gyLCyO7ANuVRJx1NbgizcAblIgjtdf/u3WG7K+IiZhtELto/A7Fck9Ws6
       SQvzRvOE8uSirYbgmj6He4iO8NCyvaK0jIQRMMGQwsU1quGmFgHIXPLfnpn
       fajr1rVTAwtgV5LEZ4Iel+W1GC8ugMhyr4/p1MtcIM42EA8BzE6ZQqC7VPq
       PvEjZ2dbZkaBhPbiZAS3YeYBRDWm1p1OZtWamT3cEvqqPpnjL1XyW+oyVVk
       aZdklLQp2Btgt9qr21m42f4wTw+Xrp6rCKNb0CAwEAATANBgkqhkiG9w0BA
       QUFAAOCAQEAh8zGlfSlcI0o3rYDPBB07aXNswb4ECNIKG0CETTUxmXl9KUL
       +9gGlqCz5iWLOgWsnrcKcY0vXPG9J1r9AqBNTqNgHq2G03X09266X5CpOe1
       zFo+Owb1zxtp3PehFdfQJ610CDLEaS9V9Rqp17hCyybEpOGVwe8fnk+fbEL
       2Bo3UPGrpsHzUoaGpDftmWssZkhpBJKVMJyf/RuP2SmmaIzmnw9JiSlYhzo
       4tpzd5rFXhjRbg4zW9C+2qok+2+qDM1iJ684gPHMIY8aLWrdgQTxkumGmTq
       gawR+N5MDtdPTEQ0XfIBc2cJEUyMTY5MPvACWpkA6SdS4xSvdXK3IVfOWA=="]
     }
  • Plaintext RSA Private Key
    認証付き暗号化オペレーションのための平文入力 (プレーンテキスト)
    {
      "kty":"RSA",
      "kid":"juliet@capulet.lit",
      "use":"enc",
      "n":"t6Q8PWSi1dkJj9hTP8hNYFlvadM7DflW9mWepOJhJ66w7nyoK1gPNqFMSQRy
           O125Gp-TEkodhWr0iujjHVx7BcV0llS4w5ACGgPrcAd6ZcSR0-Iqom-QFcNP
           8Sjg086MwoqQU_LYywlAGZ21WSdS_PERyGFiNnj3QQlO8Yns5jCtLCRwLHL0
           Pb1fEv45AuRIuUfVcPySBWYnDyGxvjYGDSM-AqWS9zIQ2ZilgT-GqUmipg0X
           OC0Cc20rgLe2ymLHjpHciCKVAbY5-L32-lSeZO-Os6U15_aXrk9Gw8cPUaX1
           _I8sLGuSiVdt3C_Fn2PZ3Z8i744FPFGGcG1qs2Wz-Q",
      "e":"AQAB",
      "d":"GRtbIQmhOZtyszfgKdg4u_N-R_mZGU_9k7JQ_jn1DnfTuMdSNprTeaSTyWfS
           NkuaAwnOEbIQVy1IQbWVV25NY3ybc_IhUJtfri7bAXYEReWaCl3hdlPKXy9U
           vqPYGR0kIXTQRqns-dVJ7jahlI7LyckrpTmrM8dWBo4_PMaenNnPiQgO0xnu
           ToxutRZJfJvG4Ox4ka3GORQd9CsCZ2vsUDmsXOfUENOyMqADC6p1M3h33tsu
           rY15k9qMSpG9OX_IJAXmxzAh_tWiZOwk2K4yxH9tS3Lq1yX8C1EWmeRDkK2a
           hecG85-oLKQt5VEpWHKmjOi_gJSdSgqcN96X52esAQ",
      "p":"2rnSOV4hKSN8sS4CgcQHFbs08XboFDqKum3sc4h3GRxrTmQdl1ZK9uw-PIHf
           QP0FkxXVrx-WE-ZEbrqivH_2iCLUS7wAl6XvARt1KkIaUxPPSYB9yk31s0Q8
           UK96E3_OrADAYtAJs-M3JxCLfNgqh56HDnETTQhH3rCT5T3yJws",
      "q":"1u_RiFDP7LBYh3N4GXLT9OpSKYP0uQZyiaZwBtOCBNJgQxaj10RWjsZu0c6I
           edis4S7B_coSKB0Kj9PaPaBzg-IySRvvcQuPamQu66riMhjVtG6TlV8CLCYK
           rYl52ziqK0E_ym2QnkwsUX7eYTB7LbAHRK9GqocDE5B0f808I4s",
      "dp":"KkMTWqBUefVwZ2_Dbj1pPQqyHSHjj90L5x_MOzqYAJMcLMZtbUtwKqvVDq3
           tbEo3ZIcohbDtt6SbfmWzggabpQxNxuBpoOOf_a_HgMXK_lhqigI4y_kqS1w
           Y52IwjUn5rgRrJ-yYo1h41KR-vz2pYhEAeYrhttWtxVqLCRViD6c",
      "dq":"AvfS0-gRxvn0bwJoMSnFxYcK1WnuEjQFluMGfwGitQBWtfZ1Er7t1xDkbN9
           GQTB9yqpDoYaN06H7CFtrkxhJIBQaj6nkF5KKS3TQtQ5qCzkOkmxIe3KRbBy
           mXxkb5qwUpX5ELD5xFc6FeiafWYY63TmmEAu_lRFCOJ3xDea-ots",
      "qi":"lSQi-w9CpyUReMErP1RsBLk7wNtOvs5EQpPqmuMvqW57NBUczScEoPwmUqq
           abu9V0-Py4dQ57_bapoKRu1R90bvuFnU63SHWEFglZQvJDMeAvmj4sm-Fp0o
           Yu_neotgQ0hzbI5gry7ajdYy9-2lNx_76aBZoOUu9HCJ-UsfSOI8"
    }

Elliptic Curve DSA

P-256 Elliptic Curve の Elliptic Curve [DSS] 鍵

  • x 座標と y 座標はそれぞれ base64url エンコードされている。
  • またこの鍵自身の識別子 (kid) も含まれる。
{
  "kty":"EC",
  "crv":"P-256",
  "x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU",
  "y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0",
  "kid":"Public key used in JWS spec Appendix A.3 example"
}

JWK Set

Public Keys

  • 2つの公開鍵
    • 1つ目は Elliptic Curve
      • 鍵が暗号化のために使用されていることを記している。
      • 鍵のマッチングの目的のために key ID を提供する。
    • 2つ目は RSA
      • RS256 アルゴリズムで使用されていることを記している。
      • 鍵のマッチングの目的のために key ID を提供する。
        {
          "keys":
            [
              {
                "kty":"EC",
                "crv":"P-256",
                "x":"MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4",
                "y":"4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM",
                "use":"enc",
                "kid":"1"
              },
              {
                "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"
              }
            ]
        }

Private Keys

  • 公開鍵と秘密鍵の値
    • 1つ目は Elliptic Curve
    • 2つ目は RSA
      {
        "keys":
          [
            {
              "kty":"EC",
              "crv":"P-256",
              "x":"MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4",
              "y":"4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM",
              "d":"870MB6gfuTJ4HtUnUvYMyJpr5eUZNP4Bk43bVdj3eAE",
              "use":"enc",
              "kid":"1"
            },
            {
              "kty":"RSA",
              "n":"0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx4
                  cbbfAAtVT86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMst
                  n64tZ_2W-5JsGY4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FDW2Q
                  vzqY368QQMicAtaSqzs8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n91CbOpbIS
                  D08qNLyrdkt-bFTWhAI4vMQFh6WeZu0fM4lFd2NcRwr3XPksINHaQ-G_xBniIqbw
                  0Ls1jF44-csFCur-kEgU8awapJzKnqDKgw",
              "e":"AQAB",
              "d":"X4cTteJY_gn4FYPsXB8rdXix5vwsg1FLN5E3EaG6RJoVH-HLLKD9
                  M7dx5oo7GURknchnrRweUkC7hT5fJLM0WbFAKNLWY2vv7B6NqXSzUvxT0_YSfqij
                  wp3RTzlBaCxWp4doFk5N2o8Gy_nHNKroADIkJ46pRUohsXywbReAdYaMwFs9tv8d
                  _cPVY3i07a3t8MN6TNwm0dSawm9v47UiCl3Sk5ZiG7xojPLu4sbg1U2jx4IBTNBz
                  nbJSzFHK66jT8bgkuqsk0GjskDJk19Z4qwjwbsnn4j2WBii3RL-Us2lGVkY8fkFz
                  me1z0HbIkfz0Y6mqnOYtqc0X4jfcKoAC8Q",
              "p":"83i-7IvMGXoMXCskv73TKr8637FiO7Z27zv8oj6pbWUQyLPQBQxtPV
                  nwD20R-60eTDmD2ujnMt5PoqMrm8RfmNhVWDtjjMmCMjOpSXicFHj7XOuVIYQyqV
                  WlWEh6dN36GVZYk93N8Bc9vY41xy8B9RzzOGVQzXvNEvn7O0nVbfs",
              "q":"3dfOR9cuYq-0S-mkFLzgItgMEfFzB2q3hWehMuG0oCuqnb3vobLyum
                  qjVZQO1dIrdwgTnCdpYzBcOfW5r370AFXjiWft_NGEiovonizhKpo9VVS78TzFgx
                  kIdrecRezsZ-1kYd_s1qDbxtkDEgfAITAG9LUnADun4vIcb6yelxk",
              "dp":"G4sPXkc6Ya9y8oJW9_ILj4xuppu0lzi_H7VTkS8xj5SdX3coE0oim
                  YwxIi2emTAue0UOa5dpgFGyBJ4c8tQ2VF402XRugKDTP8akYhFo5tAA77Qe_Nmtu
                  YZc3C3m3I24G2GvR5sSDxUyAN2zq8Lfn9EUms6rY3Ob8YeiKkTiBj0",
              "dq":"s9lAH9fggBsoFR8Oac2R_E2gw282rT2kGOAhvIllETE1efrA6huUU
                  vMfBcMpn8lqeW6vzznYY5SSQF7pMdC_agI3nG8Ibp1BUb0JUiraRNqUfLhcQb_d9
                  GF4Dh7e74WbRsobRonujTYN1xCaP6TO61jvWrX-L18txXw494Q_cgk",
              "qi":"GyM_p6JrXySiz1toFgKbWV-JdI3jQ4ypu9rbMWx3rQJBfmt0FoYzg
                  UIZEVFEcOqwemRN81zoDAaa-Bk0KWNGDjJHZDdDmFhW3AN7lI-puxk_mHZGJ11rx
                  yR8O55XLSe3SPmRfKwZI6yU24ZxvQKFYItdldUKGzO6Ia6zTKhAVRU",
              "alg":"RS256",
              "kid":"2011-04-29"
            }
          ]
        }

Symmetric Keys

  • 2つの対象鍵
    • 1つ目は AES Key Wrap
    • 2つ目は HMAC key
      {
        "keys":
          [
            {
              "kty":"oct",
              "alg":"A128KW",
              "k":"GawgguFyGrWKav7AX4VKUg"
            },
            {
              "kty":"oct",
              "k":"AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75
                  aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow",
              "kid":"HMAC key used in JWS spec Appendix A.1 example"}
          ]
      }

自作ライブラリ

署名・暗号化アルゴリズム

ココの署名・暗号化アルゴリズムを使用すると良い。

RSAParameters

X.509証明書 ---> RSAParameters <---> JWK変換を考える。

.NET

.NETでは以下のようにできる模様。

  • msdn.microsoft.com

他の言語

同じようなことは他の言語でも調査されている。

参考

mkjwk

Qiita

JWA - JWK用


Tags: :IT国際標準, :プログラミング, :通信技術, :認証基盤, :クレームベース認証, :暗号化


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-05-14 (火) 11:03:27 (1802d)