1

背景资料:

我有一些 WCF 服务托管在特定端口上的内部服务器上。在防火墙上“打了一个洞”,使该端口上的服务可以从 DMZ 访问。消费网络应用程序托管在 DMZ 中。

内部服务器没有 SSL 证书。

DMZ 服务器确实有 SSL 证书。

问题:

从我读过的关于 WCF 的所有内容来看,我的理解是我需要在托管 WCF 服务的服务器上拥有一个 SSL 证书。它是否正确?

目前有人告诉我,我们不知道内部服务器何时会安装 SSL 证书,我需要制定一个 B 计划。

我开始考虑回到 ASMX/WSE,看起来这将是一个问题,因为 WSE 不再受支持,它不与 VS2008 集成,并且与 x64 机器不兼容。

[摇滚]我[硬地]

数据将包含 PII,因此我非常考虑安全性……即使其他人不太关心。

有没有我忽略的选项?我是否误解了 WCF 安全性?建议?

这篇文章似乎有些相似。


更新

感谢 mikey 的回答和评论,我对配置进行了一些更改。它需要一些试验和错误以及额外的谷歌搜索......但它现在似乎正在工作(我还没有进行任何广泛的测试)。但是,我不知道这是否足够安全......将我的解决方案添加到原始帖子中,以便我可以将 mikey 的答案标记为答案。

我的改变

服务:

<behaviors>
    <serviceBehaviors>
        <behavior name="serviceBehavior">
            <dataContractSerializer maxItemsInObjectGraph="6553600" />
            <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
            <serviceMetadata httpsGetEnabled="false" />
            <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
            <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
    </serviceBehaviors>
</behaviors>
<bindings>
    <wsHttpBinding>
        <binding name="customBinding">
            <reliableSession enabled="true" />
            <security mode="None" />
        </binding>
    </wsHttpBinding>
</bindings>
<services>
    <service behaviorConfiguration="serviceBehavior" name="MyApp.WcfServices.MyService">
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="customBinding" contract="MyApp.WcfServices.IMyService">
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    </service>
</services>

网络应用:

<bindings>
    <wsHttpBinding>
        <binding name="customBinding" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"         allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                maxBufferPoolSize="1048576" maxReceivedMessageSize="1048576"
                messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true">
            <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
            <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="true" />
            <security mode="None">
                <transport clientCredentialType="None" />
                <message clientCredentialType="None" negotiateServiceCredential="false" establishSecurityContext="false" />
            </security>
        </binding>
    </wsHttpBinding>
</bindings>
<client>
    <endpoint address="http://[Ip Address]:8943/MyAppWcfServices/Hosts/MyService.svc"
            binding="wsHttpBinding" bindingConfiguration="customBinding"
            contract="MyService.IMyService" name="customBinding" behaviorConfiguration="clientBehavior">
    </endpoint>
</client>
4

1 回答 1

1

以下是一些选项:

  • WCF不需要SSL。您可以将安全设置为“无” http://msdn.microsoft.com/en-us/library/ms731172.aspxhttp://social.msdn.microsoft.com/forums/en-US/wcf/thread/ 271b1816-173c-4c76-a4c4-fd9fda4b5e91/ ——那么你就不需要 SSL 证书了。由于流量只在您的 Web 服务器和您的应用程序/wcf 服务器之间传输,因此唯一能够嗅探它的人应该是内部人员……在某些时候,您必须相信您的网络正在按预期工作。对于同一网络上的应用程序和 Web 服务器之间的 Web 服务,我经常只使用 HTTP(而不是 SSL),尤其是在速度成为问题的情况下。

  • 在应用服务器上使用自签名证书。确保 DMZ 中的 Web 服务器配置为信任证书(和/或其 CA),您应该一切顺利。

于 2012-04-19T14:45:12.220 回答