SSL/TLS协议理解

SSL/TLS协议

1994年,Netscape为Netscape Navigator浏览器研发了SSL。其作用主要是为了防止中间人攻击。后来,随着互联网可访问性的增加,银行开始利用互联网进行交易。当时安全性是一个很重要的问题,IETF (互联网工程任务组),也就是一群标准化互联网协议的人,他们研发属于自己的协议版本来标准化SSL,这是在1999年,现在该协议被称为TLS(传输层安全性)。

网络通信的主要性能指标:效率,安全性

效率高意味着单位时间内能传输的有效数据量大;

安全性好意味着数据不易泄露。

假设有

客户端a,服务器b

1.最开始是:“裸奔”:

a向b发送data;

b向a发送response;

效率:最高

安全性:最低

2.使用对称加密:

a向b发送密钥M;

a向b发送经过M加密的data;

b使用M解密,并向a发送经过M加密的response;

a使用M解密

问题在于:

如果密钥M被截获,等于整个通信过程没有加密

效率:较高

安全性:较低

3.使用非对称加密:

a向b发送其公钥A;

b向a发送其公钥X;

a向b发送经过X加密的data;

b使用其私钥Y解密data,并向a发送经过A加密的response;

a使用其私钥B解密response

问题在于:

1.非对称加密的加解密速度比对称加密慢了几百上千倍;

2.假如b被劫持,b向a发送的公钥X可能是黑客自己产生的一对公钥私钥,后续的a所发送的数据,就会完全被黑客获取。

效率:较低

安全性:较高

4.使用非对称加密与对称加密结合,并加入证书认证

a中提前内置了受信任的证书发布机构表CAL(一般是操作系统中会内置)

a向b请求其证书;

b向a发送其证书;

a对b发来的证书进行验证:从CAL中查找该证书的发布机构,用于校验证书是否为合法机构颁发;如果找到,那么从CAL中取出该证书发布机构的公钥,然后对证书里面的签名进行解密计算证书的hash值,将这个计算的hash值与证书中签名做对比,对比结果一致,则证明该证书没有被修改过;验证证书的有效期等信息

a从证书中获取b的公钥X,并将对称加密的密钥M通过X加密,发送给b;

b将经过M加密的ack发送给a;

a将经过M加密的data发送给b;

b使用M解密,并将经过M加密的response发送给a;

a使用M解密。

效率:较高

安全性:最高

至此,也就基本解决了通信的过程中可能会遇到的风险,而这种方式也就是目前TLS/SSL的主要加密过程。

证书主要的文件类型和协议有: PEM、DER、PFX、JKS、KDB、CER、KEY、CSR、CRT、CRL 、OCSP、SCEP等。

      一、编码格式

X.509 - 这是一种证书标准,主要定义了证书中应该包含哪些内容.其详情可以参考RFC5280,SSL使用的就是这种证书标准.

目前有以下两种编码格式.

1、PEM - Privacy Enhanced Mail,打开看文本格式,以"-----BEGIN..."开头, "-----END..."结尾,内容是BASE64编码. 查看PEM格式证书的信息:openssl x509 -in certificate.pem -text -noout Apache和NGINX服务器偏向于使用这种编码格式.

     PEM – Openssl使用 PEM(Privacy Enhanced Mail)格式来存放各种信息,它是 openssl 默认采用的信息存放方式。Openssl 中的 PEM 文件一般包含如下信息:

  1. 内容类型:表明本文件存放的是什么信息内容,它的形式为“——-BEGIN XXXX ——”,与结尾的“——END XXXX——”对应。
  2. 头信息:表明数据是如果被处理后存放,openssl 中用的最多的是加密信息,比如加密算法以及初始化向量 iv。
  3. 信息体:为 BASE64 编码的数据。可以包括所有私钥(RSA 和 DSA)、公钥(RSA 和 DSA)和 (x509) 证书。它存储用 Base64 编码的 DER 格式数据,用 ascii 报头包围,因此适合系统之间的文本模式传输。

使用PEM格式存储的证书: —–BEGIN CERTIFICATE—– MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx ……… 1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU= —–END CERTIFICATE—– 使用PEM格式存储的私钥: —–BEGIN RSA PRIVATE KEY—– MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx ……… 1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU= —–END RSA PRIVATE KEY—– 使用PEM格式存储的证书请求文件: —–BEGIN CERTIFICATE REQUEST—– MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx ……… 1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU= —–END CERTIFICATE REQUEST—–

2、DER – 辨别编码规则 (DER) 可包含所有私钥、公钥和证书。它是大多数浏览器的缺省格式,并按 ASN1 DER 格式存储。它是无报头的 - PEM 是用文本报头包围的 DER。

     DER - Distinguished Encoding Rules,打开看是二进制格式,不可读. 查看DER格式证书的信息:openssl x509 -in certificate.der -inform der -text -noout Java和Windows服务器偏向于使用这种编码格式.

证书编码的转换

PEM转为DER openssl x509 -in cert.crt -outform der -out cert.der

DER转为PEM openssl x509 -in cert.crt -inform der -outform pem -out cert.pem

(提示:要转换KEY文件也类似,只不过把x509换成rsa,要转CSR的话,把x509换成req...)

       二、相关的文件扩展名

这是比较误导人的地方,虽然我们已经知道有PEM和DER这两种编码格式,但文件扩展名并不一定就叫"PEM"或者"DER",常见的扩展名除了PEM和DER还有以下这些,它们除了编码格式可能不同之外,内容也有差别,但大多数都能相互转换编码格式.

CRT - CRT应该是certificate的三个字母,其实还是证书的意思,常见于*NIX系统,有可能是PEM编码,也有可能是DER编码,大多数应该是PEM编码,相信你已经知道怎么辨别.

CER - 还是certificate,还是证书,常见于Windows系统,同样的,可能是PEM编码,也可能是DER编码,大多数应该是DER编码.证书中没有私钥,DER 编码二进制格式的证书文件

KEY - 通常用来存放一个公钥或者私钥,并非X.509证书,编码同样的,可能是PEM,也可能是DER. 查看KEY的办法:openssl rsa -in mykey.key -text -noout 如果是DER格式的话,同理应该这样了:openssl rsa -in mykey.key -text -noout -inform der

CSR - Certificate Signing Request,即证书签名请求,这个并不是证书,而是向权威证书颁发机构获得签名证书的申请,其核心内容是一个公钥(当然还附带了一些别的信息),在生成这个申请的时候,同时也会生成一个私钥,私钥要自己保管好.做过iOS APP的朋友都应该知道是怎么向苹果申请开发者证书的吧. 查看的办法:openssl req -noout -text -in my.csr (如果是DER格式的话照旧加上-inform der,这里不写了)

PFX/P12 - predecessor of PKCS#12,包含公钥和私钥的二进制格式证书

       对nginx服务器来说,一般CRT和KEY是分开存放在不同文件中的,但Windows的IIS则将它们存在一个PFX文件中,(因此这个文件包含了证书及私钥)这样会不会不安全?应该不会,PFX通常会有一个"提取密码",你想把里面的东西读取出来的话,它就要求你提供提取密码,PFX使用的时DER编码,如何把PFX转换为PEM编码? openssl pkcs12 -in for-iis.pfx -out for-iis.pem -nodes 这个时候会提示你输入提取代码. for-iis.pem就是可读的文本. 生成pfx的命令类似这样:openssl pkcs12 -export -in certificate.crt -inkey privateKey.key -out certificate.pfx

其中CACert.crt是CA(权威证书颁发机构)的根证书,有的话也通过-certfile参数一起带进去.这么看来,PFX其实是个证书密钥库.

p7b - 以树状展示证书链(certificate chain),同时也支持单个证书,不含私钥。

JKS - 即Java Key Storage,这是Java的专利,跟OpenSSL关系不大,利用Java的一个叫"keytool"的工具,可以将PFX转为JKS,当然了,keytool也能直接生成JKS,不过在此就不多表了.

备注实例:

1、从pfx导出crt和key:

操作命令: openssl pkcs12 -in example.cn.ssl.pfx -nocerts -nodes -out example.key openssl pkcs12 -in example.cn.ssl.pfx -clcerts -nokeys -out example.crt

2、将crt和key合并出pfx:

操作命令:

openssl pkcs12 -export -in certificate.crt -inkey privateKey.key -out certificate.pfx

证书格式(是一种标准):

x509 这种证书只有公钥,不包含私钥。

pcks#7 这种主要是用于签名或者加密。

pcks#12 这种含有私钥,同时也含有公钥,但是有口令保护。

编码方式:

.pem 后缀的证书都是base64编码

.der 后缀的证书都是二进制格式

证书:

.csr 后缀的文件是用于向ca申请签名的请求文件

.crt .cer 后缀的文件都是证书文件(编码方式不一定,有可能是.pem,也有可能是.der)

私钥:

.key 后缀的文件是私钥文件

包含证书和私钥:

.keystore .jks .truststore 后缀的文件,是java搞的,java可以用这个格式。这个文件中包含证书和私钥,但是获取私钥需要密码才可以,

这是一个证书库,里面可以保存多个证书和密钥,通过别名可以获取到。

.pfx 主要用于windows平台,浏览器可以使用,也是包含证书和私钥,获取私钥需要密码才可以

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值