这是场景。我们通过 Web 界面提供软件,所有这些都由我们托管。但是,该服务确实需要与我们的客户进行一些沟通,因此我们计划在他们的站点上安装一个 WCF 服务,该服务可以与我们的服务对话。
该服务的部分工作是针对 Active Directory 对用户进行身份验证,这意味着通过网络发送用户名和密码。这些需要得到保护。最初的计划只是对它们进行加密,但后来我开始着手这个项目,并意识到 WCF 服务可以通过证书保护。
但是,我们真的不想为每个本地安装购买和安装正确签名的证书。这意味着使用 makecert.exe 证书,这反过来意味着关闭许多安全检查。在这一点上,我在安全方面的专业知识已受到限制 - 尝试在生产环境中使用未签名证书是不是一个坏主意?如果是这样,它以何种方式不安全?
无论如何,我在使用证书在本地运行服务时遇到了障碍,如果有人可以提供帮助,我们将不胜感激。该服务在没有证书的情况下运行良好,因此问题显然不存在。当我尝试启动服务时,我得到:
System.InvalidOperationException: The service certificate is not provided. Specify a service certificate in ServiceCredentials.
所以这似乎意味着它找不到证书。但它可以:因为如果我更改查找条款,我会收到一条不同的消息,说明我所追求的证书不在商店中。这是配置的相关位:
<system.serviceModel>
<services>
<service name="Namespace.Endpoint"
behaviorConfiguration="default">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/Endpoint"/>
</baseAddresses>
</host>
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration="secureWsHttpBinding"
contract="Namespace.IContract" />
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="secureWsHttpBinding">
<security mode="Message">
<message clientCredentialType="Certificate" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="default">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="False"/>
<serviceCredentials>
<clientCertificate>
<authentication
certificateValidationMode="ChainTrust"
revocationMode="NoCheck" />
<certificate storeName="My"
x509FindType="FindBySubjectName"
storeLocation="LocalMachine"
findValue="MyTestCert" />
</clientCertificate>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
运行服务的用户都可以访问证书和私钥。那么为什么它不能使用安装的证书呢?