将PFX/PKCS12转换为SNK以供mono使用

6
这是对Mono xbuild error CS1548 - key file has incorrect format的跟进。
你好,我有一个使用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密钥值。

3个回答

8

非常感谢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);
            }
        }
    }
}

2

sn -p用于从strongname中提取公共密钥

然而,为了签署程序集,您需要私钥-因此这个(内置的sn)转换对于您的目标没有帮助。

不幸的是,快速查看Microsoft的sn选项并没有记录任何可以满足您需求的选项。

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


谢谢poupou。我在签名程序集等方面有点新手。我知道这个工具应该做什么,但不知道如何开始制作它。所以我可以使用mono.security来读取pfx文件,然后获取私钥和公钥,然后使用mono sn创建新的snk文件并检索密钥。我有pfx文件的密码。提前感谢任何建议,我非常感激。 - Paul Williams
我们的pfx文件有一个密码,我们认为这将防止Mono读取密钥,就像这个链接中所示:https://bugzilla.xamarin.com/show_bug.cgi?id=725。 另外,我们不知道如何编写一个带有相同私钥和公钥的snk文件 - 它似乎会生成新的随机密钥。 - Paul Williams
X509Certificate2可以读取PFX(PKCS#12)密码保护文件。它还具有一个PrivateKey属性,该属性将公开RSA实例。通过这个,您可以使用StrongName类(来自Mono.Security.dll)将其保存为(无密码的).snk文件。 - poupou
谢谢poupou提供这个,我会尝试并发布我的结果。 - Paul Williams

-1

请尝试使用sn -p key.pfx key.snk代替。


2
从问题描述来看,这似乎与他尝试的第二件事情完全相同。 - poupou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接