HTTPS(Hypertext Transfer Protocol Secure),即超文本传输安全协议,是HTTP与SSL/TLS的组合,用以提供加密通讯及对网络服务器身份的鉴定。
由于http是明文传输的,所以在互联风上传输隐私信息非常不安全,目前国外大多数网站都已经全面支持https, 但国内情况很差,不仅很少有大型网站全站支持https,甚至有些网站使用https不规范,安全协议过时,留下了一些安全隐患。
https在不安全的网络上创建了一个安全信道,通过使用加密套件和服务器证书可被验证且可被信任,从而防止信息被截获或中间人攻击,实现保证TCP协议之上的传输层安全。
目前浏览器中都会内置一些根证书(常见的如Microsoft、VeriSign等),基于这些根证书以及这些根证书下签署的证书是可被信任的,通常证书是由这些根证书颁发机构来颁发。
用户访问https协议的网址时,客户端浏览器与服务器握手时,会验证服务器的证书有效性,即是否由一个被信任的证书颁发机构签发;如果不是,浏览器会对用户进行警告。然后浏览器会根据握手时约定好的加密信息加密和解密与服务器之间传输的数据,从而保障数据在传输层的安全。
详细的握手过程下面介绍。
主要有TLS和SSL两种协议。
SSL(Secure Sockets Layer)由网景(Netscape)公司设计,用于对http协议传输的数据进行加密,由此诞生了https. SSL最新的版本是3.0, 之后IETF对SSL 3.0进行了升级,设计了TLS(Transport Layer Security) 1.0, 目前最新版本是1.2, 但还未被广泛支持。
有关SSL/TLS协议的运行机制,可以看阮老师的文章:SSL/TLS协议运行机制的概述
https协议使用了三种加密方式:对称加密、非对称加密和HASH算法:
非对称加密算法时生成公钥只能用于加密数据,是公开的;而网站的私钥用于服务器端对数据进行解密,所以需要特别保管,不能泄漏。
据统计,目前大部分网站使用的TLS 1.0
协议,其次是TLS 1.1
和TLS 1.2
,SSL协议已经支持的很少了,而且被认为是不安全和低效率的。(数据来自Wikipedia)
目前决大部分浏览器都已经对https支持很好了,国外Google、Twitter、Facebook都已经全站支持了,因此可以放心使用。除一些旧的浏览器如IE6等,如使用最广泛的TLS 1.0
协议
除此之外,最新版本的浏览器支持情况还是不错的。
max-age
等http缓存头,但是仍有部分浏览器或者网络结点服务器不能够很好地处理https缓存。证书通常有三种, 购买的时候可根据需要选择:
server {
...
ssl on;
ssl_certificate /yours.crt;
ssl_certificate_key /yours.key;
}
以上是最基本的配置,但还可以再优化些, 在server段中添加:
keepalive_timeout 70;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
以上配置是对https进行优化,让https链接保持,并且设置各进程间的session缓存。
我的做法是将http请求全部301重定向到相应的https url上。https使用的是443端口,而http用的是80端口。下面是主要nginx配置:
server {
listen 80;
server_name ijser.cn www.ijser.cn;
return 301 https://www.ijser.cn$request_uri;
}
以上配置会将所有来自ijser.cn, www.ijser.cn 的http请求重定向到 https://www.ijser.cn 。
当浏览器地址栏上的https认证图标是黄色三角号警告时,表示当前https页面中含有http协议的资源(未加密内容),如'css,js,image'等外链资源。潜在的安全隐患是:
解决的办法也是有的,如Github允许用户在发布的Markdown内容中插入站外图片,如果站外图片的url地址是http的,直接在页面上显示是会导致黄色警告的,Github的解决方案是通过服务器抓取这些图片到自己的服务器上,然后用https访问它们。
至于图片木马问题,可以通过在http response中添加header X-Content-Type-Options: nosniff
解决。
因为https是基于默认信任根证书的,所以如果CA被黑掉,则其下签发的证书都有安全问题,如最近的CNNIC证书问题。
另外,SSL/TLS加密算法的实现也可能有Bug,如去年的心脏出血。
最后,https只是保证了传输过程中不被中间人攻击和服务端是否伪造,其它安全问题仍是无法保证的,如XSS、XSRF、DDos等等。
可能我们开发网站的大多数都是无证程序员,但最好还是让我们的网站有证上岗,至少可以保障部分安全,于我们的服务器、于我们的用户信息。