IUSR到CertOpenSystemStore的权限()

我的CGI应用程序试图使用SSPI Schannel与另一台服务器创build一个TLS连接。 http://www.coastrd.com/c-schannel-smtp

握手过程首先检查“我的”证书存储中的证书http://msdn.microsoft.com/en-us/library/aa376560(VS.85).aspx

这个函数返回零,GetLastError也返回零! 我认为这是一个权限问题。 如何在不提升IUSRpipe理员权限的情况下实现这一目标?

添加

访问用户证书需要以特定用户身份运行,访问用户私钥需要用户使用密码在本地login,或者服务器已启用委派。

每个人都可以读取机器证书,但访问私钥需要pipe理员权限(或本地用户),除非您调整ACL。

添加

在这种情况下,证书没有限制,但是“我的”证书库是空的,我不想为此购买证书。

我目前正在使用WS2003。 我连接的服务器是gmail.com使用TLS发送电子邮件。 我的代码可以查找证书,但我没有。 在阅读过程中,拿到证书,登记,购买安装似乎让人头疼,否则你只是得到一个暂时的解决办法而已。 除非你知道获得证书的简单方法,否则比我想要从CGI应用程序发送电子邮件要困难得多。 有没有其他的方法?

我非常感谢你的帮助乔,但$ 30 /年x nServers是不是一个选项。 我想知道是否有办法将任务交给另一个运行pipe理员privildeges的进程,就像一个服务呢? 我甚至可以创build一个计划从给定文件夹读取的应用程序,并发送在那里发现的任何电子邮件。 除此之外,我将不得不尝试将CGI应用程序升级到pipe理员。

添加

Goyuix,谢谢你的build议。 面临的挑战是提供一个独立的解决scheme,而不是诉诸于.NET(60MB)或ASP等其他库,因为它伴随着问题。

你是对的,我只需要服务器authentication。 我不知道有可能只validation一方。 你的陈述:“没有客户端证书不应该阻止你为SMTPbuild立一个安全的通道,你可能只需要围绕这部分握手进行编码”。 原来是解决scheme。

这让我想起了旧的水pipe工笑话。 水pipe工被称为疏通stream失。 他看了一眼,拔出一把锤子,一下击中pipe道。 他要求180美元的5分钟工作逐项收费,30美元的标注费用和150美元,以在哪里击中pipe道。

谢谢你们俩。 这是一个长期的艰难的跋涉。

schannel代码试图破解“我的”商店的唯一原因是寻找潜在的证书,可以用于客户端身份validation作为初始握手的一部分。 在你的例子中,我会想象你真的只关心服务器authentication(例如确保你的客户端正在和它认为的服务器交谈)。 没有客户端证书不应阻止您为SMTPbuild立安全通道。 您可能只需要围绕握手部分进行编码。

如果您还需要客户端身份validation,那么您可能需要:

  • 提升IUSR帐户并在机器商店中安装证书
  • 改变应用程序池作为一个不同的用户运行和战斗

至于修复链接的代码…嗯 – 我会build议尝试.NET框架附带的SmtpClient代码,如果这是一个选项。 它支持encryption通信,理论上应该是“正常工作”。 pipe理C ++甚至是一个选项? 或者更好的,只是写一个ASP.NET处理程序呢?

http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient_members.aspx

您也可以尝试在StackOverflow.com上提出一些相关的代码问题,那里的人也可能会提供帮助。

看到的最佳select是使用机器证书并授予IUSR帐户权限以读取证书的私钥。 这是一个手动步骤,但只需要一次就可以完成。

在您的情况下是否有其他要求会阻止更改证书权限?


方向开始

首先,你需要一个证书。 您可以自行生成,但取决于您要如何使用它,而另一端将validation它,您可能需要购买一个。 我不会介绍如何生成证书。 如果您以前从未与证书和authentication中心合作过,我build议先了解他们。

我会假设你在Windows Server 2003上,除非你另有评论。

1)将证书安装到机器商店。 转到开始| 运行并进入MMC以获得空白的MMC控制台。 转到文件| 添加/删除pipe理单元。 单击添加button以selectpipe理单元。 从列表中select证书,然后单击添加。 select计算机帐户选项,然后单击下一步,完成,closures,最后确定。

2)将证书导入机器商店。 展开树并select个人文件夹。 右键单击个人,然后select所有任务,导入。 按照向导完成该过程。 证书现在应该在机器商店中。

3)调整私钥的权限。 在Windows 2008上,它被添加到证书pipe理器GUI中。 在Windows 2003中,您需要下载Windows Server 2003资源工具包工具 。 使用以下命令的格式来设置权限:

C:\Program Files\Windows Resource Kits\Tools\winhttpcertcfg.exe -g -c LOCAL_MACHINE\My -s "mycert" -a "USER_ACCOUNT" 

其中'LOCAL_MACHINE \ My'是本地计算机上的个人证书存储区,'mycert'是你的证书的名称,USER_ACCOUNT是将被授予对私钥的读取权限的帐户。 您可以尝试IUSR帐户,但是您可能需要使用“networking服务”,具体取决于CGI应用程序运行的确切上下文。 您将需要重新启动IIS才能使更改生效。 WinHttpCertCfg的文档涵盖了它在做什么。

您现在应该有权访问私钥。 您仍将使用带有MY标志的CertOpenSystemStore。

希望有所帮助。


编辑2:

GoDaddy是一个获得公认权威证书的简单方法。 您可以获得30美元的有效期为1年的SSL证书。 还有其他地方可能会更便宜,如果你打猎一下。 这并不难。 大多数网站都非常友好,并且可以轻松购买证书。

由于您正在进行相互身份validation,因此您需要拥有有效权限的证书,而不仅仅是您自己创build的自签名证书,因为Gmail服务器无法validation它。