我正在寻找一种简洁的安全实现,以便客户端与我的 Apache 实例进行通信。它基本上是一种系统到系统 API 通信,不涉及组织外部的任何客户端。到目前为止,我们实现的内容如下所示,
- 我们创建了一个客户端密钥并生成了一个 CSR。
- 由组织CA签署的CSR。
- 我们的证书与客户端私钥结合并生成了 pfx。该 pfx 已共享给 API 调用者系统。
对 Apache httpd.conf 进行了以下修改
SSLVerifyClient require
SSLVerifyDepth 3
<Location />
SSLRequire %{SSL_CLIENT_S_DN_CN} eq "client_cn_name"
</Location>
这是正确的方法吗?这里的问题是没有服务器端验证,从某种意义上说,它没有与 Apache 实例进行握手。客户端证书直接位于根证书下。我在想,用实际上由组织 CA 颁发的 Apache 域私钥签署客户端 csr 是不是一个好主意?
另外,有人能解释一下这个 SSLRequire 指令的行为吗?我尝试生成一个自签名证书,它看起来类似于客户端证书,并且根证书和客户端的 CN 相同。但握手并不顺利,但我不确定自签名证书是否存在任何漏洞,可以通过此安全性?
感谢您的想法。
答案1
您可以使用组织证书或 Apache 服务器证书签署客户端证书。无论使用哪一个,请务必将其放入 SSLCACertificateFile 指令中,例如:
SSLCACertificateFile /path/to/apache/cert
作为SSLCACertificateFile 的文档表示,这是“您与之打交道的证书颁发机构 (CA) 的证书”文件。这些证书用于客户端身份验证。因此,这将确保要接受客户端证书,必须由该证书和密钥签名。如果您为此使用 Apache 服务器证书,则将其视为客户端证书的中间签名证书。
请注意 SSLRequire 是已弃用. 文档说这做了同样的事情:
Require expr %{SSL_CLIENT_S_DN_CN} eq "client_cn_name"
这有助于明确不涉及 SSL 证书检查;它只是检查表达式是否为真。