我收到错误“证书'CN = tempcert'必须有一个能够进行密钥交换的私钥。当我使用HTTP在Win7上运行WCF服务时,该进程必须具有私钥的访问权限。我将应用程序池更改为使用“NetworkService”。我使用本地计算机安装了服务器证书。证书显示在本地计算机/个人/证书下的证书MMC中。我双击证书,它声明它有一个私钥。然后我运行FindPrivateKey实用程序,它声明它在C:\ ProgramData \ Microsoft \ Crypto \ RSA \ MachineKeys文件夹中找到私钥。我进入了MMC中的证书加入,并授予了NETWORK SERVICE帐户的完整权限。然后我转到Windows资源管理器中的文件夹,确认NETWORK SERVICE拥有该文件夹和特定密钥文件的完全权限。但是,每次运行WCF服务时,都会发现它无法找到私钥。我不知道我还能做什么。
答案 0 :(得分:4)
您需要在创建证书时指定-sky exchange
。
makecert -sk SignedByCA -iv TempCA.pvk -n "CN=localhost" -ic
TempCA.cer SignedByCA.cer -sr LocalMachine -ss My -sky exchange -pe
答案 1 :(得分:4)
我也在努力解决这个问题。没有快速解决方案。 “-sky exchange”可能是导致此错误的原因,但我在构建自签名证书时设置了“-sky exchange”,但仍然收到此错误。还有其他问题可能导致此问题,包括私钥访问权限和证书位置。
如果/当您将WCF主机作为Windows服务运行时,这可以适用:
访问私钥的权限 在我的情况下,如果我手动启动WCF服务,它继承了我的(管理员组)用户帐户的权限,并且WCF服务在查找证书时没有问题。但是,当我使用Windows服务启动WCF主机时,它继承了服务的权限,并且我收到了同样的错误。
在Service Manager窗口中,在我的情况下,运行我的服务的帐户显示为“本地系统”,这实际上意味着“NT AUthority / System”。所以我需要将该帐户的访问权限授予该帐户的私钥容器。 “每个人”都不够好,令人惊讶。您可以使用MMC或使用FindPrivatekey.exe为密钥容器分配权限,并使用文件资源管理器手动设置权限,就像您设置文件夹的访问权限一样。
商店位置 - 另一个因素 另外,在我的情况下,我运行的帐户无法访问“LocalMachine”或“CurrentUser”商店,因此找到我的证书是没有用的。当我使用MMC将证书导入(或复制)到“服务(服务名称)”时,该服务才开始工作。
您可以这样做:打开MMC,然后从列表中选择“证书”。您将看到三个选项:我的用户帐户(CurrentUser),服务帐户(您选择哪个服务)和计算机帐户(LocalMachine)。只需选择服务帐户,然后选择运行WCF主机的服务。
我在这里的答案并不是一个完整的“如何”,只是对那些在这个问题上挣扎的人的有用提示。我为我的文档写的“如何”是10页长。
答案 2 :(得分:2)
mmc>文件>添加/删除管理单元>证书>添加>计算机帐户>下一个>完成>行
然后,找到证书>右键单击>所有任务>管理私钥
添加使用证书的用户或服务,并为其授予完全控制权。
你们都已经设置好了:)重启服务它应该可以运行
答案 3 :(得分:0)
我也得到了这个例外。检查内部异常显示:System.Security.Cryptography.CryptographicException: Invalid provider type specified.
事实证明我在Windows服务器2008上使用.NET 3.5中的CNG证书,本文(https://msdn.microsoft.com/en-us/library/aa738624(v=vs.100).aspx)突出显示为不受支持。
要查看您使用的证书类型,您可以运行命令Certutil -store my
并查找提供商字段。
无论如何,我希望这些信息对遇到同样问题的人有用。