“CryptographicException:在证书文件存在时找不到请求的对象”

时间:2015-09-22 11:35:51

标签: c# cryptography x509certificate

我有一个.p12证书文件,我创建了这样的证书:

var certificate = new X509Certificate2(certFileLocation, "mySecret", X509KeyStorageFlags.Exportable);

certFileLocation在我的桌面上并且我给出绝对路径时,代码可以正常工作。但是,当我将.p12文件的全部内容放在我的解决方案中的新文件中并将文件的Copy to Output Directory属性设置为“Copy if newer”时,我得到{{1异常说:

  

找不到请求的对象

我每次都会检查文件是否到位而且确实存在。这两种情况有什么区别,为什么我不能用后一种方法读取文件?

2 个答案:

答案 0 :(得分:3)

我有类似的问题。它使用固定文件但不适用于相对于我的单元测试的文件。这是如此令人费解,以至于我终于看了一下文件并将它们比作二进制文件。他们相同的地方。它们被读取和写为字符串,由于unicode解释导致它们略有不同。当我自己(从资源流)将它们复制为二进制(byte [])时,一切都再次起作用。我希望这也能解决你的问题。

答案 1 :(得分:0)

如果您正在使用MS-test,则需要更多位:

  1. 如果您想在事后看到任何输出,请确保在测试完成后将runsettings配置为不删除文件夹;这让我失去了30分钟的时间!
  2. DeploymentItem属性添加到TestMethod。这会将其复制到您的Out文件夹。
  3. 使用TestContext.DeploymentDirectory作为" root"文件夹:

    X509Certificate2 GetCert()
    {
        var stx = File.Open(Path.Combine(TestContext.DeploymentDirectory, "thecertfile.pfx"), FileMode.Open);
        using (BinaryReader br = new BinaryReader(stx))
        {
            return new X509Certificate2(br.ReadBytes((int)br.BaseStream.Length), "password");
        }
    }
    
    [TestMethod, DeploymentItem("thecertfile.pfx")]
    public void Signing_FlameTest()
    {
        var cert = GetCert();
        Assert.IsNotNull(cert, "GetCert failed");
    }