2

キー コンテナーには、遅延署名されたアセンブリに署名するために使用される秘密キーを含むビルド サーバーがあります。現在、別のビルド サーバーを作成していますが、元のキー ファイルがどこにあるか誰も知らないようです。そのため、元のサーバーからキーをエクスポートし、新しいサーバーにインポートしようとしています。

エクスポートを行うために、これを使用しています:

RSACryptoServiceProvider key;
CspParameters cp = new CspParameters();
cp.KeyContainerName = "nameOfOurContainer";
cp.Flags = CspProviderFlags.UseMachineKeyStore;
key = new RSACryptoServiceProvider(cp);
var blob = key.ExportCspBlob(true);
using (var fs = new FileStream(filePath,  FileMode.CreateNew))
{
    fs.Write(blob, 0, blob.Length);
}

インポートする - これ

CspParameters cp = new CspParameters();
cp.KeyContainerName = containerName;
cp.Flags = CspProviderFlags.UseMachineKeyStore;
cp.KeyNumber = (int)KeyNumber.Signature;

RSACryptoServiceProvider key = new RSACryptoServiceProvider(cp);

using (var fs = new FileStream(filePath, FileMode.Open))
{
    var blob = new byte[fs.Length];
    fs.Read(blob,0,(int)fs.Length);
    key.ImportCspBlob(blob);
    key.PersistKeyInCsp = true;             
}

キーは正常にエクスポートおよびインポートされていますが、新しいサーバーでの署名が機能していません。

Key pair does not match public key from assembly

したがって、私たちのインポートまたはエクスポートのプロセスが間違っているのではないかと思います。アイデア?

4

2 に答える 2

1

次のコマンド ラインを使用して、キー コンテナーをエクスポートできます。

aspnet_regiis -px "SameplKeys" keys.xml -pri

これにより、キー コンテナーSampleKeyskeys.xmlファイルにエクスポートされます。-priオプションには秘密鍵情報が含まれます。

于 2012-01-25T12:04:35.220 に答える
0

RSACryptoServiceProvider の問題の 1 つは、キーペアが存在しない場合にキーペアが生成されることです。既存のキーを読んでいるのか (またはまったく新しいものを使用しているのか) を判断するのが難しくなります。

ストロングネーム キーがどのように保存されたか正確には思い出せません (かなり時間が経ちました)、CryptoAPI に関してです。ただし、それらがマシンストアにあるとは思わない(デフォルトではそうではありません)ので、

cp.Flags = CspProviderFlags.UseMachineKeyStore;

使用しないでください (エクスポートでもインポートでも)。

キー スロット (KeyNumber.Signature など) は覚えていませんが、エクスポート コードとインポート コードの両方で同じである必要があります (両方試してみてください :-)。

それでも問題が解決しない場合は、エクスポートまたはインポートに問題があるかどうかを検出してみてください。snオプションを使用して、エクスポートされた公開キー ( -tp ) がアセンブリで使用されているもの ( -Tp ) と一致するかどうかを確認します。

また、snツールのMonoソース コードも参照できます。オプションはサポートしていますが、それらが MS バージョン (wrt キー コンテナー) と完全に互換性があったかどうかは思い出せません。

于 2011-09-08T12:42:50.780 に答える