如何使用C#编程将X509证书添加到本地机器存储?

3

我明白这个问题的标题可能是一个重复的问题,但是我还没有找到我的情况的答案,所以在这里进行说明;

我有这段简单的代码:

// Convert the Filename to an X509 Certificate
X509Certificate2 cert = new X509Certificate2(certificateFilePath);

// Get the server certificate store
X509Store store = new X509Store(StoreName.TrustedPeople, StoreLocation.LocalMachine);

store.Open(OpenFlags.MaxAllowed);
store.Add(cert); // x509 certificate created from a user supplied filename

但是,仍然会出现“访问被拒绝”的异常。

我阅读了一些信息,建议使用StorePermissions可以解决我的问题,但我认为这与我的代码无关。 话虽如此,我确实进行了测试,但无法使其正常工作。

我还发现有人建议在Windows中更改文件夹权限,虽然这可能有效(未经测试),但对于将要分发的代码来说似乎不太实用。

我还必须补充说明,由于代码将作为服务器上的服务运行,因此向当前用户存储添加证书也似乎是错误的。

是否有办法以编程方式将证书添加到本地计算机存储中?


这段代码是否正在以提升的权限运行,或者UAC正在阻止它? - Bob Vale
@Oscar,我对服务器没有完全的控制权,但我使用的用户帐户在管理员组中。 - David
@Bob,你能详细说明一下吗? - David
好的,那么,你是管理员。你尝试过这个类似的问题吗? https://dev59.com/JXRB5IYBdhLWcg3wn4jc - Oscar
@David 我最近没有亲自尝试过。作为一个测试,你是否尝试禁用UAC或将服务作为本地系统运行,如果可以工作,那么再考虑创建清单。 - Bob Vale
显示剩余8条评论
1个回答

0

感谢Oscar和Bob的提问和引导,让我朝着正确的方向前进 +10 给你们两个 :)

我的问题,正如我们都知道的那样(甚至是我自己),是运行应用程序的用户权限不足,无法将证书添加到本地计算机存储中。

但是,尝试提升用户权限的各种尝试都失败了,让我解释一下原因。

我的解决方案中有3个独立的项目:需要X509证书的WCF服务、Windows窗体客户端和密码学类库,其中密码学类库除了其他功能外,还通过Windows窗体客户端提供证书安装。

由于所有3个项目中的大部分代码都可以在没有提升权限的情况下运行,因此我真的希望只在类库中的证书安装阶段提升它们,但我尝试在代码中使用ProcessVerb= "runas",但这并没有起作用。 然后我尝试添加自定义清单,但如果您尝试更改类库的属性以使用自定义清单,则会发现该选项已被禁用。

所以我改变了策略。 我的密码学类现在在我的Windows窗体客户端中,并且我已将自定义清单添加到客户端中。这现在意味着整个客户端都以提升的权限打开,但我宁愿选择这种方式。

再次感谢


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