0

这是场景。我们通过 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>

运行服务的用户都可以访问证书和私钥。那么为什么它不能使用安装的证书呢?

4

1 回答 1

1

如错误消息The service certificate is not provided. Specify a service certificate in ServiceCredentials所述,您需要提供服务证书。HTTPS 涉及服务器证书和可选的客户端证书。

<serviceCredentials>
    <serviceCertificate findValue="MyTestServerCert"
           storeLocation="LocalMachine"
               storeName="My" x509FindType="FindBySubjectName" />
</serviceCredentials>

至于使用自签名证书,如果您可以控制将使用证书的机器,则可以使用。如果您使用根 CA 签署您的证书,并且可以将此根 CA 添加到机器中的受信任 CA 列表中,则您不必放松证书检查。那为什么人们要花钱获得证书呢?答案是您将无法控制所有机器。在面向公众的站点中,您不能要求所有访问者将您的根 CA 添加到受信任的 CA 列表中。您希望每个人都信任某个人来颁发您的证书,这就是 CA 的用武之地。

顺便说一句,如果您打算为每个用户颁发证书,那么管理所有证书将是一个很大的麻烦和管理开销。

于 2013-06-28T15:24:04.947 回答