找不到符合条件的唯一证书

22

当我尝试解析我的令牌时,遇到了以下错误:

Property name: 'certificateReference'
Error: 'ID1025: Cannot find a unique certificate that matches the criteria.
StoreName: 'My'
StoreLocation: 'LocalMachine'
X509FindType: 'FindByThumbprint'
FindValue: '‎41a8a59e537d4a00a8c4fa8dc2522388dbd13d27'

我的web.config文件中的部分内容是:

<serviceCertificate>`
    <certificateReference x509FindType="FindByThumbprint" findValue="‎41A8A59E537D4A00A8C4FA8DC2522388DBD13D27" storeLocation="LocalMachine" storeName="My" />
</serviceCertificate>

我确认了该证书存在于IIS、MMC和Internet Explorer中,并尝试将查找类型更改为主题,但没有成功。我还尝试过将拇指印大小写转换、添加空格和不添加空格,但依然无法解决问题。我还确认了该证书存在于LocalMachine\My中,以下是确认结果:

Matching certificate:
CN=kelly-pc

可以访问私钥的其他帐户和组包括:

NT AUTHORITY\SYSTEM
BUILTIN\Administrators
KELLY-PC\Kelly
BUILTIN\IIS_IUSRS
6个回答

24

我遇到了完全相同的问题。通过在Notepad++(而非记事本)中复制我的web.config部分,我发现有一个看不见的字符:

<serviceCertificate>
        <certificateReference  x509FindType="FindByThumbprint" findValue="?e36df2f3e351a25adf8ffb6ad3619f10238f0317" />
</serviceCertificate>

删除这个字符,然后它就应该可以正常工作了。

如果没有Notepad++,您可以在指纹值前面按退格键(尝试删除"字符)。


最好的方法是使用类似HxD的十六进制编辑器查看文件。我曾使用Notepad++,但它并没有显示出任何“隐形”字符。而HxD则不同... 问题出在从IIS中复制/粘贴证书时。最好手动输入,而不要复制粘贴。 - Mikael Holmgren
6
在使用Notepad++时,直到我将编码从UTF-8更改为ANSI,才看到了额外的字符。 - BozoJoe
1
退格键的技巧对我很有用。在我的情况下,我不得不一直按退格键,直到我能够删除“”这个字符。 - sawe

8
首先,Oleg的“issuedTokenAuthentication”建议对我不起作用,因为我的应用程序是ASP.NET MVC。我认为此元素不受ASP.NET MVC应用程序支持,但在WCF服务配置中可能得到支持。
经过数小时与本地主机和其他错误(如ID1024)作斗争后,我必须撤消一些已采取的措施,例如按照博客中所述给予“Everyone”对%ALLUSERSPROFILE%\Microsoft\Crypto\RSA\MachineKeys内所有文件的读取权限(我授予了整个MachineKeys文件夹的读取权限,这不是一个好主意!)。通过这样做,所有对私钥的授权都停止通过MMC控制台工作!
我的解决方案是按这里的说明创建新的自签名证书。
然后,我将新创建的证书重新导入到正确的存储中,并授予运行Web应用程序的用户对私钥的读取权限。我的问题出在之前使用的自签名证书上,它肯定有问题。
客户端需要这个部分。
<serviceCertificate>
   <certificateReference x509FindType="FindByThumbprint" findValue="‎41A8A59E537D4A00A8C4FA8DC2522388DBD13D27" storeLocation="LocalMachine" storeName="My" />
</serviceCertificate>

处理证书时,请记住以下建议:
如果您首先将证书导入开发人员的个人存储区,然后再将其导入机器存储区以供部署,私钥将保留在个人存储区位置,因此即使已被授权,也无法使用服务帐户。
最后,FindPrivateKey.exe工具非常有用,可以定位实际的私钥文件并帮助解决问题,可以从此处下载,并在此处获得良好的说明。
我注意到,在MMC控制台中删除证书时,必须手动从
C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
中删除私钥文件(如果从localMachine存储区中删除),并从
C:\Users[用户名]\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-2106337540-114255811-1274951907-65121
中删除私钥文件(如果从CurrentUser存储区中删除)。

使用FindPrivateKey.exe工具并带上-t "指纹"参数来查找文件,然后将权限授予“本地服务”账户,这对我很有帮助。因为这是用户,我的应用程序池就在其下运行! - ScottCate
这节省了我数小时的疑难解答时间。谢谢!我正在使用IISExpress,所以在使用FindPrivateKey应用程序找到文件后,必须将($machinename\IIS_IUSRS)添加到ACL中。 - wislon

3

对我来说,拇指印前面也有一个看不见的字符。要获取拇指印的标准Microsoft指令是打开证书属性,复制十六进制字节串,并删除之间的空格。我猜测这个复制过程会在字符串开头添加一些看不见的字符。这些字符也需要被删除,否则拇指印将无法匹配。

当我发现我能通过名称加载证书时,我知道拇指印一定有问题。


0

可能您正在使用自签名证书,您应该添加以下行:

<issuedTokenAuthentication allowUntrustedRsaIssuers="true" />

<serviceCertificate>应与<certificateReference>一起使用。


我已将证书添加到受信任的提供程序部分,但仍未找到。无论如何,我创建了另一个简单的解决方案,使用新的自签名证书,项目成功运行! - Kjaneb
5
这个解决方案是什么?在你能帮助社区的时候为什么不行动起来呢....../抱怨 - VulgarBinary
这只是我的感觉,还是说这不太清晰?你能否请发一个更大的XML片段以更好地展示这个问题? - Bryan
@Bryan:我无法重现Kjaneb提问中的问题,我只是猜测原因。你可以在这里看到更多例子。另一个可能原因是密钥容器权限不足(例如请参见此处)。要真正解决问题,人们需要有更详细的信息。如果你遇到了同样的问题,应该详细描述它。此外,这个答案是两年前写的,当时我还不到三个月的StackOverflow成员。 - Oleg

0
在一个特定的服务器上,我不得不将其添加到“受信任的根证书颁发机构”存储中,以使代码识别它,在我的本地计算机和其他服务器上,仅在“个人”存储中就可以正常工作。

0
今天早上我在屏幕上看到了这个错误。我正在使用一台开发机器,所以我使用了一个自签名的(IIS)证书。安装Visual Studio 2015 RC后,IIS也升级了。结果证明这破坏了链信任,因为根证书被删除或无效(IIS Express)。
可能是一个显而易见的事情,但请确保所选的证书仍然有效,包括链中的每一跳。

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