找不到具有X509Certificate2的指定对象

8

我正在尝试加载一个包含访问Google日历API秘钥的文件。 参考此教程。 为了做到这一点,我创建了以下代码:

var certificate = new X509Certificate2("client_secret.json", "notasecret", X509KeyStorageFlags.Exportable);

我已经将client_secret.json文件上传到我的解决方案中,文件路径为:"...\Visual Studio 2015\Projects\Calendar\Calendar\bin\Debug\client_secret.json"。但似乎代码无法找到该文件,并返回以下错误信息:

找不到具有X509Certificate2的指定对象

我还将要读取的文件设置了属性Copy in the output directory 中的 Always copy

你尝试过向密钥添加完整路径吗? - Roman Marusyk
@MegaTron 是的,同样的错误。我试图把它放在 c:\ 中。 - Dillinger
好的,这是Web(ASP)应用程序吗? - Roman Marusyk
@MegaTron,不是一个wpf + c#应用程序。 - Dillinger
1
@Dillinger 你确定该文件包含有效的证书吗? - user469104
@user469104,我在MegaTron回答中回答了你的问题。 - Dillinger
2个回答

10

经过一些困扰后,我终于明白了问题所在。正如我在评论中所说的,我是通过以下方式生成证书:

我所采取的第一步是创建Google日历API,接着我点击了“创建凭据”,选择了“服务帐户”,选择了之前创建的API和JSON作为密钥类型。

这个证书和等待的X509Certificate2密钥不同,因此正确的步骤应该是:

1. 在开发人员控制台上单击管理服务帐户,该选项在凭据选项卡的右侧,并稍微高出项目列表。

2. 弹出一个新窗口,您需要单击要创建键的项目旁边的三个点(三个点位于右侧)。

3. 出现一个弹出菜单,然后您需要单击创建密钥

4. 选择P12格式,然后单击创建。

5. 将下载的文件保存到一个文件夹中,并在代码中链接它们,特别是:

var certificate = new X509Certificate2(@"C:\key.p12", "notasecret", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet);

请注意,key.p12是证书文件的名称,而notasecret是默认密码,在步骤4稍后出现,换句话说,它是与证书相关联的密码。

因此,我的代码似乎能够找到该文件并正确读取它,没有显示任何错误。

无论如何,感谢MegaTron引起了我对证书是否正确的疑问。


非常感谢你的建议(@Dillinger),它们对我帮助很大。 - undefined

1
尝试使用MachineKeySet。这意味着需要使用本地计算机存储密钥:
var certificate = new X509Certificate2("client_secret.json", "notasecret", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet);

很不幸,出现了相同的错误... 我也尝试了另一个硬盘驱动器:var certificate = new X509Certificate2(@"A:\client_secret.json", "notasecret", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet); - Dillinger
@Dillinger 你是如何创建 JSON 密钥的?我理解你使用了 Google 开发者控制台,对吗? - Roman Marusyk
我所做的第一步是为Google日历创建API,然后我点击了“创建凭据”,并选择了“服务账号”,选择之前创建的API和密钥类型为json。还有一种P12格式,你觉得X509Certificate2只能与P12格式一起使用吗?更新:现在刚刚尝试了P12格式,仍然出现相同的问题。真的不知道我做错了什么。 - Dillinger
@Dillinger 这非常奇怪。您尝试使用所有标志MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable了吗? - Roman Marusyk
1
我发布了一个答案,最终我成功解决了这个问题。谢谢。 - Dillinger

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