http[1]是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是一种应用层协议,可用于将超文本服务器中文本、图片、音视频等内容传输到客户端浏览器。
构建与互联网之上的万维网,其主要组成部分就是http协议。目前使用的最广泛的http协议版本是http1.1。
最初的HTTP协议是万维网1991年诞生时,蒂姆·伯纳斯·李爵士(Sir Tim Berners-Lee)在European Organization for Nuclear Research使用的协议。之后万维网协会(World Wide Web Consortium)和Internet工作小组(Internet Engineering Task Force)合作,并最终发布了一系列的RFC,其中最著名的就是RFC 2616。RFC 2616定义了我们今天普遍使用的HTTP协议的一个版本——HTTP1.1。
在TCP/IP参考模型中和OSI参考模型中,http协议处于应用层的位置,http规定了客户端和Web服务端的通信协议,而html则规定了传输的内容的格式、类型。https是在http的基础上,增加了TLS/SSL协议,为通信内容进行加密操作。
http协议默认使用TCP的80端口进行通信。通过在浏览器中输入网站地址,URL (Uniform Resource Locator,统一资源定位符)[2],发起http请求。
URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。URL的一般语法格式为:
protocol:// hostname[:port]/path/[;parameters][?query]#fragment
其中带方括号[]的为可选项。
使用http协议,则url可以表示为
http://www.founder.com/index.html?type=main。
在一次完整的http通信中,会经过如下几个过程[3]:
请求体和应答数据,都是二进制数据。通过content-type指定其格式内容以及编码。
关于http的具体信息可参考HTTP 教程中的内容。
http的简答方便,在网络应用中广发使用,同时http还是存在着缺点的[4]。
为了解决http的以上问题,浏览器可以使用https对http的所有内容进行加密,保证了
https并非是应用层的一种新协议,它只是在http通信接口部分用SSL(Secure Socket Layer)和TLS(Transport Layer Security)协议代替而已。
浏览器使用http时,直接同tcp通信;当浏览器使用https时,浏览器会先同TLS/SSL进行通信,然后TLS/SSL再同tcp进行通信。
在使用TLS/SSL后,http便拥有了加密功能。TLS/SSL是独立于http的协议,所以其也可以同应用层的其他协议配合使用。
SSL由从前的网景公司开发,有1,2,3三个版本,但现在只使用版本3。
TLS是SSL的标准化后的产物,有1.0 1.1 1.2三个版本。主流浏览器都已经实现了TLS 1.2的支持。
TLS 1.0通常被标示为SSL 3.1,TLS 1.1为SSL 3.2,TLS 1.2为SSL 3.3。SSL是TLS旧的称呼。
由于习惯问题,虽然现在都是使用TLS,但一直统称为TLS/SSL。
对传输内容进行加密,是增加http通信安全的第一步。
可以采用对称加密(DES,AES),也可以采用非对称加密(RSA,DSA)。此外还有数字签名技术(MD5,SHA)。
对称加密相比非对称加密,速度更快,需要的计算量更少。
https通信过程中使用到了对称加密、非对称加密和数字签名技术。
其中非对称加密,在目前已有算力的情况下是无法破解的。原理是,两个大素数相乘十分容易,但想要对其乘积进行因式分解却极其困难。这两个大素数,就是非对称加密中的公钥、私钥。
在未使用数字证书保证服务端的公钥正确性时,依然存在中间人攻击的可能性,只要中间人作为客户端同实际服务端进行通信,作为服务端同实际客户端进行通信即可。客户端没有任何方法判断服务端发送过来的公钥是否为真正的公钥。于是在https通信中,使用到了数字证书,用于保证客户端可以获得正确的服务端公钥。
数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名。数字证书还有一个重要的特征就是只在特定的时间段内有效。
数字证书是一种权威性的电子文档,可以由权威公正的第三方机构,即CA(例如中国各地方的CA公司)中心签发的证书,也可以由企业级CA系统进行签发。
数字证书颁发过程一般为:
客户端获得了数字证书,通过使用认证中心的公钥对证书中用户的跟人信息以及公钥信息的数字摘要进行加密,获得数字签名,同证书中的数字签名进行对比,即可验证此证书的正确性。
通过证书认证链,可以获得指定认证中心的公钥。
证书中有颁发者的信息,以及其认证中心的信息,通过此种方式,可以获得一个认证中心的认证链。
在认证链的最顶端是根认证中心,根认证中心的数字证书一般都是已经内置在操作系统或者浏览器中了,表示对此证书的绝对信任。
通过根证书可以验证其子认证中心的证书的正确性,从而获得子认证中心的公钥,以此类推,直到获得指定认证中心的公钥。
* 证书:.crt .cer .pem
* 私钥:.key
* 证书请求:.csr
把证书和私有key 放到同一个文件里边,这时候扩展名通常叫.pem。Java的keystore是自有格式。在生成私钥公钥后,如果需要申请证书,需要生成csr文件。
通过以上内容,能够初步了解https以及数字证书的工作原理。
在https通信中,比原有的http通信,多了三个元素:公钥、私钥、证书。其中证书包含公钥内容。
1、首先使用jdk自带的keytool工具生成证书。[8]
在windows的powershell或者linux的shell中,键入一下命令(keystore是证书保存位置)
keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore "D:\tomcat.keystore"
根据提示输入必要的信息。
密钥库口令:123456(这个密码非常重要) 名字与姓氏:192.168.0.110(以后访问的域名或IP地址,非常重要,证书和域名或IP绑定) 组织单位名称:anything(随便填) 组织名称:anything(随便填) 城市:anything(随便填) 省市自治区:anything(随便填) 国家地区代码:anything(随便填)
最后“是否正确?”中键入“y”和回车。此时证书已生成。
2、应用证书到tomcat
修改tomcat中的conf/server.xml文件。
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="D:/tomcat.keystore" keystorePass="123456" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
3、测试tomcat的https
启动tomcat,在浏览器中输入https协议格式的url地址。
[1]. http://baike.baidu.com/item/http
[2]. http://baike.baidu.com/link?url=GMLo1XhB34TUkdKPEXewjpBYsECNMqp4o0jYqTNZuTYYTJDoDVIomoWdDRlavPCaWpOH8cBDMy7vdpZELSMrrOxnRhfNt4kuoiSWYRYMUgO
[3]. http://blog.csdn.net/u013087513/article/details/49465597
[4]. http://book.51cto.com/art/201404/436093.htm
[5]. http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
[6]. http://baike.baidu.com/item/%E6%95%B0%E5%AD%97%E8%AF%81%E4%B9%A6
[7]. http://www.2cto.com/article/201203/122095.html
[8]. http://blog.csdn.net/xiaojunhu/article/details/8263687
[9]. http://blog.sina.com.cn/s/blog_503506460100mdvt.html
原文:http://www.cnblogs.com/mahuan2/p/6389093.html