本文目录
1、HTTP简介
http是应用层的一种协议,它是在TCP/IP基础上的。就是说,客户端与服务器端首先要建立TCP连接,然后再是http的请求与相应。而TCP的创建连接是通过客户端与服务器端的三次握手
实现的,关闭是通过四次握手
实现。如果每次http请求后,TCP连接立刻关闭,http再请求时,再重新创建连接,就造成服务器压力比较大、客户端等待时间长的问题。因此最好是第一次http请求创建的TCP连接,能够保存一段时间,这样,下次再有http请求时,就不用创建TCP连接了。提高了响应速度。
1.1 http的request
下面的图就是http的请求报文的格式。
其中请求头部,就是各种键值对。在其中就有这一项:Connection: Keep-Alive
。这个就是上面讲到的要保持TCP的连接。目前http协议版本中keep-alive
默认是开启的。TCP是全双工的,因此要客户端和服务器都可以发起关闭请求,然后通过四次握手
完成关闭。
1.1.1 keep-alive要保持多久?
这个取决客户端和服务器端的。目前Firefox浏览器是115秒,IIS服务器是120秒。也就说,Firefox等待最后一次服务器返回的响应后,会保持115秒,时间到了后,就会主动发起关闭请求。而IIS服务器是收到客户端最后一次请求后,保持TCP连接120秒,若这段时间,没有请求,则120后,IIS将会关闭TCP连接。若客户端是Firefox,服务器是IIS,那还不等IIS关闭TCP连接时,Firefox就发起关闭请求了,然后Firefox和IIS之间的TCP连接就关闭了。
下面是Firefox和IIS的设置界面
1.2 http的响应
1.3 http教程
这个教程详细说明了http的相关内容:HTTP教程
这篇文章详细说明了keep-alive与消息报头:消息报告与keep-alive
这篇文章深入浅出的介绍了http的内容:HTTP详解
这篇文章详细的介绍了keep-alive知识,并有大量的截图,推荐。keep-alive
1.4 http的问题
http是通过明文传递数据,因此通过网络抓包,可以获取你的所有信息。这是非常不安全的,那如何保证传输数据的安全呢?
2、HTTPS简介
为了解决安全问题,就出现网络安全协议。就是SSL/TLS。说个题外话,SSL和TLS是同一个东西。网景公司在90年代设计了SSL(secure sockets layer)协议,后来这协议在1999年时成为了标准,名称也进行了修改,改为TLS(transport layer security)。
网络安全协议是http与TCP之间,如图所示
2.1 如何实现?
有了安全协议,并不是说就网络就安全了,万事大吉了。我们要将协议具体的实现啊!而具体的实现就是证书。若你想创建一个https的网站,你必须准备一个证书,并把证书部署到网站上,这样才是真正的实现。
2.1.1 基础知识
- 网站证书分为公钥和私钥。可以把公钥认为是一个带着锁的铁盒子(锁是开着的哈,得能往里面放东西),而私钥是能打开锁的钥匙。
- 密钥:一般就是一个字符串或数字,在加密或者解密时传递给加密/解密算法。
- 对称加密算法:加密和解密都是使用的同一个密钥。因此对称加密算法要保证安全性的话,密钥要做好保密,只能让使用的人知道,不能对外公开。
- 非对称加密算法:加密使用的密钥和解密使用的密钥是不同的。 公钥密码体制就是一种非对称加密算法。
2.1.2 https网站的访问流程
https网站的访问流程,如下图所示
详细说明各个操作
- 客户端发起HTTPS请求
这个没什么好说的,就是用户在浏览器里输入一个https网址,然后连接到server的443端口。 - 服务端的配置
采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl就是个不错的选择,有1年的免费服务)。这套证书其实就是一对公钥和私钥。公钥可认为是一个带锁的铁盒子,私钥是能打开的钥匙。 - 传送证书
服务器把铁盒子(公钥)返回给客户端。[还包含了其他很多信息,如证书的颁发机构,过期时间等等] - 客户端验证证书
客户端对铁盒子进行验证。这部分验证就是浏览器按照SSL协议实现的,它验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随即值。然后用证书对该随机值进行加密。就好像上面说的,把随机值放到铁盒子里锁起来 - 传送加密信息
客户端把上锁的铁盒子发给服务器。 - 服务端解密信息
服务端收到铁盒子后,因为只有服务器端有钥匙,所以服务端能够打开铁盒子,获得客户端的随机值。到这一步,客户端和服务端就都有这个随机值了。然后服务端将内容通过该随机值进行对称加密。所谓对称加密就是,将内容和秘钥通过算法混合在一起,这样除非知道秘钥,不然无法获取内容,而正好客户端和服务端都知道这个秘钥(随机值),所以只要加密算法够彪悍,秘钥够复杂,数据就够安全。 - 传输加密后的信息
这部分信息是服务端用随机值(秘钥)加密后的信息,,并发送给客户端 - 客户端解密信息
因为客户端也有这个秘钥(随机值),因此客户端能够对加密的内容进行解密,然后完成相关内容展示或后续操作。整个过程第三方即使监听到了数据,也束手无策
2.1.3 https网站总结
通过上面的过程,就会发现。网站的证书,只是一个牵头的作用。目的是使用客户端产生的秘钥(随机数)对内容进行加密,并在客户端和服务端使用。
2.1.4 https的资料
上面https的大部分内容是来自:图解https通信过程和网络编程和网络框架
2.2 证书制作及应用
上面说了证书很重要,那如何制作一个证书呢?下面演示如何通过openssl制作一个证书
提前说明:我要创建一个网站,打算网站的域名为:myhttpssitedemo.com
。因此进行如下的操作
1、下载OpenSSL,并完成安装
2、将下面内容,保存为openssl.cnf
,并放在OpenSSL安装路径的OpenSSL-Win64
文件夹内(OpenSSL-Win32
还是OpenSSL-Win64
取决于你安装的版本,我的电脑是64位的,所以是OpenSSL-Win64
)
[ req ]
default_bits = 2048
default_keyfile = server-key.pem
distinguished_name = subject
req_extensions = req_ext
x509_extensions = x509_ext
string_mask = utf8only
# The Subject DN can be formed using X501 or RFC 4514 (see RFC 4519 for a description).
# Its sort of a mashup. For example, RFC 4514 does not provide emailAddress.
[ subject ]
countryName = CN
countryName_default = US
stateOrProvinceName = BJ
stateOrProvinceName_default = NY
localityName = Bei Jing
localityName_default = New York
organizationName = The Test Company
organizationName_default = Example, LLC
# Use a friendly name here because its presented to the user. The server's DNS
# names are placed in Subject Alternate Names. Plus, DNS names here is deprecated
# by both IETF and CA/Browser Forums. If you place a DNS name here, then you
# must include the DNS name in the SAN too (otherwise, Chrome and others that
# strictly follow the CA/Browser Baseline Requirements will fail).
commonName = Zheng Lin
commonName_default = Example Company
emailAddress = yourownemail@126.com
emailAddress_default = test@test.com
# Section x509_ext is used when generating a self-signed certificate. I.e., openssl req -x509 ...
[ x509_ext ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
# You only need digitalSignature below. *If* you don't allow
# RSA Key transport (i.e., you use ephemeral cipher suites), then
# omit keyEncipherment because that's key transport.
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
# RFC 5280, Section 4.2.1.12 makes EKU optional
# CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
# In either case, you probably only need serverAuth.
# extendedKeyUsage = serverAuth, clientAuth
# Section req_ext is used when generating a certificate signing request. I.e., openssl req ...
[ req_ext ]
subjectKeyIdentifier = hash
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
# RFC 5280, Section 4.2.1.12 makes EKU optional
# CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
# In either case, you probably only need serverAuth.
# extendedKeyUsage = serverAuth, clientAuth
[ alternate_names ]
DNS.1 = myhttpssitedemo.com
DNS.2 = www.myhttpssitedemo.com
DNS.3 = mail.myhttpssitedemo.com
DNS.4 = ftp.myhttpssitedemo.com
# Add these if you need them. But usually you don't want them or
# need them in production. You may need them for development.
# DNS.5 = localhost
# DNS.6 = localhost.localdomain
# DNS.7 = 127.0.0.1
# IPv6 localhost
# DNS.8 = ::1
有几个地方需要根据你自己的情况进行修改。
3、打开cmd,找到OpenSSL的bin路径。
本人的路径为:cd C:\Program Files\OpenSSL-Win64\bin
4、设置配置文件路径。set OPENSSL_CONF=C:\Program Files\OpenSSL-Win64\openssl.cnf
5、生成并导出证书。openssl req -x509 -newkey rsa:4096 -sha256 -nodes -keyout myhttpssitedemo.key -out myhttpssitedemo.crt -subj "/CN=myhttpssitedemo.com" -days 3650
。
【注意】若cmd无法识别OpenSSL的命令,则需要进行配置环境变量。将C:\Program Files\OpenSSL-Win64\bin
添加path信息中
这样,就能够在C:\Program Files\OpenSSL-Win64\bin
路径下,找到myhttpssitedemo.crt
和myhttpssitedemo.key
两个文件。如图所示
6、将证书导入到证书中心:
6.1 win+R
快捷键后,输入certlm.msc
,打开证书中心。选择“受信任的根证书颁发机构”->“证书”,右键,进行证书导入。如图所示
按照操作,把证书导入
至此,可以看到证书了
7、将证书导出。将证书导出为证书链文件(p7b格式文件)
选中刚刚导入的证书,右键,所有任务,导出。将文件导出为p7b文件,并存储在C:\Program Files\OpenSSL-Win64\bin
目录下
然后删除在证书中心中的证书(就是第6步导入的那个)
在bin文件夹下就出现了p7b文件
8、执行以下命令
8.1 openssl pkcs7 -in myhttpssitedemo.p7b -inform DER -out result.pem -print_certs
8.2 openssl pkcs12 -export -inkey myhttpssitedemo.key -in result.pem -name myhttpssitedemo.com -out final_result.pfx
在cmd中输入密码,然后就会在bin文件夹中,产生最终的证书文件
执行的命令及截图如下:
9、将final_result.pfx进行安装
双击final_result.pfx进行安装
选择本地计算机
输入密码
选择“标识此秘钥为可导出的秘钥…”、“包括所有扩展属性”
将证书放在收信任的根证书颁发机构
10、重复第9步,只不过,证书存储的位置为:Web宿主。这样IIS能够绑定了
11、在host文件中配置IP与域名的解析
12、在IIS中创建https的网站。输入主机名、选择证书
13、通过浏览器访问
成功浏览!
2.3 存在的问题
网站的证书很重要,但有一个问题,客户端如何知道服务端发过来的公钥(带锁的铁盒子)是真的呢?万一一个黑客黑了某个网站,然后把证书换成自己的,但客户端不知道啊,客户端还认为https网站是安全的。所以一般情况,证书是通过专业机构进行购买的。
这篇不错,就是背景是黑色,字体颜色、排版也不合适,不过内容还可以,可以细读。 证书、公钥、私钥的详细说明
3、其他知识
3.1 域名(一级域名、二级域名、二级目录)
在配置文件中有个
DNS.1 = myhttpssitedemo.com
DNS.2 = www.myhttpssitedemo.com
DNS.3 = mail.myhttpssitedemo.com
DNS.4 = ftp.myhttpssitedemo.com
这涉及到一个知识点。一级域名、二级域名、二级目录等名词
myhttpssitedemo.com 是一级域名
mail.myhttpssitedemo.com 是二级域名
myhttpssitedemo.com\xxx 这个是二级目录
3.2 7层网络结构
https涉及到TCP、IP,而这又涉及到7层网络架构。这个就不详细说了,贴个图
网上很多7层架构说明,只是举例说明:这篇不错
3.2 8 网站的路径
网站中的路径返回
var websitpath= HttpRuntime.AppDomainAppPath.ToString();
var server_path= Server.MapPath("");
var requset_path= Request.ApplicationPath;
其返回将会是:
websitpath: D:\TsinghuaHIS\B0401_DrugInfo\Source\Tsinghua.His.Presentation.DrugInfo.Web\
server_path:D:\TsinghuaHIS\B0401_DrugInfo\Source\Tsinghua.His.Presentation.DrugInfo.Web\DrugDetails\GoodsInfo
requset_path:/DrugInfo