在SSL / TLS的相互认证(Mutual authentication in SSL/TLS)

2019-07-30 19:27发布

我是新来的SSL认证,我有一个要求,在使用SSL(我有过两个组件控制)信任边界鉴权的两个建筑构件。 我想我会需要与服务器有客户端证书都双向SSL认证。

该证书可以是自签名? (即由供应商签署,这将不会令首先使用SSL?或者我需要一个第三方验证服务,以确保证书的身份?)

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

我将不得不在IIS服务器配置为使用cetificate,和(使用WCF?通过配置最有可能的)与发送请求的客户端证书,但是否有任何其他的任务,我将不得不做,以使这项工作?

Answer 1:

2双向认证客户机和服务器证书会工作。 您可以使用自签名证书为好。 但是,你需要绕过客户端和服务器上的证书验证,如果这两个证书是自签名的,因为它们不被信任的机构签署。

在安装应该按以下步骤进行证书的方面:

服务器端

  1. 安装LOCALMACHINE ServerCert.pfx - >个人商店

  2. ClientCert.cer安装到本地计算机 - >信任的人店

客户端

  1. ClientCert.pfx安装到当前用户 - >个人商店

  2. 安装到本地计算机ServerCert.cer - >可信商店

你会需要装运ServerCert.cer文件到客户端,客户端将需要运送ClientCert.cer给你。

现在,如果你正在使用自签名证书和您的客户端访问您的服务的话,他需要绕过证书验证。 在下面的C#示例代码:

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

希望帮助。

注:但从其不建议在生产环境中使用自签名证书的安全点。



Answer 2:

我同意EJP的答案,但因为你已经接受了不同的地方,这里有什么用自签名证书的问题将是进一步的细节。

使用你的服务器上的自签名证书可以做到的。 你只需要在所有的潜在客户配置为使用信任此证书。 这可以通过导入证书(无私钥)到每台机器的信任店来完成,或者浏览器的受信任的证书存储库中(例如,Firefox使用它自己的,独立于它正在运行的操作系统)。 这里自签名服务器证书主要是定制的CA证书,其中,每个客户端都需要知道对方的,它可以使用(与缺点是自签名证书不能被撤销)服务器的一个特殊情况。 这是正常的,但如果你有超过几台机器,具体而言,这很快会成为一个问题。

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

客户端证书身份验证服务器,它发送一个TLS证书请求消息发送到客户端发起。 此消息包含证书颁发机构,它是愿意接受的名称列表。 客户端,然后使用此列表选择要发送的证书:他们寻找证书(为他们拥有的私有密钥)有一个发行者DN匹配这个CA列表中的名称之一(他们也可以使用证书链,如果中间CA证书必须使链接到发行人DN这是在此CA列表)。

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

解决这个问题的方法是让服务器发送一个空列表。 这提供了更多的自由,给客户以选择哪个证书(它然后由服务器来选择是否要接受它,但是这将始终是这种情况呢)。 这是明确TLS 1.1允许和以前的版本(SSLv3的/ TLS 1.0)是沉默的关于这个主题,但实际上,它工作正常与大多数的SSLv3 / TLS 1.0堆栈作为太据我所知。 (这仍然可能导致笨重的相互作用时,自动选择证书是由浏览器完成的,例如,因为它使得它正确地作出困难的自动选择。)

Java的X509TrustManager可以使用定制getAcceptedIssuers()返回的TLS证书请求消息中的空CA列表。 据我所知,在C#/。NET, SslStreamRemoteCertificateValidationCallback不具有同等学历。 据我所知,使用IIS /时,这个名单是从机器的受信任的证书列表建立SslStream 。 (注意,这是独立的证书验证本身,它只是对服务器的广告可能接受哪些证书。)

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

如果你不希望依赖于商业CA,打造您自己的CA. 它可以是一个工作位(主要是行政)的,但至少你将有一个更清洁造成系统。 通过配置客户端,并与CA证书您的服务器,你应该能够扩展到更多的客户端和服务器,而无需改变那里,你也可以请求客户端证书时,从正常的CA列表行为中获益。



Answer 3:

自签名实际上是到底有多复杂。 不这样做,除非你是在两端的完全控制。

该私钥用于签署在握手发送的证书,这样对方可以检查你是否真正拥有你所发送的证书。 服务器私钥还在产生一些密码碎片秘密的作用。



文章来源: Mutual authentication in SSL/TLS