https是用了ssl校验请求合法性的http服务。也就是说一个https的服务必然会配置一个证书,首先介绍一下https的工作过程,再详细讲述SSL或者说是TSL的工作原理
1、客户端发起https请求
2、服务端收到请求后,将自己服务端配置的证书(下面详解证书颁发过程,例如*.crt文件)发送给客户端(一般为浏览器),这个数字证书不但包含了用于非对称加密的公钥,还包含公钥算法、证书的颁发机构及过期时间等信息
3、客户端接收到数字证书后,解析验证服务器的合法性,主要包括:证书是否过期,发行服务器证书的CA 是否可靠,发行证书的公钥(放在浏览器根证书文件中,基本所有浏览器会内置好)能否正确解开服务器证书的“发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配。如果校验没有问题,客户端将随机产生一个用于后面通讯的“对称密码”,然后用服务器的公钥(服务器的公钥从步骤三中的服务器的证书中获得)对其加密,然后将加密后的“预主密码”传给服务器。当然如果验证没通过,则会弹出提示告知用户。
4、服务端用自己的私钥(*.key文件)将该随机值进行解密,然后将需要返回给客户端的内容使用该随机值(密钥)进行对称加密。将加密后的内容返回给客户端。客户端使用之前生成的随机值(对称加密私钥)对内容进行解密从而获得真实内容
SSL (Secure Sockets Layer)安全套接层。是由Netscape公司于1990年开发,用于保障Word Wide Web(WWW)通讯的安全。主要任务是提供私密性,信息完整性和身份认证。1994年改版为SSLv2,1995年改版为SSLv3.
TLS(Transport Layer Security)安全传输层协议,)用于在两个通信应用程序之间提供保密性和数据完整性。该标准协议是由IETF于1999年颁布,整体来说TLS非常类似SSLv3,只是对SSLv3做了些增加和修改。
1、X.509
这是一种证书标准,主要定义了证书中应该包含哪些内容。其详情可以参考 RFC5280,SSL 使用的就是这种证书标准。
*2、证书签名请求(Certificate signing request) - .csr
csr其核心内容是一个公钥(当然还附带了一些别的信息),并用私钥对其进行了签名
**3、证书(Certificate) - .cer .crt
证书其实就是一个公钥,当然还包含公钥算法、证书的颁发机构及过期时间等额外信息。
*4、私钥(Private Key) - .key
用于解密上述https工作中客户端发送过来用证书中的公钥加密了的数据
5、CA机构
ca结构的作用:如上述https工作过程,当客户端第一次向https发起请求,https服务给客户端发送他的证书给客户端,客户端提取证书中的公钥,那么客户端为什么相信这个给证书是可靠的呢,这就需要第三方机构发挥作用了。因为服务端发送来的证书是经过CA机构用自己的私钥签名了的,CA机构有限,一般浏览器都会内置好所有CA机构的根证书,因此浏览器就能提取根证书中的公钥对服务端发送来的证书验证签名来确定该证书的合法性。
1、生成私钥.key文件
2、用私钥生成证书签名请求文件csr,csr其核心内容是一个公钥(当然还附带了一些别的信息),并用私钥对其进行了签名
3、将证书签名请求发给CA机构进行签名并生成最终证书crt
在提供http服务的主机上配置crt和key文件就可以对外提供https服务了。工作过程如上所述https工作过程
在颁发的证书中有各种各样的命名,例如.pem、.crt、.der、.pfx、.cer。这些都是指证书,只是编码方式不同而已
带有私钥的证书(P12)
由 Public Key Cryptography Standards #12,PKCS#12 标准定义,包含了公钥和私钥的二进制格式的证书形式,以 pfx 作为证书文件后缀名。
二进制编码的证书(DER)
证书中没有私钥,DER 编码二进制格式的证书文件,以 .cer 作为证书文件后缀名。
查看 DER 格式证书的信息:
$ openssl x509 -in certificate.der -inform der -text -noout
Base64 编码的证书(PEM)
证书中没有私钥,Base64 编码格式的证书文件,也是以 .cer 作为证书文件后缀名,PEM(Privacy Enhanced Mail),OpenSSL 使用 PEM 格式来存放各种信息,它是 OpenSSL 默认采用的信息存放方式,是 CA(Certificate Authorities)颁发证书最常用的格式。包含 -----BEGIN CERTIFICATE----- 和 -----END CERTIFICATE----- 声明。多个 PEM 证书甚至于 Private Key 可以被包含到一个文件中,一个挨一个往下排布。但是大多数平台(如:Apache),希望证书和私钥分别存放到不同的文件中
查看 PEM 格式证书的信息:
openssl x509 -in certificate.pem -text -noout
1、生成私钥
openssl genrsa -des3 -out domain.key 1024
2、 去掉密码
openssl rsa -in domain.key -out domain_nopass.key
3、用上面的私钥生成证书签名请求csr文件
openssl req -new -key domain.key -out domain.csr
这里会提示输入国家,地区组织,email等信息.最重要的一个是"common name",需要与网站域名相同.
Enter pass phrase for domain.key: # 之前设置的密码
-----
Country Name (2 letter code) [XX]:CN # 国家
State or Province Name (full name) []:Jilin # 地区或省份
Locality Name (eg, city) [Default City]:Changchun # 地区局部名
Organization Name (eg, company) [Default Company Ltd]:Python # 机构名称
Organizational Unit Name (eg, section) []:Python # 组织单位名称
Common Name (eg, your name or your server's hostname) []:domain.com # 网站域名
Email Address []:[email protected] # 邮箱
A challenge password []: # 私钥保护密码,可直接回车
An optional company name []: # 一个可选公司名称,可直接回车
4、再使用上面的密钥和CSR对证书签名
openssl x509 -req -days 365 -in domain.csr -signkey domain.key -out domain.crt