HTTPS和HTTP有什么区别,到底安全在哪里?
在上网获取信息的过程中,我们接触最多的信息加密传输方式也莫过于 HTTPS 了。每当访问一个站点,浏览器的地址栏中出现绿色图标时,意味着该站点支持 HTTPS 信息传输方式。HTTPS 是我们常见的 HTTP 协议与某个加密协议的混合体,也就是 HTTP+S。这个 S 可以是 TLS(安全传输层协议)、也可以是 SSL(安全套接层),不过我更认可另一个抽象概括的说法,HTTP+Security。
首先,HTTPS并不是这种加密技术的正式名称,HTTPS代表的是“在TLS/SSL上实现的HTTP协议”,因此实现加密的其实是位于HTTP下面的TLS/SSL层。
我们看看TLS/SSL所实现的几个主要机制:
1 证书:通过第三方权威证书颁发机构(如VeriSign)验证和担保网站的身份,防止他人伪造网站身份与不知情的用户建立加密连接。
2 密钥交换:通过公钥(非对称)加密在网站服务器和用户之间协商生成一个共同的会话密钥。
3 会话加密:通过机制(2)协商的会话密钥,用对称加密算法对会话的内容进行加密。
4 消息校验:通过消息校验算法来防止加密信息在传输过程中被篡改。
通过上述机制,用户与网站之间的传输内容受到了保护,因此能够获得很高的安全性。不过,任何密码学手段都不是绝对安全的,上面几个机制中其实都存在可能的风险:
1 证书:如果有人伪造证书,浏览器会发出警告,提示用户该网站的证书可能是伪造的,应该停止访问,但如果你无视浏览器的警告,你的会话信息就有可能被伪造者窃取。此外,如果第三方证书颁发机构遭到攻击,攻击者窃取了已颁发的证书密钥,就可以伪造相应的网站证书,完全骗过浏览器的安全机制,这样的例子的确曾经发生过。
2 密钥交换:RSA,这是一种最普遍使用的公钥加密算法,一般来说安全性很高。
3 会话加密:AES-256(CBC Mode),这是一种非常广泛使用的加密算法,采用256位密钥代表其安全性很高,如果采用128位密钥(AES-128)则安全性就差一些。
4 消息校验:SHA1,这是一种散列算法,SHA1的安全性比MD5要好,但如果采用SHA256则安全性会更好一些。
上面很抽象是不是,我们用“传纸条”这个人人小时候都做过的事来形象的说明一下。
HTTP
假设你现在正坐在教室里上课,现在你非常想和走道旁的迷人的 TA 说一些话,一般这个时候你会用“传纸条”的方式来交流。而这个方式和 TCP/IP 协议基本的工作模式十分相像:
通过小动作引起对方注意;
对方以多种可能的方式(注视、肢体语言等)回应于你;
你确认对方感知到你后,将纸条传给对方;
对方阅读纸条;
对方给予你阅读后的反应;
怎么样,这个流程是不是很熟悉?
如果你要传递纸条的 TA 距离你很远怎么办?HTTP 协议就是指你在纸条上写明你要传给的 TA 是谁,或者 TA 的座位在哪,接着只需要途径的同学拿到纸条后根据纸条上的指示依次将纸条传过去就 OK 了。
这个时候问题来了:途径的同学完全可以观看并知道你在纸条上写了什么。
这就是 HTTP 传输所面临的问题之一:中间人攻击,指消息传递的过程中,处在传递路径上的攻击者可以嗅探或者窃听传输数据的内容。
HTTPS
HTTPS 针对这个问题,采用了“加密”的方式来解决。最著名原始的加密方法就是对称加密算法了,就是双方约定一个暗号,用什么字母替换什么字母之类的。现在一般采用一种叫 AES(高级加密算法)的对称算法。
对称加密算法既指加密和解密需要使用的密钥 key 是一样的。
AES 在数学上保证了,只要你使用的 key 足够长,破解几乎是不可能的(除非光子计算机造出来了)
我们先假设在没有密钥 key 的情况下,密文是无法被破解的,然后再回到这个教室。你将用 AES 加密后的内容噌噌噌地写在了纸条上,正要传出去的时候你突然想到,TA 没有 key 怎么解密内容呀,或者说,应该怎么把 key 给TA?
如果把 key 也写在纸条上,那么中间人照样可以破解窃听纸条内容。也许在现实环境中你有其他办法可以把 key 通过某种安全的渠道送到 TA 的手里,但是互联网上的实现难度就比较大了,毕竟不管怎样,数据都要经过那些路由。
于是聪明的人类发明了另一种加密算法——非对称加密算法。这种加密算法会生成两个密钥(key1 和 key2)。凡是 key1 加密的数据,key1 自身不能解密,需要 key2 才能解密;凡事 key2 加密的数据,key2 自身不能解密,只有 key1 才能解密。
目前这种算法有很多中,最常用的是 RSA。其基于的数学原理是:
两个大素数的乘积很容易算,但是用这个乘积去算出是哪两个素数相乘就很复杂了。好在以目前的技术,分解大数的素因确实比较困难,尤其是当这个大数足够大的时候(通常使用2的10次方个二进制位那么大),就算是超级计算机,解密也需要非常长的时间。
现在就把这种非对称加密的方法应用在我们教室传纸条的场景里。
你在写纸条内容之前先用 RSA 技术生成了一对密钥 k1 和 k2。
你把 k1 用明文传了出去,路经也许有人会截取,但是没有用,k1 加密的数据需要 k2 才可以破解,而 k2 在你自己手中。
k1 传到了目的人,目的人会去准备一个接下来准备用于对称加密(AES)的传输密钥 key,然后用收到的 k1 把 key 加密,传给你。
你用手上的 k2 解出 key 后,全教室只有你和你的目的人拥有这个对称加密的 key,你们俩就可以尽情聊天不怕窃听啦~
这里也许你会有问题,为什么不直接用非对称加密来加密信息,而是加密 AES 的 key 呢?因为非对称加密和解密的平均消耗时间比较长,为了节省时间提高效率,我们通常只是用它来交换密钥,而非直接传输数据。
然而使用非对称加密真的可以防范中间人攻击吗?虽然看上去很安全,但是实际上却挡不住可恶的中间人攻击。
假设你是 A,你的目的地是 B,现在要途径一个恶意同学M。中间人的恶意之处在于它会伪装成你的目标。
当你要和 B 完成第一次密钥交换的时候,M 把纸条扣了下来,假装自己是B并伪造了一个 key,然后用你发来的 k1 加密了 key 发还给你。
你以为你和 B 完成了密钥交换,实际上你是和 M 完成了密钥交换。
同事 M 和 B 完成一次密钥交换,让 B 以为和 A 你完成了密钥交换。
现在整体的加密流程变成了A(加密链接1)->M(明文)->B(加密链接2)的情况了,这时候 M 依然可以知道A和B传输的全部消息。
这个时候就是体现 HTTPS 和传纸条的区别了。在教室里,你是和一位与你身份几乎对等的的对象来通信;而在访问网站时,对方往往是一个比较大(或者知名)的服务者,他们有充沛的资源,或许他们可以向你证明他们的合法性。
此时我们需要引入一个非常权威的第三方,一个专门用来认证网站合法性的组织,可以叫做 CA(Certificate Authority)。各个网站服务商可以向 CA 申请证书,使得他们在建立安全连接时可以带上 CA 的签名。而 CA 得安全性是由操作系统或者浏览器来认证的。
你的 Windows、Mac、Linux、Chrome、Safari 等会在安装的时候带上一个他们认为安全的 CA 证书列表,只有和你建立安全连接的网站带有这些CA的签名,操作系统和浏览器才会认为这个链接是安全的,否则就有可能遭到中间人攻击。
一旦某个 CA 颁发的证书被用于的非法途径,那么这个 CA 之前颁发过的所有证书都将被视为不安全的,这让所有 CA 在颁发证书时都十分小心,所以 CA 证书在通常情况下是值得信任的。
正如声网agoraio Web SDK考虑数据安全问题,限制了http访问getUserMedia接口,只能通过https方式访问。所以会出现用http在Chrome浏览器(47以上版本)中访问Agora服务失败,我该怎么办?
Agora Web解决方案基于WebRTC技术建立浏览器间的音视频通信,在WebRTC协议中,浏览器通过getUserMedia接口获取视频(通过摄像头)和音频(通过麦克风)数据,Google Chrome是支持WebRTC的主流浏览器之一,在v47及以上版本,考虑到数据安全问题,限制了http访问getUserMedia接口,只能通过https方式访问。除了chrome浏览器外,Opera浏览器在v34版本后也跟进了对http的限制,Firefox暂时没有此更新。但是考虑到https是WebRTC协议推荐的安全访问方式,建议客户统一通过https来访问Agora Web服务,也能兼容各浏览器平台。
恰巧遇到上传文件时,后端服务器生成servlet http请求,提供给web端,使其能直接从浏览器通过http请求将流发送到后端服务器,不需进过web服务端,而web端的请求都为https,涉及https转http请求问题问题描述还有一点
问题简而言之就是需要将后端的http请求变成https请求,这里有两种路子去处理:
1) 本身后端反馈给前端的是http的servlet,是否可以将servlet生成https的请求;
2) 能否通过其他代理手段,将后端http请求转换一下。
因时间紧,优先考虑代理方案。常用的代理服务手段nginx等,优先选择nginx,轻量与简单。
目标如下:
客户端 --(https)-->nginx--(http)-->servlet容器
选择nginx-1200版本
代理https需要配置SSL,以如下命令生成SSL配置,加入到nginx配置中
1)生成密钥,使用openssl生成密钥privatekey,长度为1024
openssl genrsa -out privatekey 1024
2)使用密钥生成证书serverpem
openssl req -new -x509 -key privatekey -out serverpem -days 365
证书信息可以随便填或者留空,只有Common Name要根据你的域名填写,即填写nginx所在服务器的IP或域名。
启动nginx即可
HTTP明文传输,HTTPS加密传输。
解释原因:
而使用HTTPS时,流量数据被加密,即使数据包被嗅探或以其他方式被截获,它们也会被视为无意义的字符。
当信息通过常规HTTP发送时,信息被分解成数据包,使用软件可以轻松地“嗅探”这些数据包。在公共Wi-Fi等不安全网络情况中极易被拦截。事实上所有通过HTTP进行的通信都是纯文本的,这使得任何人都可以通过工具访问它们,并且很容易受到攻击。
HTTPS使用加密协议加密通信。该协议被称为传输层安全(TLS),之前它被称为安全套接字层(SSL)。该协议通过使用所谓的非对称公钥基础设施来保护通信,这种类型的安全系统使用两个不同的密钥加密双方之间的通信。
任何网站,特别是那些需要登录的网站,都应该使用HTTPS。在Chrome等浏览器中,不使用HTTPS的网站与使用HTTPS的网站的标记是不同的,在URL地址栏会出现一个绿色的锁,表示网页是安全的。没有使用HTTPS的网站会被标记为不安全!
超文本传输安全协议(HTTPS)是HTTP的安全版本,它是用于在浏览器和网站之间发送数据的主要协议,HTTPS加密、提高数据传输的安全性。
实现HTTPS办法:确定需要的域名,进入淘宝中找到Gworg申请SSL证书配置后实现HTTPS。
Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Ramblerru 站点开发的,,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
1、首先需要配置站点的WoSign SSl证书
打开Nginx安装目录下conf目录中的nginxconf文件 找到
# HTTPS server
#
#server {
# listen 443;
# server_name localhost;
# ssl on;
# ssl_certificate certpem;
# ssl_certificate_key certkey;
# ssl_session_timeout 5m;
# ssl_protocols SSLv2 SSLv3 TLSv1;
# ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index indexhtml indexhtm;
# }
#}
将其修改为 :
server {
listen 443;
server_name localhost;
ssl on;
ssl_certificate sslkey/publiccer; (证书公钥)
ssl_certificate_key sslkey/privatekey; (证书私钥)
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv11 TLSv12;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
location / {
root html;
index indexhtml indexhtm;
}
}
保存退出,并重启Nginx。
通过https方式访问您的站点,测试站点证书的安装配置。
3、配置强身份认证
1、 修改nginxconf文件
如果要求客户采用客户证书认证方式,可以在原来的配置下增加如下参数:
server {
ssl_verify_client on 要求SSL客户证书认证。
ssl_client_certificate trustcer 签发客户证书的CA证书,用来验证客户证书。
ssl_verify_depth 3 SSL客户证书认证链长度。
}
4、重启站点使用您的客户端证书进行登陆测试
0条评论