我有一个使用X.509证书作为客户端凭据的WCF服务。大多数这些凭证不需要密码来使用它,只是为了安装它。
但是现在,我们的客户有一个证书,每次使用时都要输入密码(即每次服务运行时)。此服务每天调用另一项 n 次服务,但如果无法验证证书,则会失败。
到目前为止,我们已经要求我们的客户在每次遇到这个问题时订购(并支付)新证书,但我和我们的客户都厌倦了每次都要经历这个问题。我自己没有提供这项服务,并且没有很多任何有关WCF和服务的经验。
我想知道的是:是否可以在配置文件中输入此密码以及有关证书的所有其他信息?
以下是该服务的XML配置的一部分:
<configuration>
<system.serviceModel>
<client>
<endpoint
address="***"
binding="basicHttpBinding"
bindingConfiguration="***"
behaviorConfiguration="HTTPSEndpoint"
contract="***"
name="***" />
</client>
<bindings>
<basicHttpBinding>
<binding
name="***"
sendTimeout="00:05:00"
maxBufferSize="2147483647"
maxReceivedMessageSize="2147483647" >
<readerQuotas maxStringContentLength="2147483647" />
<security mode="Transport">
<transport clientCredentialType="Certificate" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name ="HTTPSEndpoint">
<clientCredentials>
<clientCertificate
findValue="***"
storeLocation="LocalMachine"
storeName="My"
x509FindType="FindBySubjectName"/>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
答案 0 :(得分:3)
从客户端计算机上的证书存储中检索证书时输入密码的要求是因为导入的证书选中了“启用强私钥保护”选项:
这通常被设置为标准服务器强化过程的一部分。它适用于证书在用户出席时使用远程系统对用户进行身份验证的情况。
由于密码提示是由证书导入过程引起的,并且不是证书的固有属性,因此购买新证书不会改变任何内容。
我知道在检索时无法以编程方式将密码传递给证书存储区。但是,如果你考虑一下,即使你成功了,你也必须以某种方式获得所述密码。您可以加密.config文件的密码,但现在必须存储加密密钥。等等......在某个地方会有一个松散的结束,使得“强大的私钥保护”毫无意义。
基本上,您的客户端无法双管齐下:他们无法“启用强大的私钥保护”,并且每次需要客户端证书时都不需要输入密码。他们正确存储证书要好得多。
对于无人值守的客户端服务,存储客户端证书的最安全方法如下: