Экспорт строгого имени из ключевого контейнера - PullRequest
2 голосов
/ 08 сентября 2011

У нас есть сервер сборки, который содержит наш закрытый ключ, используемый для подписи сборок с подписью с задержкой, в контейнере ключей. Сейчас мы создаем еще один сервер сборки, и никто, кажется, не знает, где находится исходный файл ключа, поэтому мы пытаемся экспортировать ключ с исходного сервера и импортировать на новый.

Для экспорта мы используем это:

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

Итак, я подозреваю, что процесс импорта или экспорта неправильный. Идеи?

Ответы [ 2 ]

1 голос
/ 25 января 2012

Вы можете экспортировать ключевые контейнеры с помощью приведенной ниже командной строки:

aspnet_regiis -px "SameplKeys" keys.xml -pri

Экспортирует контейнер ключей SampleKeys в файл keys.xml. Опция -pri включает информацию о секретном ключе.

0 голосов
/ 08 сентября 2011

Одна из проблем с RSACryptoServiceProvider заключается в том, что он сгенерирует пару ключей, если ее не существует.Сложнее будет узнать, читаете ли вы существующий ключ (или используете что-то совершенно новое).

Я не помню точно, как хранился ключ строгих имен (это было давно) в CryptoAPI.Однако я не верю, что они находятся в машинном магазине (не по умолчанию в любом случае), поэтому

cp.Flags = CspProviderFlags.UseMachineKeyStore;

не следует использовать (ни при экспорте, ни при импорте).

Iне вызывайте ключевой слот (например, KeyNumber.Signature), но он должен быть идентичен как в коде экспорта, так и в коде импорта (попробуйте оба варианта: -).

Если это не сработает, попытайтесь определить, был ли экспортвопрос импорта.Используйте параметры sn , чтобы проверить, соответствует ли экспортированный открытый ключ ( -tp ) тому, который используется в сборках ( -Tp ).

Вы также можете взглянуть на Mono исходный код для его инструмента sn .Он поддерживает опции, но я не помню, были ли они полностью совместимы с версией MS (с контейнерами ключей), и что-то может немного измениться с FX 1.x; -)

...