根据this question当我们使用HTTPS时,所有的HTTP头都被加密(包括请求URI和主机头)。
当浏览器想要浏览网站上的一个使用HTTPS的页面时,它首先创建安全连接,然后它发送HTTP请求(加密)并且服务器将答案返回给浏览器。现在假设有多个安全网站带有多个SSL证书,所以当服务器想要创建安全连接时,它如何检测应该使用哪个证书,因为它不知道任何关于请求的信息!验证共享主机上的SSL证书
回答
由于在接收到Host
标头之前协商SSL通道,因此HTTPS服务器最多可以为每个绑定的IP端点(IP地址和端口)使用一个证书。换句话说,要使用两个不同的SSL证书,您需要将每个虚拟主机绑定到不同的端口或不同的IP地址。
您的陈述不正确 - TLS的服务器名称扩展使这些要求过时。 –
据我所知,该扩展的支持尚未广泛部署。 – cdhowie
所有主流浏览器和几乎所有(如果不是全部)TLS库都支持它。我相信,所有主流服务器都支持它。 –
这样做的基础是为每个虚拟服务器提供一个SSL密钥(set)。例如,在Apache中,它比较简单。每个共享网站都可能在<VirtualHost>
指令中。 SSL密钥可以在其中指定,因此仅适用于该虚拟主机。
粗糙例如:
<VirtualHost *:443>
ServerName server.com
SSLEngine on
SSLCertificateKeyFile /etc/ssl/server_com.key
SSLCertificateFile /etc/ssl/server_com.crt
SSLCertificateChainFile /etc/ssl/server_com.ca-bundle
的服务器将使用指定的键指向该网站通过HTTPS的所有请求。 Further details on the Apache site。类似的东西应该适用于大多数支持虚拟主机概念的Web服务器。
由于证书和域名匹配,您不会收到任何错误。
在TLS之前,服务器确实没有办法知道它应该呈现给客户端的哪个主机的证书,并且这导致了问题。
在TLS中引入了一个名为Server Name
的特殊扩展名(请参阅RFC 3546),它允许客户端告诉服务器客户端想要连接到的主机。根据此扩展的内容,服务器可以提供适当的证书。当然,所有这些都要求双方都支持和使用TLS和扩展本身。
- 1. Android - SSL证书到IP - 仍然失败的主机验证
- 2. MaxCDN - 共享ssl - 无效证书?
- 3. 共享SSL证书作为子域
- 4. TLS/SSL证书验证
- 5. 验证SSL证书对MITM
- 6. Libcurl SSL证书验证
- 7. Android验证SSL证书
- 8. SSL证书验证Urllib2
- 9. 无法验证SSL证书
- 10. SSL证书验证失败
- 11. SSL证书验证编程
- 12. SSL证书签名验证
- 13. Boost.Asio SSL上下文未验证证书
- 14. perl ssl证书ccert证书上的验证失败
- 15. 没有主机名的SSL证书
- 16. 在共享主机上设置Amazon aws证书S3共享主机上的PHP php 3
- 17. 禁用证书主机名验证
- 18. Boost,asio,https和主机/证书验证
- 19. Azure上的单个站点带有共享的SSL证书
- 20. Apache httpd虚拟主机SSL证书
- 21. 公共SSL证书错误
- 22. 如何在共享主机上使用Windows身份验证?
- 23. 验证SSL证书/密钥的格式
- 24. 验证nodejs中的ssl证书
- 25. 验证iOS中的SSL证书
- 26. 关闭Ruby中的SSL证书验证
- 27. 验证SSL证书的确切程度?
- 28. FTPS(SSL)的证书验证/安装?
- 29. pychef中的ssl证书验证
- 30. 验证SSL证书的问题
请回顾[这个问题](http://stackoverflow.com/questions/5316513/is-ssl-possible-with-virtual-hosting-on-one-ip)及其答案。 –