2011-07-22 161 views
3

我试图将现有的应用程序迁移到Mono(v2.10.2)。Mono的WCF证书安全性

因此我创建了一个带有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(); 

在单声道应用程序内CreateChannel抛出异常失败:

System.InvalidOperationException:绑定不支持任何类型的信道的合同'IService1'允许。

我调试成单声道源代码,发现问题是AsymmetricSecurityBindingElement.InitiatorTokenParameter == null。

我是新来的单声道,也许你可以指向我的文档/教程涵盖了这个话题。

UPDATE:

随着konrad.kruczynski现在证书对象拥有私有密钥的帮助。例外情况仍然如此。所以这不是证书商店问题。

+0

也许有人可以指点我一个更好的阅读证书的方法,而不是在证书存储中搜索证书。从pfx文件中读取它们对于我的目的来说是完美的。 –

+0

请看我更新的帖子。 –

+0

我会认为这是一个错误。值得添加到bugzilla,他们有时快速修复。 –

回答

2

是的,在Windows上创建的证书通常不包含私钥。它们可以在某种缓存中找到。您应该能够使用this指令创建带有私钥的证书。 X509Certificate2应该消耗文件没有问题。您也可以尝试描述here的程序。如有任何问题,请写信。

还值得一提的是,在Linux上以这种方式创建的证书也可以在Windows上完美工作。

更新:

我不知道我是否正确理解您的评论。你可以使用这样的代码加载PFX证书:

var myCert = new X509Certificate2("filename.pfx", "password"); 

鉴于证书包含密钥,它为我工作。

+0

我认为证书没问题,因为它在使用.NET运行时可以很好地工作。但我不确定Mono证书存储是否与Windows证书存储的操作相同。在第二个链接中他们使用ssl。但我的问题是在消息安全中的客户端证书。 –

+0

是的,当然这很容易读取证书文件!这使我可以使用私钥读取证书,但Exception仍然相同。 –