https实战之数字证书

https数字证书

如何申请Let's Encrypt上的免费证书

https单向认证和双向认证

SpringBoot+CXF整合开发基于https的webservice服务

一、https的几个基本概念

1、什么是https

大家都知道http时明文传输的,传输过程中内容很容易被篡改。一个活生生的例子是,你在手机浏览器上访问一个网站,有时网页的顶部或底部会出现移动联通等运营商的广告,这种广告就是电信运营商篡改了网站发给的网页导致的。而https是在http与TCP/IP之间加入了一个安全传输协议SSL/TLS,传输的内容是加密过的。

2、SSL与TLS

SSL(Secure Sockets Layer安全套接层)与TLS(Transport Layer Security安全传输层),两个都是安全传输协议,TLS可以理解为SSL的升级版。

3、对称加密与非对称加密

对称加密:加密解密使用相同的密码。常见的有:AES、DES、3DES、RC5。

非对称加密:加密解密使用两个不同的密码,叫做公钥密码和私钥密码,简称公钥和私钥。公钥,顾名思义,公开的密钥,可以将它交给一个或多个用户;而私钥则要自己保存,不公开给任何用户。实际应用时,公钥加密私钥解密,私钥签名公钥验签。

4、数字签名与签名验签

一种保护文件或消息在发送传输过程不被篡改的方式。

处理过程:用户A发消息给B,发送前,A通过使用非对称加密算法的私钥对原消息进行加密得到签名消息,发送时A将原消息和签名消息一起发给B;用户B收到后,会进行验签。具体做法是,使用公钥对签名消息进行解密,将解密结果与原消息比对,确认是否一致。若不一致说明消息被他人篡改。简单而言就是使用私钥加密,公钥解密,但有一点,用户B收到的消息是没有加密的,B可以不进行验证。

5、哈希算法

简单理解就是将一个比较长的数据映射成一个短的固定长度的字符串,并且做到无法逆向得到原数据。得到的这个短的字符串可以认为是原数据的指纹,原数据变化了,指纹也会变。前面说了,在https中,是用非对称密码对消息进行加解密的,但它有个限制不能加密太长的消息,这个时候就要借助哈希算法把安全地消息缩短。常见的哈希算法有:MD5、SHA-1、SHA-2

二、数字证书与证书认证

非对称密码中有一对匹配的公钥和私钥,而我们平常说的证书就是指包含了公钥信息的文件,里面是不包含私钥的。

证书可以认为是一个网站或服务器的身份名片,这个名片大家都可以用工具制作,它有两个作用,一个是用来保证网站与用户之间的通信是安全的,另一个就是对外声明自己的网站是安全的。那问题来了,不能你说你的网站是安全的就真的安全,谁知道是真是假,这时,你就需要找一个大家都相信的权威的机构或组织,在你的证书上签名,由机构为你背书。机构会审核你的认证资料,如果没问题,就会在你的证书上签名。这个证明过程叫证书的认证。证书认证过程有几个概念:

1、自签名证书:用户自己通过工具生成的证书,比如openssl、keytool都可以生成一个证书。生成证书文件的同时,会生成一个对应的私钥文件。

2、CA与CA证书:CA(Certificate Authority)指的就是大家都相信的权威证书认证机构。它手上的证书就叫CA证书,也叫CA根证书。CA在认证通过你的证书后,会生成一个新的证书文件,里面包含了你的证书、CA私钥生成的签名、CA的证书。附上CA的证书目的是为了大家验证你的证书是不是真实的。CA的证书是公开的,不附上大家也可以查询到。

3、二级证书:CA认证时,使用私钥生成签名的,但是经常用私钥签名就可能存在被盗的风险,大家想象一下,如果黑客拿到了CA的私钥,就能冒用CA的身份会签出不安全的证书或发起不安全的请求,出现被盗会导致整个CA签发的证书全部不可信,这个CA的信用体系崩溃。所以,CA会将私钥严密保存起来,同时它会用私钥签署授权几个二级机构,由二级机构去完成用户认证的动作。这样签出来的证书上会有CA机构的根证书、二级机构的证书、及用户自己的证书,形成一个证书链。比如,我们在浏览器上进入百度首页,在地址上会看到绿色的锁,点击这个锁,可以看到它的证书链:

4、CSR(Certificate Signing Request)证书请求文件:用户在向机构提交证书认证申请时,不是直接把证书提交过去,而且要提交生成一个由证书和其他信息组成的CSR文件。

三、各种证书格式

证书相关的文件格式有很多,你可能见过的有CER、CRT、PEM、JKS、KDB、CSR...要搞清楚这些格式的关系,先需要知道两个重要的标准X.509和PCKS。

X.509是一个最基本的公钥格式标准,里面规定了证书需要包含的各种信息。通常我们提到的证书,都是这个格式的,里面包含了公钥、发布者的数字签名、有效期等内容。要强调的是,它只里面是不包含私钥的。相关的格式有:DER、PEM、CER、CRT。

PCKS是一组公钥标准,它是从公钥密码学不同方面规定的15个标准,分别是PKCS#1、PKCS#2...PKCS#15(好随便的名字)。但注意虽然字面上它是公钥的标准,它也包含了私钥的内容。其中有两个会经常看到,分别是PKCS#7和PKCS#12。

PKCS#7规定了消息加密的机制。它将证书分成两个文件,公钥和私钥。有PEM和DER两种编码方式,其中比较常见的是PEM,它是ASCII(Base64)编码的纯文本格式。DER是二级制格式的。PKCS#7的常见后缀有PEM、DER、CRT、CER、P7B、SPC/PVK。PEM、DER后缀就表示文件的编码格式。CRT、CER这两种文件是不包含私钥的,编码格式可以是文本格式的PEM或二进制的DER,相同编码的情况下相互转换直接改后缀即可,windows支持这两种证书格式文件,可以直接双击打开查看证书信息。P7B文件里面保护了一个树状结构的证书链,包含了一个或多个证书,不含私钥。SPC/PVK是微软特有的证书格式,其中SPC保存公钥,PVC保存私钥。

PKCS#12规定了如何保证证书文件的分发,它规定了一个密钥库,里面打包了私钥和公钥,同时有密码保护,这样可以防止在发给其他人时里面的密钥或证书被窃取或篡改。文件后缀一般是:P12、PFX(这两个后缀没有区别)。与这个类似的有JKS、JCEKS、BKS、BUER,他们的区别是:

1、JKS(Java KeyStore)是Java专用的密钥库,实现者是SUN,用keytool制作。后缀:jks、keystore

2、JCEKS(JCE keystore)也是和Java专用的密钥库,比JKS更安全,实现者是SUN JCE,后缀:jks、keystore

3、BKS(Bouncycastle Keystore)Java和C#都可以操作的密钥库,实现者Bouncycastle,它能有效防止密钥库被修改。后缀:bks

4、BUER(Bouncycastle UBER Keystore)BKS的更安全版,实现者也是Bouncycastle,后缀:ubr

5、PKCS#12是一个密钥库标准。它与上面几个不是实现关系。实现工具是openssl,注意,keytool可以创建PCCS#12的文件,但是不能修改里面的密钥或证书文件。

X.509、PKCS#7、PKCS#12三者的关系,简单理解就是,X.509规定了公钥的格式即什么是公钥,PCKS#7规定了保存X.509格式的公钥的文件格式,同时还规定了私钥的文件格式。PCKS#12则类似一个加了密码的压缩包,将多个PCK#7规定格式的文件打包起来。加密码打包的目的主要为了能保证地发给其他用户,防止被窃取里面的私钥和证书文件。

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180602G0U8LH00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券