SSL / TLS中的相互身份validation

我是SSL身份validation的新手,我需要使用SSL在信任边界上validation两个架构组件(我可以控制这两个组件)。 我想我需要双向SSL身份validation,服务器和客户端都有证书。

证书可以自签名吗? (即,由供应商签名,这不会首先使用SSL取消?或者我是否需要第三方validation服务以确保证书的身份?)

握手如何在服务器和客户端的公钥和私钥方面工作?

我将不得不在IIS中配置服务器以使用cetificate,并使用请求发送客户端证书(最有可能通过使用WCF配置?),但是还有其他任务我必须做才能使其工作吗?

使用客户端和服务器证书的2路认证将起作用。 您也可以使用自签名证书。 但是,如果两个证书都是自签名的,则您需要绕过客户端和服务器上的证书validation,因为它们未由受信任的机构签名。

在安装证书方面,应按如下方式进行:

服务器端

  1. ServerCert.pfx安装到LocalMachine – >个人存储

  2. ClientCert.cer安装到Local Machine – > Trusted People商店

客户端

  1. ClientCert.pfx安装到当前用户 – >个人存储

  2. ServerCert.cer安装到本地计算机 – >可信存储

您需要将ServerCert.cer文件发送到客户端,客户端需要将ClientCert.cer发送给您。

现在,如果您使用自签名证书并且您的客户端正在访问您的服务,那么他将需要绕过证书validation。 C#中的示例代码如下:

System.Net.ServicePointManager.ServerCertificateValidationCallback = (sender, cert, chain, error) => { return true; }; 

希望有所帮助。

注意:从安全角度来看,不建议在生产环境中使用自签名证书。

我同意EJP的回答,但既然你接受了另一个回答,那么这里有关于自签名证书的问题的进一步细节。

可以在服务器上使用自签名证书。 您只需要配置所有潜在客户端以使用信任此证书。 这可以通过将证书(没有私钥)导入每台计算机的可信任存储区或浏览器的可信证书存储库(例如,Firefox使用自己的,独立于其运行的操作系统)来完成。 这里的自签名服务器证书主要是自定义CA证书的特例,其中每个客户端需要知道它可能使用的每个服务器(缺点是自签名证书无法撤销)。 这没关系,但实际上如果你有几台机器,这很快就会成为一个问题。

您的主要问题是将自签名证书作为客户端证书。

客户端证书身份validation由服务器启动,服务器向客户端发送TLS证书请求消息。 此消息包含其愿意接受的证书颁发机构的名称列表。 然后,客户端使用此列表选择要发送的证书:它们查找具有与此CA列表中的某个名称匹配的颁发者DN的证书(对于这些证书具有私钥)(如果是中间CA,它们也可以使用证书链)需要证书才能链接到此CA列表中的颁发者DN。

如果找不到符合这些条件的证书,大多数客户根本不会发送任何客户端证书。 在尝试使用自签名客户端证书时,这将是您最大的问题。

解决此问题的方法是让服务器发送一个空列表。 这为客户提供了更多的自由选择(然后由服务器决定是否接受它,但无论如何都会如此)。 这是TLS 1.1明确允许的,以前的版本(SSLv3 / TLS 1.0)对此主题保持沉默,尽管在实践中,据我所知,它对大多数SSLv3 / TLS 1.0堆栈都可以正常工作。 (例如,当浏览器自动选择证书时,这仍然会导致笨重的交互,因为这使得很难正确地进行自动选择。)

可以使用getAcceptedIssuers()自定义Java的X509TrustManager以在TLS证书请求消息中返回空CA列表。 据我所知,在C#/ .Net中, SslStreamRemoteCertificateValidationCallback没有它的等价物。 据我所知,这个列表是在使用IIS / SslStream时从机器的可信证书列表构建的。 (请注意,这与证书validation本身无关,它只是服务器广告它可能接受的证书。)

此外,如果要对自签名证书使用客户端证书身份validation,则必须在服务器中实现自己的validation回调以执行此身份validation。 一个简单的示例是从您获得的证书中提取公钥,将其与服务器具有的预定义列表进行比较,然后使用您在该预定义列表中拥有的用户名。 除非您有明确的方法来检查其内容与您所知道的内容,否则您无法信任任何自签名证书。 实现一个只return true;的回调return true; 将不会执行任何身份validation。 任何人都可以构建具有相同名称或属性和不同密钥的证书。 (在服务器可信证书存储中明确信任每个客户端证书几乎会更好,尽管这可能会导致TLS证书请求消息中的长CA列表。)

如果您不想依赖商业CA,请构建您自己的CA. 它可能是一些工作(主要是行政),但至少你会有一个更清洁的结果系统。 通过使用该CA证书配置客户端和服务器,您应该能够扩展到更多客户端和服务器而无需进行更改,并且您还可以在请求客户端证书时从正常的CA列表行为中受益。

实际上,自签名实际上更复杂。 除非你完全控制两端,否则不要这样做。

私钥用于签署握手中发送的证书,以便对等方可以检查您是否真正拥有要发送的证书。 服务器私钥也在某些密码中生成分片密钥中起作用。