IUSR 对 CertOpenSystemStore() 的权限

IUSR 对 CertOpenSystemStore() 的权限

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

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

此函数返回零,GetLastError 也返回零!?我认为这是权限问题。例如,如何在不将 IUSR 提升为管理员的情况下使其正常工作?

添加

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

机器证书可供所有人读取,但访问私钥需要管理员权限(或本地用户),除非您调整 ACL。

添加

在这种情况下,证书没有任何限制,但是“我的”证书商店是空的,我不想仅仅为了这个而购买证书。

我目前使用的是 WS2003。我连接的服务器是 gmail.com,用于使用 TLS 发送电子邮件。我的代码可以查找证书,但我没有证书。在我读过的资料中,获取证书似乎是一件非常令人头疼的事情,需要注册、购买和安装,否则你只能得到一个临时的解决方案,这毫无帮助。除非你知道一种简单的方法来获取证书,否则这比我想要从 CGI 应用程序发送电子邮件要麻烦得多。还有其他方法吗?

我非常感谢你的帮助,Joe,但每年 30 美元 x nServers 根本不是一个选择。我想知道是否有办法将任务交给另一个以管理员权限运行的进程,比如服务?我甚至可以创建一个应用程序,安排从给定文件夹读取并发送在那里找到的任何电子邮件。除此之外,我必须尝试将 CGI 应用程序提升为管理员。

添加

Goyuix,谢谢你的建议。挑战在于提供独立的解决方案,而不诉诸其他库,如 .NET (60MB) 或 ASP,以及它带来的问题。

您说得对,我只需要服务器身份验证。我不知道可以只对一方进行身份验证。您的声明:“没有客户端证书不应阻止您为 SMTP 建立安全通道。您可能只需要围绕握手的那部分进行编码。”结果就是解决方案。

这让我想起了那个老水管工笑话。水管工被叫来疏通下水道。他看了一眼,拿出一把锤子敲了一下水管。他要价 180 美元,5 分钟的工作费用包括 30 美元的上门费和 150 美元的了解敲击水管位置的费用。

谢谢你们两位。这是一段漫长而艰辛的旅程。

答案1

schannel 代码试图破解“MY”存储的唯一原因是寻找可用于客户端身份验证的潜在证书,作为初始握手的一部分。在您的示例中,我想您实际上只关心服务器身份验证(例如,确保您的客户端正在与它认为的服务器通信)。没有客户端证书不应该阻止您为 SMTP 建立安全通道。您可能只需要围绕握手的那部分进行编码。

如果您也需要客户端身份验证,那么您可能需要:

  • 提升 IUSR 帐户并在机器存储中安装证书
  • 更改 APP 池以不同的用户身份运行并进行战斗

至于修复链接的代码……好吧 - 如果可以的话,我建议尝试 .NET 框架附带的 SmtpClient 代码。它支持加密通信,理论上应该“正常工作”。托管 C++ 甚至是一种选择吗?或者更好的是,只需为此编写一个 ASP.NET 处理程序?

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

您可能还想尝试询问一些相关的代码问题StackOverflow.com,那里的人们也许也能提供帮助。

答案2

最佳选择看到的是使用机器证书并授予 IUSR 帐户读取证书私钥的权限。这是一个手动步骤,但非常简单,只需执行一次即可。

在您的环境中是否存在其他要求会阻止更改证书权限?


入门指南

首先,您需要一个证书。您可以生成自己的证书,但根据您想要如何使用它以及验证它的另一端,您可能需要购买一个证书。我不会介绍如何生成证书。如果您以前从未使用过证书和证书颁发机构,我建议您先了解它们。

除非您另有评论,否则我会假设您使用的是 Windows Server 2003。

1) 将证书安装到机器存储中。转到开始 | 运行并输入 MMC 以获取空白的 MMC 控制台。转到文件 | 添加/删除管理单元。单击添加按钮以选择管理单元。从列表中选择证书,然后单击添加。选择计算机帐户选项,然后下一步、完成、关闭,最后确定。

2) 将证书导入机器存储。展开树并选择个人文件夹。右键单击个人并选择所有任务、导入。按照向导完成该过程。证书现在应该在机器存储中。

3) 调整私钥权限。在 Windows 2008 中,这已添加到证书管理器 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 帐户,但您可能需要使用 'NETWORK SERVICE',具体取决于您的 CGI 应用程序正在运行的确切上下文。您需要重新启动 IIS 才能使更改生效。WinHttpCertCfg 的文档介绍它正在做的事情。

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

希望有所帮助。


编辑2:

一个可以轻松获得公认机构颁发的证书的地方是 GoDaddy。您可以花 30 美元获得有效期为 1 年的 SSL 证书。如果您四处寻找,其他地方的价格可能会更便宜。这并不难。大多数网站都非常用户友好,可以轻松购买证书。

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

相关内容