FindPrivateKey 示例

查找与证书存储区中的特定 X.509 证书关联的私钥文件的位置和名称可能很困难。 使用 FindPrivateKey.exe 工具可以更快地完成此过程。

重要

必须先生成 FindPrivateKey 示例,然后才能使用它。

X.509 证书是由计算机管理员或计算机上的任何用户安装的。 但是,在不同帐户下运行的服务可以访问该证书。 例如,NETWORK SERVICE 帐户。

此帐户可能没有访问私钥文件的权限,因为证书原来并不是由它安装的。 FindPrivateKey 工具可以为您提供给定 X.509 证书的私钥文件的位置。 您可以在知道特定 X.509 证书的私钥文件的位置后立即添加或移除对此文件的权限。

使用证书确保安全性的示例在 Setup.bat 文件中使用 FindPrivateKey 工具。 找到私钥文件后,可使用其他工具(如 Cacls.exe)设置该文件的适当访问权限。

使用用户帐户(如自承载可执行文件)运行 Windows Communication Foundation (WCF) 服务时,请确保该用户帐户具有该文件的只读访问权限。 在 Internet Information Services (IIS) 下运行 WCF 服务时,该服务运行时使用的默认帐户是 IIS 7 及更早版本上的 NETWORK SERVICE,或 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]]

其中:

参数 说明
<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"