【问题标题】:Certificate on a WCF service that does not use IIS不使用 IIS 的 WCF 服务上的证书
【发布时间】:2011-03-18 13:34:51
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: wcf ssl certificate ssl-certificate


    【解决方案1】:

    我只想添加一些有关如何以编程方式为自托管 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 检查它是否正确运行。

    【讨论】:

    • 调用 ModifyReservation 方法时,'ReserveHttpNamespace' 的命名空间是什么。我无法获得相同的结果。
    • ReserveHttpNamespace 来自我上面答案中链接中的 MSDN 代码:msdn.microsoft.com/en-us/magazine/cc163531.aspx
    • @AndreDeMattia 我只在 Win2k3 和 Win2k8(它们是 XP 和 7 的服务器类似物)上测试过这个,所以我认为它应该可以工作。如果它不起作用,请在 SO 上提出一个新问题并参考我的帖子。
    • @Mike Hi 重启后证书停止工作。我必须阅读绑定。我将证书添加到 MY 和 Root 中的本地计算机。 Windows 日志显示尝试访问 SSL 服务器凭据私钥时发生致命错误。从加密模块返回的错误代码是 0x8009030d。内部错误状态为 10001。知道如何在重新启动后让它继续工作吗?
    • 很高兴...当您将证书添加到商店时,文件会保存到文件夹中,请参阅(social.msdn.microsoft.com/Forums/ru/wcf/thread/…)上面的代码不会将此文件保存到文件夹中,因此只需添加这些额外的标志将文件保存到该文件夹​​ X509Certificate2 cert = new X509Certificate2(certificatePath, certificatePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet);
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-12-11
      • 1970-01-01
      • 2014-01-08
      • 2017-11-02
      • 1970-01-01
      • 2012-08-06
      • 2014-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多