不使用IIS的WCF服务上的证书

时间:2010-07-20 16:47:58

标签: wcf ssl certificate ssl-certificate

我有一个WCF应用程序,通常在IIS中运行(对于我的测试和生产环境)。但是当我从我的调试器运行它时,它被设置为运行自托管(即,弹出一个控制台窗口并且不使用IIS)。

我还有一个连接到WCF应用程序的客户端应用程序。通常当我测试我的客户端应用程序(运行在Windows Mobile上)时,它会设置为连接到我的一个测试环境(我有一个开发环境供我测试)。

我现在遇到的问题是,客户端发送的内容与WCF应用程序的内容之间似乎存在脱节。我需要调试我的WCF应用程序。

我可以运行我的WCF应用程序,然后更改我的客户端的URL以指向调试器版本,但我的服务运行SSL并且有一个证书,证明客户端是硬编码的。

我宁愿不禁用我的代码中的那部分(在客户端上)。有没有办法在我自己托管的WCF应用程序上安装证书?

2 个答案:

答案 0 :(得分:8)

我只想添加一些有用的信息,说明如何以编程方式为自托管WCF服务安装SSL证书。这不包括如何获取WCF application to use the SSL certificate,因为这在网络上的其他地方都有详细记载。

这应由管理员在设置时运行,而不是由实际应用程序本身运行,在此示例中,该应用程序本身在有限的Network Service帐户下运行。

然后,您可以使用这些代码示例来安装和配置证书:

if (!IsAdministrator())
{
   Console.WriteLine("Must run "+
                "as a user with local Administrator privileges.");
   Environment.Exit(-1);
}

//Open the cert.
X509Certificate2 certificate = new X509Certificate2(certFilePath);

//Add it to the local store
X509Store certStore = new X509Store(StoreName.My, StoreLocation.LocalMachine);
certStore.Open(OpenFlags.ReadWrite);
certStore.Add(certificate);
certStore.Close();

//Reserve an HTTPS namespace for it.
string urlPrefix = string.Format("https://+:{0}/{1}", portNum, appPath);
ReserveHttpNamespace.ModifyReservation(urlPrefix, "Network Service", false);

//Set the SSL cert for this service.
SetSSLCert.BindCertificate("0.0.0.0", portNum, certificate.GetCertHash());

然后,您可以使用有用的HttpCfg UI Tool检查这是否正常运行。

答案 1 :(得分:0)

是的,您必须拥有HTTPS的基本或端点地址,并且还必须通过行为指定服务证书

<behaviors>
<behavior configurationName="BasicSecurityProfileMutualCertificateBehavior"
    returnUnknownExceptionsAsFaults="true">
    <serviceCredentials>
    <serviceCertificate findValue="Bob"
    storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
    </serviceCredentials>
</behavior>
</behaviors>