1

PC:Windows 8.1 + 所有更新,VS 2012 + 所有更新。

我创建了一个我已经测试过的 WCF 服务,它可以工作。我想针对 Windows Phone 8 应用程序使用此服务,因此需要创建一个basicHttpBinding接受用户名和密码的服务才能访问数据。这是我在完成在 IIS 上成功运行的服务后采取的步骤。

  1. 创建了一个 SSL(按照这里的步骤http://msdn.microsoft.com/en-us/library/hh556232.aspx
  2. 更改了我的web.config文件,使其包含:

    <system.serviceModel>
    <services>
      <service behaviorConfiguration="NewBehavior1" name="Service">
        <endpoint address="" binding="basicHttpBinding" contract="IService"     bindingConfiguration="NewBinding1" />
        <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <bindings>
      <basicHttpBinding>
        <binding name="NewBinding1">
          <security mode="TransportWithMessageCredential" />
        </binding>
      </basicHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MEX">
          <serviceMetadata/>
        </behavior>
        <behavior name="NewBehavior1">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceCredentials>
            <userNameAuthentication userNamePasswordValidationMode="Custom"
          customUserNamePasswordValidatorType="Service, Services" />
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"     multipleSiteBindingsEnabled="true" />
    

  3. 导航到http://localhost/Service/Service.svc并收到一条正确的 403.4 消息(如果没有 SSL,则无法访问),因此我将其替换为httphttps可以查看服务页面。

  4. 知道它可以使用https我打开 WCF 测试客户端工具并导航到相同的 URL 并得到错误(请注意我已经缩短了一些错误并留在主要区域)

    错误:无法从中获取元数据https://localhost/Service/service.svc如果这是您有权访问的 Windows (R) Communication Foundation 服务,请检查您是否已在指定地址启用元数据发布。
    元数据包含无法解析的引用:“ https://localhost/Service/service.svc”。
    无法为具有权限“localhost”的 SSL/TLS 安全通道建立信任关系。
    基础连接已关闭:无法为 SSL/TLS 安全通道建立信任关系。
    根据验证程序,远程证书无效。HTTP GET 错误

  5. 我从 IIS 导出证书并将其安装在受信任的根证书颁发机构下的本地计算机和用户上。没有区别

所以现在我有点迷失了,因为我尝试过的任何东西似乎都不起作用。有人可以建议吗?

4

2 回答 2

1

我会试一试......这种行为有几个潜在的原因。

A)如果您的客户端测试工具是在 IE 中构建的,并且您的 SSL 证书是自签名的,那么您总是会遇到 IE 不接受证书的问题,并且将证书添加到客户端的“受信任”组将无济于事. IE 讨厌自签名证书,并且通过 MS 的导入例程是浪费时间。

B) 如果您的客户端测试工具是自建应用程序,您不需要将证书添加到受信任组,即使它是自签名的。但是您可能需要将此添加到您的代码中(用于测试)以避免自签名证书故障:

System.Net.ServicePointManager.CertificatePolicy = New TrustAllCertificatePolicy()

C)假设您使用的是自签名证书,请注意创建证书的方式。在我想出这些命令之前,这对我来说是个问题:

rem creates root authority file and cert in currentuser\root and gives it the right to sign certs 
makecert.exe -a sha1 -n CN=CAS_Temp_Authority %Host_Authority_Cert_Name% -sr LocalMachine -ss Root -sky signature -pe -r -sk MyNewKey -cy authority  

rem creates ssl cert, puts it in the currentuser\root authority and signs it based on the other certificate
makecert.exe  -n cn=%Host_URL% %Host_Cert_Name% -is root -ic %Host_Authority_Cert_Name%  -sky exchange -pe -sv %Host_Cert_PrivateKey% -eku 1.3.6.1.5.5.7.3.1

rem make the pfx file that will allow you to copy certs around with private keys
pvk2pfx -pvk %Host_Cert_PrivateKey% -spc %Host_Cert_Name% -pfx %Host_Cert_PFX% -f

您可以想象,从中生成的“授权”证书(*.cer 文件)进入您的“受信任的根...”存储,另一个交换证书进入您的本地机器/我的存储,但您想导入它作为 *.pfx 文件,而不是 *.cer 文件。至少这对我有用。

最后,如果 A) 和 B) 对您没有帮助,您可以尝试将 SecurityMode 从 TransportWithMessageCredential 更改为常规 Transport,看看是否会有所不同。

祝你好运。整理这些 WCF/SSL 问题对每个人来说都很难。

于 2013-10-24T12:20:40.497 回答
0

抱歉,我可能完全错了,但我注意到你配置了这样的行为:

<behavior name="NewBehavior1">
  <serviceMetadata httpGetEnabled="true"/>
  <serviceCredentials>
    <userNameAuthentication userNamePasswordValidationMode="Custom"
  customUserNamePasswordValidatorType="Service, Services" />
  </serviceCredentials>

我想如果你想使用 https,你必须像这样配置它:

<serviceMetadata httpsGetEnabled="true"/>enter code here

(httpS 启用服务元数据)。

我会尝试,但我不能 100% 确定它是否适合您,具体取决于您的其余配置

于 2014-02-03T10:50:45.440 回答