我在StackOverflow,博客和其他网站上看过大约1000个帖子,但没有一个能够揭示我遇到的问题。
设定:
部署目标:
问题:在Vista,7,8,2008上我没有问题。我正在使用HTTP和HTTPS运行服务,并使用绑定到localhost的自签名证书以及自定义端口上的计算机名称。
https://localhost
添加到受信任的网站,我就不会再看到该警告,并且可以毫无问题地点击该网址。我已经完成了几种证书的分配和将它们分配给服务的方法(httpcfg等),所有这些都具有相同的结果(或更糟)。因此,我有两个问题,而不是来回试图弄清楚我做了什么并分开现有的设置,我有两个问题:
要记住的事项:我已经在Windows版本上运行良好>带有自签名证书的SSL下的XP / 2003,所以我知道基本原理有点健全。我似乎无法在XP下为localhost获取证书。
答案 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();
我希望这会有所帮助。