XP SP3上使用SSL的自托管WCF服务

时间:2012-12-28 06:38:25

标签: wcf ssl certificate windows-xp self-hosting

我在StackOverflow,博客和其他网站上看过大约1000个帖子,但没有一个能够揭示我遇到的问题。

设定:

  • 使用.NET Framework 3.5的WCF自托管服务(非IIS)(抱歉,无法升级),WebHttpBinding
  • 界面中使用WebGet的单个端点
  • NO .config文件 - 所有内容都是以编程方式创建的
  • 该服务绑定到自定义端口,不与任何其他服务或网站共享端口

部署目标:

  • XP SP3,2003,Vista,7,8,2008

问题:在Vista,7,8,2008上我没有问题。我正在使用HTTP和HTTPS运行服务,并使用绑定到localhost的自签名证书以及自定义端口上的计算机名称。

  • 但是在XP上,我只能在HTTP上工作,所以我知道服务本身运行正常。在HTTPS上,由于SSL失败,我无法建立连接。
  • 如果我直接在浏览器中点击URL,我会看到SSL异常。
  • 在IE中,它会发出警告,证明证书不受信任。当我允许异常时,它会进入服务并执行。如果我将https://localhost添加到受信任的网站,我就不会再看到该警告,并且可以毫无问题地点击该网址。
  • 当我在Chrome中点击相同的网址时,出现错误107 ERR_SSL_PROTOCOL_ERROR,我无法绕过它。
  • 在Firefox中,我收到ssl_error_rx_record_too_long错误,也无法绕过它。

我已经完成了几种证书的分配和将它们分配给服务的方法(httpcfg等),所有这些都具有相同的结果(或更糟)。因此,我有两个问题,而不是来回试图弄清楚我做了什么并分开现有的设置,我有两个问题:

  1. 甚至可以在XP上为localhost创建一个受信任的证书,而不是IIS和......
  2. 将所有内容以编程方式完成后,将其绑定到自托管WCF服务的最佳方法是什么?我再说一遍,因为其他尝试获得这些问题的帮助总会导致人们告诉我在配置文件中放什么。
  3. 要记住的事项:我已经在Windows版本上运行良好>带有自签名证书的SSL下的XP / 2003,所以我知道基本原理有点健全。我似乎无法在XP下为localhost获取证书。

2 个答案:

答案 0 :(得分:0)

我的回答是基于这样的假设:如果您从客户端代码进行WCF调用,您将获得“无法建立SSL / TLS安全的信任关系......”异常。

如果这是真的,我建议你实现自定义ICertificatePolicy并在进行WCF调用时使用它。这是一个示例实现。

using System.Net;  
using System.Net.Security;  
using System.Security.Cryptography.X509Certificates;  

namespace Foo.bar
{  
       public class MyCertificatePolicy : ICertificatePolicy  
        {


            public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem)  
            {  
                //Due an Invalid Certificate used in the  site, we must return true to all invalid SSL Request. Alternately, write the logic to validate the server certificate 
                return true;  
            }



            public static bool RemoteCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)  
            {  
                //Due an Invalid Certificate used in the site, we must return true to all invalid SSL Request  
                return true;  
            }  
        }  
    }  

答案 1 :(得分:0)

就我而言,我这样做:

ServiceHost host = new ServiceHost(typeof(MyRequests), baseAddresses);

然后设置我的元数据:

ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpsGetEnabled = true;
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
host.Description.Behaviors.Add(smb);

对于Windows身份验证和消息安全,我创建并设置了我的ws绑定:

WSHttpBinding b = new WSHttpBinding(SecurityMode.Message);

b.Security.Message.ClientCredentialType = MessageCredentialType.Windows;
b.MaxReceivedMessageSize = Int32.MaxValue;
// auth setup
X509ClientCertificateAuthentication myAuthProperties =
    host.Credentials.ClientCertificate.Authentication;
myAuthProperties.IncludeWindowsGroups = true;
// add endpoint
ServiceEndpoint endpnt = host.AddServiceEndpoint(typeof(IMyRequests), b, "MyService");

//GO!
host.Open();

我希望这会有所帮助。