WCF在IIS上失败。该系统找不到指定的文件

时间:2011-06-16 13:54:07

标签: wcf

我正在尝试使用邮件安全性创建Web服务。

这是一个配置:

  <system.serviceModel>
    <services>
      <service name="WCFMessage.Service1" behaviorConfiguration="behaviour1">
        <endpoint address="" contract="WCFMessage.IService1" binding="wsHttpBinding" bindingConfiguration="binding1" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="behaviour1">
          <serviceDebug includeExceptionDetailInFaults="false" />
          <serviceMetadata  httpGetEnabled="true"/>
          <serviceCredentials>
            <serviceCertificate findValue="MyCert"
                                x509FindType="FindBySubjectName"
                                storeLocation="LocalMachine"
                                storeName="My"/>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>

    </behaviors>
    <bindings>
      <wsHttpBinding>
        <binding name="binding1">
          <security mode="Message">
            <message  clientCredentialType="None" negotiateServiceCredential="false"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
  </system.serviceModel>

它在localhost上运行良好,但在IIS上,它给了我一个错误:

  

系统无法找到该文件   指定。

堆栈追踪:

  

很可能是证书   'CN = MyCert'可能没有私钥   能够进行密钥交换的   进程可能没有访问权限   私钥。

我尝试了this方法,但仍然出现错误。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

过去几天我一直有类似的情况。我找到了一个可以接受的解决方法,所以我会与你分享。问题是在IIS应用程序池用户帐户中无法访问服务证书私钥文件 - 或者没有私钥在其期望的位置!

注意:我将假设您正在运行自己的证书颁发机构。

要解决此问题,请按以下步骤操作:

  1. 创建要用于IIS应用程序池的新用户帐户。
  2. 您可以创建一个新的应用程序池以与此用户标识一起使用,或将此新用户标识分配给DefaultAppPool或您的服务使用的任何应用程序池(在IIS管理器中执行此操作)。
  3. 然后打开IE,导航到http://yourserver/certsrv以请求新的服务器身份验证证书。在您的请求中使用相同的CN(“MyCert”)。
  4. 打开证书颁发机构以颁发所请求的证书。
  5. 再次转到http://yourserver/certsrv,单击“查看待处理证书申请的状态”,然后安装证书。
  6. 现在您需要对“serviceCertificate”web.config部分进行更改,其方式如下所示:

      <serviceCredentials>   
        <serviceCertificate findValue="MyCert"   
                            x509FindType="FindBySubjectName"   
                            storeLocation="CurrentUser"   
                            storeName="My"/>   
      </serviceCredentials> 
    
  7. 保存,重建服务并对其进行测试,它应该可以正常工作。

  8. (如果可以使用MMC导出/导入证书功能实现这一点会更容易,但由于某种原因,其行为并不像我们预期的那样)