在SSL中使用Apache时,是否将使用“SSLCertificateFile”指令指定的整个证书交给客户端?
如果是这样,是否包含私钥和公钥?
只有证书(包含公钥和额外的信息,例如机器的身份,而不是私钥)被发送到客户端。 如果存在到CA的链(通过SSLCertificateChainFile或通过SSLCACertificatePath或SSLCACertificateFile ),则应该发送证书链。 你将会看到带有openssl s_client的-showcerts选项的完整链:
echo | openssl s_client -showcerts -connect www.your.host.example:443
你可以,但不必把私钥放在同一个文件中,它可以分解成SSLCertificateKeyFile 。
只有公钥被传输给客户端。 SSLcertificatefile指定公钥,指令SSLcertificateKeyFile指令用于私钥。
如果你想看到什么是transmited你可以使用openssl来连接并看到证书。 像这样的命令openssl s_client -connect www.google.org:443将连接到谷歌,你会看到公共证书和有关证书的一些细节。
这花了我很长时间来包裹我的头,但一旦你得到它,它只是点击。
Apache不会那样做。 有一个很好的理由。
你已经看到你发送的CSR来获得你的CSR,对吧? 随着信息(通用名,城市,州等)
那么,一个私钥几乎把所有的信息弄懵了,解锁它的唯一方法就是使用公钥。 你可以把它像糖果一样给出来,但是你不能泄露私钥。
所以,现在当你点击你的页面时,你将这些混合的数据发送到某个networking浏览器,浏览器使用你的公钥来解码这个信息。 如果公钥是正确的,那么浏览器会看到(通用名称,城市,州等),并且知道它正在与之交谈的那个人是合法的。
如果私钥是某个随机的服务器,那么这个混合的数据将被解密为更多的混合数据。 总垃圾。 当时的浏览器知道它正在和冒名顶替的人交谈。
此外,浏览器使用签名原始密钥(比如Verisign或Godaddy)的人的公共密钥,因此这些人都是知名的和可信的消息来源…他们这样做是为了确保他们与正确的人交谈。 这就是为什么你通常从Verisign这样的人那里获得你的证书。
此外,您可以签署自己的证书,让您的用户(如在AD域中)信任您,但您必须确保所有用户的机器都信任您的“签名人”。 这是下一级…
公钥被发送到客户端,使用该公钥对数据进行encryption,只有私钥才能解密数据。
私钥永远不会发送给客户端,这将打败encryption通信的整个点。