我使用密钥对来签署我的XML (使用SignedXml),并将公钥作为嵌入式资源嵌入到我的应用程序中。
这里我是如何创建密钥对的
sn -k Warehouse.snk
sn -p Warehouse.snk WarehousePublic.snk当我试图阅读WarehousePublic.snk时,我得到了一个异常坏版本的提供者.
这是我的代码:
using (Stream stream = assembly.GetManifestResourceStream("WareApp.Resources.WarehousePublic.snk"))
{
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.ImportCspBlob(bytes); //the exception occurred here
...
...
...
}
}是否有一种仅从公钥创建RSACryptoServiceProvider的方法?
我也尝试过使用X509Certificate2
X509Certificate2 cert = new X509Certificate2(bytes); //I got exception here
RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)cert2.PublicKey.Key;但是我得到了异常,找不到所请求的对象.
有什么想法吗?
谢谢
发布于 2018-07-16 13:10:30
我认为不支持使用SN生成用于签名的证书(至少使用RSACryptoServiceProvider )。我想这就能解释错误了。在Windows中,您要寻找的是.PFX文件(即带密钥的证书)和.CER文件(没有私钥的证书)。
SN (MSDN链路)不提供安全性,只用于标识。您可以使用IIS或makecert.exe生成一个自签名证书,该证书应该与您要做的操作(即.PFX文件和/或已导入到中的证书)一起工作。然后,您可以从其中提取.CER文件,并将其用于项目。
发布于 2018-07-18 12:01:01
我会接受沙玛的回答,因为他是“”对的。您实际上可以使用SN签署证书。ImportCspBlob()会工作的!但是,当您试图导入使用sn -p Warehouse.snk WarehousePublic.snk生成的公钥时,它将无法工作。
为了使其工作,您需要使用RSACryptoServiceProvider.ToXmlString(false)在XML中生成公钥,并将其作为“嵌入式资源”嵌入。
我所做的就是创建一个控制台应用程序。只需剪切并粘贴下面的代码,就可以在XML文件中生成公钥。
class Program
{
static void Main(string[] args)
{
if (args.Length < 2)
{
Console.WriteLine("Invalid Argument");
Console.WriteLine("Usage:");
Console.WriteLine("\tExtractPublicKey [Input SNK File] [Output XML File]");
return;
}
using (FileStream fs = File.Open(args[0], FileMode.Open, FileAccess.Read))
{
byte[] bytes = new byte[fs.Length];
fs.Read(bytes, 0, bytes.Length);
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.ImportCspBlob(bytes);
using (StreamWriter sw = new StreamWriter(File.Open(args[1], FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite)))
sw.Write(rsa.ToXmlString(false));
}
}
}
}编译之后,要使用可执行文件,只需调用:ExtractPublicKey.exe [SNK File with Private Key] [Output Public Key in XML File]
要使用嵌入的证书,只需执行以下操作:
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(stream.ReadToEnd());我希望这对遇到类似问题的人有所帮助。
干杯
已更新
沙玛的回答应该遵循。请阅读与MSDN链接的Shaamaan评论。他的回答是站得住脚的,因为他不仅为安全提供了正确的方法,而且还告诉我SN为什么不是正确的安全工具。谢谢你,沙玛!
https://stackoverflow.com/questions/51362311
复制相似问题