Как использовать StrongNameKeyPair с файлом ключей, защищенным паролем (pfx)? - PullRequest
5 голосов
/ 26 сентября 2011

Я пытаюсь программно подписать сборку, используя защищенный паролем ключевой файл (pfx). Однако, когда я пытаюсь использовать StrongNameKeyPair, я получаю следующее исключение.

Невозможно получить открытый ключ для StrongNameKeyPair. в System.Reflection.StrongNameKeyPair.ComputePublicKey () в System.Reflection.StrongNameKeyPair.get_PublicKey ()

Ответы [ 2 ]

3 голосов
/ 30 августа 2012

Вот фрагмент кода C #, который создает StrongNameKeyPair объект из файла .PFX, защищенного паролем:

    public static StrongNameKeyPair GetStrongNameKeyPairFromPfx(string pfxFile, string password)
    {
        X509Certificate2Collection certs = new X509Certificate2Collection();
        certs.Import(pfxFile, password, X509KeyStorageFlags.Exportable);
        if (certs.Count == 0)
            throw new ArgumentException(null, "pfxFile");

        RSACryptoServiceProvider provider = certs[0].PrivateKey as RSACryptoServiceProvider;
        if (provider == null) // not a good pfx file
            throw new ArgumentException(null, "pfxFile");

        return new StrongNameKeyPair(provider.ExportCspBlob(false));
    }

ПРИМЕЧАНИЕ.инструменты .NET Framework (например, форма пользовательского интерфейса строгого имени Visual Studio) для поддержки создания строгого имени сборки.Это может быть не в порядке с любым PFX.

1 голос
/ 26 сентября 2011

Не похоже, что Microsoft обновила StrongNameKeyPair для поддержки чего-либо, кроме формата файла snk - поскольку, к сожалению, нет конструктора, принимающего экземпляр RSA.

На самом деле, насколько я понимаю, поддержка PKCS # 12 для сборок с сильными именами является косвенной, т. Е. Обеспечивается инструментами (msbuild или VS.NET), а не напрямую фреймворком.

Однако вы все равно можете программно подписать сборку, используя любой экземпляр RSA, повторно используя (лицензированный MIT.X11) код из класса Mono.Security StrongName , доступный в github.Это немного больше работы - но он будет работать на любой версии фреймворка и любом (будущем) формате, который будет продвигаться: -)

...