由SSLCaCertificateFile包混淆

时间:2017-08-31 15:12:22

标签: apache ssl ssl-certificate

我在Apache SSL conf上使用SSLCACertificateFile参数无法理解。举例来说,我有一个ROOT证书“A”,颁发了中间证书“B”。然后,我用B生成了几个叶证书,比如“L1”,“L2”。

现在,根据文档,如果我只想信任L1和L2,我应该将“B”和“A”放在SSLCACertificateFile指向的文件中(如果我只放置证书“B”Apache给出了一个无法-find-issuer错误)。

现在,让我们生成另一个证书“C”,派生自“A”(根)。 apache会信任使用证书C的同行吗?对我来说,这是一个“是的,它会”,因为Apache会在SSLCACertificateFile中找到“C”的发行者,它是“A”!但我不想信任C,我只想信任L1和L2。

我错过了什么吗?

非常感谢!

1 个答案:

答案 0 :(得分:2)

Apache使用的底层TLS堆栈是OpenSSL。默认情况下,OpenSSL需要自签名根证书作为最终信任锚,这意味着仅将中间CA证书添加到信任库是不够的。从OpenSSL 1.0.2开始,有一个标志X509_V_FLAG_PARTIAL_CHAIN可以实现这一点,但我没有在Apache源代码中看到它。

因此,如果您没有对根CA和中间CA的任何控制,则无法将Apache配置为仅信任中间CA,而不能直接或间接由根CA发出的任何其他证书。

但是,如果您可以控制中间CA证书B(即拥有私钥),那么您可以使用相同的主题和私钥B发出另一个CA证书B2,但要使其自签名。由于主题和公钥与B中的相同,因此B发布的每个证书都可以使用B2成功验证。由于B2是自签名的,因此您可以将其作为SSLCACertificateFile中唯一的信任锚,结果只接受B / B2颁发的证书,而不接受根A发布的其他证书。