WCF安全性:在许多服务器和服务器身份不重要的情况下,该怎么办?

WCF安全性:在许多服务器和服务器身份不重要的情况下,该怎么办?,wcf,authentication,wcf-security,x509,Wcf,Authentication,Wcf Security,X509,所以我做了一些研究,发现确实,WCF是通过以明文形式发送用户名/密码来实现的。基本论点是“它不安全,因为它允许黑客拦截凭据”。因此,需要一个安全通道,为此,服务器需要一个X.509证书 好的,我明白了。但这里有一个问题:所述证书需要在客户端上受信任但是为什么呢? 可信证书通常用于Internet开放式服务器,以使客户端能够验证服务器的身份(即确保他们没有连接到伪造的服务器)。但是,如果服务器的标识在给定上下文中不重要呢 我的产品由两个应用程序组成。让我们称之为客户机和服务器1。 基本情况如下:

所以我做了一些研究,发现确实,WCF是通过以明文形式发送用户名/密码来实现的。基本论点是“它不安全,因为它允许黑客拦截凭据”。因此,需要一个安全通道,为此,服务器需要一个X.509证书

好的,我明白了。但这里有一个问题:所述证书需要在客户端上受信任但是为什么呢?
可信证书通常用于Internet开放式服务器,以使客户端能够验证服务器的身份(即确保他们没有连接到伪造的服务器)。但是,如果服务器的标识在给定上下文中不重要呢

我的产品由两个应用程序组成。让我们称之为客户机和服务器1。
基本情况如下:

  • 用户连接到安装了一个或多个服务器的网络,并打开客户端应用程序
  • 客户端使用WCF发现查找网络上的任何服务器
    (或者,用户也可以手动指定服务器地址)
  • 用户选择要连接到的服务器,然后输入该服务器的用户名/密码
  • 连接建立后,客户端代表用户对服务器进行一些调用
  • 可以看出,在这种情况下,用户不需要验证服务器是否是伪造的。即使他愿意,也没有什么可核实的。毕竟,关于服务器,我们只知道它支持我们的协议,而这一事实不需要验证

    换句话说,我需要通信保密性客户端身份验证,但不需要服务器身份验证

    要求我的客户为每台服务器从受信任的机构购买证书已经够糟糕的了,但如果不能确切解释他们为什么需要证书,那就更糟糕了

    鉴于上述各点,我认为有三种可能性:

  • WCF设计者根本没有考虑这个场景。也就是说,WCF不支持它。
    (至少在本地;是的,我知道)

  • 我遗漏了一些细节,这意味着证书毕竟必须被信任

  • 有一种方法(我不知道)只将证书用于加密而不用于服务器的身份验证,从而避免使其成为受信任的证书

  • 因此,问题是: 这三个选项中哪一个是正确的?如果是第三个,那是什么方式?(我为3号祈祷:-)

    .
    .


    1需要注意的是,“服务器”一词在这里不是“互联网”的意思。也就是说,服务器不是web上的计算机,而是安装在某台计算机上的程序,甚至不必连接到Internet。其中有很多是由不同的客户安装在他们的网站上的,大多数情况下我都不知道。

    每个“服务器”不必有自己的唯一标识。所有“服务器”实例都可以使用相同的标识,您只需将客户端配置为期望该标识,而不管它与哪个“服务器”通信。这样,只要所有“服务器”使用相同的标识,客户机就不在乎了。本质上,这归结为为为“服务器”标识购买/生成单个证书,并确保所有“服务器”实例在其通信中使用该标识

    从“服务器”配置的角度来看,您只需确保安装了密钥对,并使用
    配置元素即可使用它:

    <behavior name="MyServiceBehavior">
        <!-- ... -->
        <serviceCertificate findValue="AcmeCorpServer" storeLocation="LocalMachine" storeName="My" X509FindType="FindBySubjectName" />
        <!-- ... -->
    </behavior>
    
    
    
    然后在客户端上,您只需确保已安装公钥并配置端点行为:

    <behavior name="MyEndpointBehavior">
        <!-- ... -->
        <clientCredentials>
            <clientCertificate findValue="MyClient" storeLocation="CurrentUser" storeName="My" X509FindType="FindBySubjectName" />
            <serviceCertificate>
                <defaultCertificate findValue="AcmeCorpServer" storeLocation="CurrentUser" storeName="TrustedPeople" X509FindType="FindBySubjectName" />
            </serviceCertificate>
        </clientCredentials>
        <!-- ... -->
    </behavior>
    
    
    
    这更像是一种粗粒度的安全性方法,但它似乎适合您的特殊需要。这基本上就像说“允许我的客户与任何可能存在的服务对话,只要我们能够验证身份就是我们的身份”


    最后,如果出于某种原因(例如,您不能/不想将内容放入证书存储),您不能/不想对配置执行此操作,那么也可以通过编程方式手动加载X.509证书,然后在运行时将其分配给客户机/服务器行为来执行此操作。

    为了避免证书验证,在
    system.serviceModel/behaviors/endpointBehaviors/behavior/clientCredentials/serviceCertificate
    元素中添加以下内容:

    <authentication certificateValidationMode="None" />
    
    
    
    当证书过期时,客户端会发生什么情况?@Fyodor Soikin:为了避免证书验证,可以在与
    defaultCertificate
    元素
    相同的级别添加以下内容。这样可以避免服务身份验证。如果证书过期,服务器和客户端都需要安装新的副本。这就是证书管理的本质。没有不能通过组策略轻松维护的内容。我知道您正在试图找到一种绕过服务器身份验证的方法,但我相信,如果您的软件存在安全漏洞,您的客户会更加不安,因为您会盲目地将敏感数据发送到任何冒充实例的“服务器”。此外,如果您的客户运行自己的CA,或者他们甚至可以信任您公司的CA,则无需购买证书。@Rest Wing-没错,但是,你首先放弃了使用证书的大部分安全性,因为你没有真正验证证书是否正确。@Drew Marsh:我看不到在“正确”使用证书的情况下不存在任何漏洞。我错过什么了吗?你能描述一下安全漏洞吗?