我一直在处理这个问题,我正在使用自托管的 WCF 服务。我刚刚取得了突破:
我在机器商店的人员文件夹中有一个证书。它过期了,我的经理发出了新的。新的对我来说失败了这个错误。我从谷歌尝试了很多东西,但最后,使用完全不同的解决方案解决了这个问题。
我安装了两个证书——过期的和新的。然后我使用这个命令来获取它们的列表:
certutil -store My
我得到这个输出(信息是假的,其他证书没有列出):
================ Certificate 1 ================
Serial Number: 6d
Issuer: E=operations@voicetrust.com, CN=VoiceTrust Server CA, OU=VoiceTrust Oper
ations, O=VoiceTrust
NotBefore: 03-Jan-2013 3:33 PM
NotAfter: 03-Mar-2013 3:33 PM
Subject: E=hgulzar@voicetrust.com, CN=hornet.voicetrust.com, OU=Software Develop
ment, O=VoiceTrust eServices MENA FZ LLC, L=Dubai, C=AE
Non-root Certificate
Cert Hash(sha1): 98 5f a0 d3 11 6a 4b 64 3b db 0a a4 11 66 fc 08 28 74 7e 53
Key Container = {E5BC0912-7808-4B89-B457-31946DE5990E}
Unique container name: dfedfcc149408fb990a3bacd6d31126b_3277b2c9-9894-46d0-9b6
4-30f0d6589239
Provider = Microsoft Enhanced Cryptographic Provider v1.0
Private key is NOT exportable
Encryption test passed
================ Certificate 2 ================
Serial Number: 6d
Issuer: E=operations@voicetrust.com, CN=VoiceTrust Server CA, OU=VoiceTrust Oper
ations, O=VoiceTrust
NotBefore: 03-Nov-2013 3:33 PM
NotAfter: 03-Dec-2013 3:33 PM
Subject: E=hgulzar@voicetrust.com, CN=hornet.voicetrust.com, OU=Software Develop
ment, O=VoiceTrust eServices MENA FZ LLC, L=Dubai, C=AE
Non-root Certificate
Cert Hash(sha1): 30 5f a0 d3 11 6a 4b 64 3b db 0a a4 11 66 fc 08 28 74 7e 53
Key Container = {E5BC0912-7808-4B89-B457-31946DE5960E}
*Unique container name:* 55edfcc149408fb990a3bacd6d31126b_3277b2c9-9894-46d0-9b6
4-30f0d6589239
Provider = Microsoft Enhanced Cryptographic Provider v1.0
Private key is NOT exportable
Encryption test passed
现在,一切似乎都正常,但如果我尝试将证书 1 绑定到端口,证书 1 已过期并且可以工作,而证书 2 失败并出现错误 1312。
让我感到困惑的关键区别是唯一容器名称属性。它应该代表硬盘驱动器上的物理密钥文件%ProgramData%\Microsoft\Crypto\RSA\MachineKeys\
对于证书 1,该文件在那里,但对于证书 2,没有这样的文件。搜索后,我在文件夹的子文件夹中找到了针对证书 2 的%AppData%\Microsoft\Crypto\
文件。那是用户特定的键而不是机器级键。令人惊讶的是,证书正在导入到计算机存储中,但它始终保留用户存储的容器密钥。
我删除了 AppData 文件夹下的“55edfcc149408fb990a3bacd6d31126b_3277b2c9-9894-46d0-9b64-30f0d6589239”文件,并在商店中为我的证书 2 运行了修复命令:
certutil -repairstore My 2
这一次,唯一容器名称反映了“%ProgramData%\Microsoft\Crypto\”下正确文件夹中的一个文件,一切都开始工作了。
希望这对某人有帮助。