2

X509AsymmetricSecurityKey(X509Certificate2) コンストラクターを使用して、 X509Certificate2インスタンスからX509AsymmetricSecurityKeyを構築できます。しかし、セキュリティ キーから X509Certificate2 インスタンスを取得できますか?

同様の例として、InMemorySymmetricSecurityKeyクラスは、対称キーの取得に使用できるGetSymmetricKey()メソッドを公開します。

X509AsymmetricSecurityKey クラスによって公開されるGetCertificate()のような同等のメソッドを期待していましたが、最も近いメソッドは GetAsymmetricAlgorithm(string algorithm, bool privateKey) です。

私が本当に求めているのは、証明書の秘密鍵を使用して署名されたメッセージのデジタル署名を検証する機能です。つまり、署名は証明書の公開鍵を使用して検証されます。

セキュリティ キーの非対称アルゴリズムを使用して署名を検証する方法はありますか?

4

3 に答える 3

3

X509Certificate2 から X509AsymmetricSecurityKey を作成すると、証明書インスタンスの参照は実際にはキー インスタンスのcertificateという名前のプライベート プロパティ内に配置されます。

あなた自身の答えはあなたの特定のユースケースを満たしていますが、あなたの質問は満たしていません。あなたの質問に対する本当の答えは次のとおりです。

直接的な方法はありませんが、リフレクションを使用して行うことができます。

X509AsymmetricSecurityKey x509Key = ...

X509Certificate2 cert = typeof(X509AsymmetricSecurityKey).GetField("certificate", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(x509Key) as X509Certificate2;
于 2014-12-15T13:01:34.640 に答える
1

セキュリティ キーから X.509 証明書を取得できないという owlstead の意見は正しかったです。私が指摘すべきだったのは、セキュリティ キーに公開鍵と秘密鍵のペアの公開部分が含まれている JSON Web トークンのデジタル署名を検証しようとしていたことです。

実際、セキュリティ キーを使用して署名を検証できます。以下は、一般的な方法の例です。

var data        = {Get data that was signed as an array of bytes}
var signature   = {Get signature as an array of bytes}

// key variable is of type X509AsymmetricSecurityKey

using(var rsa = key.GetAsymmetricAlgorithm(SecurityAlgorithms.RsaSha256Signature, false) as RSACryptoServiceProvider)
{
    if(rsa != null)
    {
        using(var halg = new SHA256CryptoServiceProvider())
        {
            if (!rsa.VerifyData(data, halg, signature))
            {
                throw new SecurityException("Signature is invalid.");
            }
        }
    }
}
于 2012-10-16T19:15:36.697 に答える
0

X509AsymmetricSecurityKeyのコンポーネントですX509Certificate2。あなたはタイヤを与えられた車を回収できるかどうか尋ねています。X509 証明書には、内部に保存されている公開鍵に加えて、多くの追加情報が含まれています (発行者、シリアル番号、鍵の使用法、発効日など)。

一方、InMemorySymmetricSecurityKeyには対称キーのすべての情報が含まれているため、 を使用して完全なキーデータを取得することができますGetSymmetricKey()GetSymmetricKey()セマンティック オブジェクト インスタンスではなく、バイト配列のみを返すことに注意してください。

Microsoft の唯一の特別な点X509Certificate2は、X509 データ形式の一部ではない秘密キーにリンクされていることです。証明書の秘密鍵と公開鍵は、同じ鍵ペアの一部です。そのため、秘密鍵は X509 証明書の一部と考えることができます。また、多くの場合、PKCS#12 データ形式などで一緒に保存されます。個人的には、問題を混乱させるだけだと思います。

証明書を秘密鍵にリンクする場合は、鍵ペアのモジュラスを使用できます。秘密鍵と公開鍵は同じです。一部の暗号化標準では、モジュラスに対してハッシュを使用してこれを行います。したがって、ハッシュからモジュラスの証明書へのマップを作成できます。秘密鍵を取得した場合は、モジュラスを取得し、ハッシュを計算して、証明書を見つけます。

于 2012-10-06T11:15:07.287 に答える