Mono 单声道的PFX/PKCS12到SNK转换

Mono 单声道的PFX/PKCS12到SNK转换,mono,strongname,pfx,pkcs#12,snk,Mono,Strongname,Pfx,Pkcs#12,Snk,这是后续行动 您好,我有一个应用程序是用VS2008用C语言编写的。目前,我们正在使用Mono将此应用程序移植到Mac 我试图从pfx文件中提取密钥。 首先我用 `sn -pc key.pfx key.snk` 这给了我一个错误 'Failed to extract public key for key pair -- Keyset does not exist'. 然后我用 `sn -p key.pfx key.snk` 这创建了我想要的snk文件。 然后我在mono中选择了项目选项>程

这是后续行动

您好,我有一个应用程序是用VS2008用C语言编写的。目前,我们正在使用Mono将此应用程序移植到Mac

我试图从pfx文件中提取密钥。 首先我用

`sn -pc key.pfx key.snk`
这给了我一个错误

'Failed to extract public key for key pair -- Keyset does not exist'.
然后我用

`sn -p key.pfx key.snk`
这创建了我想要的snk文件。 然后我在mono中选择了项目选项>程序集签名 何时生成错误

'key.snk is missing private key needed for signing'.

我想我明白,如果我制作了一个新的snk密钥,我可以在其中同时拥有私钥和公钥。只是因为遗留问题,我们确实希望能够使用原始的pfx键值。

尝试使用
sn-p key.pfx key.snk

sn-p
用于从强名称中提取一个

但是,您需要私钥才能对程序集进行签名,因此这种(内置的
sn
)转换对您的目标没有帮助

遗憾的是,快速浏览一下Microsoft
sn
选项并没有记录任何您想要的选项


我的建议是编写一个小工具,重新使用Mono
sn
Mono.Security.dll
源代码,读取PFX(pkcs#12)文件并将其作为SNK文件写回。

非常感谢Poupou提出了答案,我刚刚将代码添加到了我为获取SNK而编写的小程序中

using System.IO;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;

namespace PfxSnk
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            X509Certificate2 cert = new X509Certificate2(@"KEY.pfx", "pfxPassword", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);
            RSACryptoServiceProvider provider = (RSACryptoServiceProvider)cert.PrivateKey;

            byte[] array = provider.ExportCspBlob(!provider.PublicOnly);

            using (FileStream fs = new FileStream("FileName.snk", FileMode.Create, FileAccess.Write))
            {
                fs.Write(array, 0, array.Length);
            }
        }
    }
}

从问题来看,这与他尝试的第二件事完全相同。感谢poupou,我对签名程序集等有点初学者。我理解该工具应该做什么,只是不知道如何开始制作。因此,我可以使用mono.security读取pfx,然后获取私钥和公钥,然后使用mono sn和检索到的密钥创建新的snk文件。我有pfx文件的密码。提前感谢您的建议,我非常感谢。我们的pfx文件上有一个密码,我们认为这将阻止mono读取此链接中的密钥。此外,我们不知道如何使用确切的私钥和公钥编写snk文件-它似乎会生成新的随机密钥。类
X509Certificate2
可以读取PFX(PKCS#12)密码保护文件。它还有一个
PrivateKey
属性,该属性将公开
RSA
实例。有了它,您可以使用
StrongName
类(来自Mono.Security.dll)将其保存为一个(无密码)
.snk
文件。谢谢您,poupou,我将试一试并发布我的结果。