当使用带有 SSL 的 Apache 时,“SSLCertificateFile”指令指定的完整证书是否会交给客户端?
如果是,它是否包含私钥和公钥?
答案1
仅将证书(包含公钥和额外信息,例如机器身份,但不包含私钥)发送给客户端。如果有到 CA 的链(通过 或SSLCertificateChainFile
通过SSLCACertificatePath
或SSLCACertificateFile
),则应发送证书链。您将看到带有-showcerts
选项的完整链openssl s_client
:
echo | openssl s_client -showcerts -connect www.your.host.example:443
可以,但不必将私钥放在同一个文件中,可以将其分离为SSLCertificateKeyFile
。
答案2
只向客户端传输公钥。SSLcertificatefile
指定公钥,指令 指令SSLcertificateKeyFile
用于私钥。
如果您希望确切地查看传输的内容,可以使用 openssl 进行连接并查看证书。 类似这样的命令openssl s_client -connect www.google.org:443
将连接到 google,您将看到公共证书以及有关该证书的一些详细信息。
答案3
我花了很长时间才理解这一点,但一旦理解了,就恍然大悟了。
Apache 不会这么做。理由很充分。
您已经看过您发送的那些 CSR 来获取您的 csr 了,对吧?带有信息(通用名称、城市、州等)
嗯,私钥基本上把这些信息都混在一起了,解锁它的唯一方法是使用公钥。你可以像糖果一样把公钥分发出去,但不能把私钥分发出去。
因此,当某人访问您的页面时,您将这些混合数据发送到某个 Web 浏览器,浏览器将使用您的公钥来解码该信息。如果公钥正确,浏览器将看到(常用名称、城市、州等)并知道正在与之交谈的人是合法的。
如果私钥来自某个随机服务器,那么这些混杂数据解密后会变成更多混杂数据。完全是垃圾。此时浏览器就知道它正在与冒名顶替者交谈。
此外,浏览器使用签署原始密钥的人(例如 verisign 或 godaddy)的公钥,因为这些都是知名且值得信赖的来源...他们这样做也是为了确保他们与正确的人交谈。这就是为什么您通常从 Verisign 这样的公司获取证书的原因。
此外 - 您可以签署自己的证书并让您的用户(例如在 AD 域中)信任您,但您必须确保所有用户的机器都信任您的“签名者”。这是下一个级别...
答案4
公钥被发送到客户端,客户端使用该公钥加密数据,只有私钥才能解密数据。
私钥永远不会发送给客户端,这会使加密通信的整个意义荡然无存。