在证书存储中,很难找到与特定 X.509 证书关联的私钥文件的位置和名称。 FindPrivateKey.exe 工具有助于此过程。
重要
在使用 FindPrivateKey 示例 之前,必须生成该示例。
X.509 证书由管理员或计算机中的任何用户安装。 但是,证书可能会被在其他帐户下运行的服务访问。 例如,网络服务帐户。
此帐户可能无权访问私钥文件,因为该证书最初未安装。 FindPrivateKey 工具提供给定 X.509 证书私钥文件的位置。 一旦知道特定 X.509 证书的私钥文件的位置,即可添加或删除此文件的权限。
使用证书安全的示例使用 Setup.bat 文件中的 FindPrivateKey 工具。 找到私钥文件后,可以使用其他工具(如 Cacls.exe )将适当的访问权限设置为文件。
在用户帐户(如自承载可执行文件)下运行 Windows Communication Foundation (WCF) 服务时,请确保用户帐户对文件具有只读访问权限。 在 Internet Information Services(IIS)下运行 WCF 服务时,服务运行的默认帐户是 IIS 7 及更早版本的网络服务,或 IIS 7.5 及更高版本的应用程序池标识。 有关详细信息,请参阅 应用程序池标识。
读取权限
访问进程没有读取权限的证书时,会看到类似于以下示例的异常消息:
System.ArgumentException was unhandled
Message="The certificate 'CN=localhost' must have a private key that is capable of key exchange. The process must have access rights for the private key."
Source="System.ServiceModel"
发生这种情况时,请使用 FindPrivateKey 工具查找私钥文件,然后为运行服务的进程设置访问权限。 例如,可以使用 Cacls.exe 工具完成此作,如以下示例所示:
cacls.exe "C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys\8aeda5eb81555f14f8f9960745b5a40d_38f7de48-5ee9-452d-8a5a-92789d7110b1" /E /G "NETWORK SERVICE":R
约定 - 命令行条目
“[option]”表示一组可选的参数。
“{option}”表示一组必需的参数。
“option1 | option2”表示选项集之间的选择。
“<value>”表示要输入的参数值。
用法
FindPrivateKey <storeName> <storeLocation> [{ {-n <subjectName>} | {-t <thumbprint>} } [-f | -d | -a]]
地点:
参数 | DESCRIPTION |
---|---|
<subjectName> |
证书的主题名称 |
<thumbprint> |
证书的指纹(可以使用 Certmgr.exe 工具查找此证书) |
-f |
仅输出文件名 |
-d |
仅输出目录 |
-a |
输出绝对文件名 |
如果未在命令提示符处指定任何参数,则会显示包含此信息的帮助文本。
例子
此示例在当前用户的个人存储中找到主题名称为“CN=localhost”的证书的文件名。
FindPrivateKey My CurrentUser -n "CN=localhost"
本示例在当前用户的个人存储中找到主题名称为“CN=localhost”的证书的文件名,并输出完整的目录路径。
FindPrivateKey My CurrentUser -n "CN=localhost" -a
此示例在“本地计算机”的“个人”存储区中查找指纹为 "03 33 98 63 d0 47 e7 48 71 33 62 64 76 5c 4c 9d 42 1d 6b 52" 的证书的文件名。
FindPrivateKey My LocalMachine -t "03 33 98 63 d0 47 e7 48 71 33 62 64 76 5c 4c 9d 42 1d 6b 52"