不使用IIS的WCF服务证书

4
我有一个WCF应用程序通常在IIS(测试和生产环境)中运行。但是当我从调试器中运行它时,它被设置为自托管(即,会弹出一个控制台窗口而不使用IIS)。
我还有一个客户端应用程序,我连接到WCF应用程序。通常,当我测试我的客户端应用程序(运行在Windows Mobile上),它被设置为连接到我的一个测试环境(我有一个开发环境来进行测试)。
我现在遇到的问题是,客户端发送的内容与WCF应用程序接收到的内容之间似乎存在断开。我需要调试我的WCF应用程序。
我可以运行我的WCF应用程序,然后更改客户端的URL以指向调试版本,但我的服务使用SSL运行,并且客户端硬编码了期望的证书。

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

2个回答

8
我想在程序化安装自托管WCF服务的SSL证书方面添加一些有用的信息。这不涵盖如何让WCF应用程序使用SSL证书,因为这已经在网上得到了充分的说明。
这旨在由管理员在设置时间运行,而不是由实际应用程序本身运行,在此示例中,它在受限的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 工具 来检查此项是否已正确运行。


1
在调用ModifyReservation方法时,'ReserveHttpNamespace'的命名空间是什么?我无法获得相同的结果。 - iTSrAVIE
@AndreDeMattia 我只在Win2k3和Win2k8上进行过测试(它们是XP和7的服务器仿效版本),所以我认为它应该可以正常工作。如果无法正常工作,请在此处在SO上发布一个新问题并参考我的帖子。 - Mike Atlas
@Mike 你好,我重启后证书就停止工作了。我必须重新添加绑定。我已经将证书添加到本地计算机的MY和Root中。Windows日志显示尝试访问SSL服务器凭据私钥时发生致命错误。加密模块返回的错误代码为0x8009030d。内部错误状态为10001。有什么办法可以在重启后保持它的工作状态吗? - Andre DeMattia
@AndreDeMattia,听起来这似乎与您的特定密钥有关,而不是代码,但这超出了我回答这个问题的范围 - 您应该开始一个新主题或在此时开始搜索更多帮助。 - Mike Atlas
1
很高兴...当您将证书添加到存储中时,会将文件保存到一个文件夹中,请参见(http://social.msdn.microsoft.com/Forums/ru/wcf/thread/9e560c64-c53a-4de5-80d5-d2231ba8bcb1)上面的代码没有将此文件保存到文件夹中,因此只需添加这些额外的标志即可将文件保存到该文件夹中 X509Certificate2 cert = new X509Certificate2(certificatePath, certificatePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet); - Andre DeMattia
显示剩余3条评论

0

是的,你必须拥有一个 HTTPS 的基础或端点地址,并且你还必须通过行为指定服务证书。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接