我正在尝试将现有应用程序迁移到Mono (v2.10.2)。
因此,我用BasicHttpBinding和消息安全性创建了一个测试WCF服务。客户端在。net上工作得很好,但是在Mono上运行时就失败了。客户端工厂实例化如下:
//var certificate = CertificateUtil.GetCertificate(StoreLocation.LocalMachine,
// StoreName.My, X509FindType.FindBySubjectDistinguishedName, CertName, true);
var certificate = new X509Certificate2("certificate.pfx", "password");
var binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.Message;
binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate;
var epa = new EndpointAddress(
new Uri("http://localhost:53076/Service1.svc"),
new X509CertificateEndpointIdentity(certificate));
var factory = new ChannelFactory<IService1>(binding, epa);
factory.Credentials.ServiceCertificate.DefaultCertificate = certificate;
factory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
factory.Credentials.ServiceCertificate.Authentication.RevocationMode = X509RevocationMode.NoCheck;
factory.Credentials.ClientCertificate.Certificate = certificate;
var client = factory.CreateChannel();
在Mono中,应用程序在CreateChannel中失败并抛出异常:
系统。InvalidOperationException:绑定不支持合约'IService1'允许的任何通道类型。
我调试到Mono源代码,发现问题是AsymmetricSecurityBindingElement。InitiatorTokenParameter == null.
我是Mono的新手,也许你可以给我指一个涵盖这个主题的文档/教程。
更新:
在konrad.kruczynski的帮助下,证书对象现在有了私钥。例外情况还是一样的。所以这不是一个证书存储问题。是的,在Windows上创建的证书通常不包含私钥。它们可以在某种隐藏物中找到。您应该能够使用此指令创建带有私钥的证书。X509Certificate2
应该可以毫无问题地使用该文件。您也可以尝试这里描述的过程。如有任何问题,请写信给我。
值得补充的是,在Linux上以这种方式创建的证书在Windows上也可以完美地工作。
更新:
我不确定我是否正确理解了你的评论。您可以使用如下代码加载PFX证书:var myCert = new X509Certificate2("filename.pfx", "password");
给定证书包含密钥,它为我工作。