TLS
传输层安全性协议(英语:Transport Layer Security,缩写作TLS),及其前身安全套接层(Secure Sockets Layer,缩写作SSL)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。
SSL包含记录层(Record Layer)和传输层,记录层协议确定传输层数据的封装格式。传输层安全协议使用X.509认证,之后利用非对称加密演算来对通信方做身份认证,之后交换对称密钥作为会谈密钥(Session key)。这个会谈密钥是用来将通信两方交换的数据做加密,保证两个应用间通信的保密性和可靠性,使客户与服务器应用之间的通信不被攻击者窃听。
TLS协议采用主从式架构模型,用于在两个应用程序间透过网络创建起安全的连接,防止在交换数据时受到窃听及篡改。
TLS协议的优势是与高层的应用层协议(如HTTP、FTP、Telnet等)无耦合。应用层协议能透明地运行在TLS协议之上,由TLS协议进行创建加密通道需要的协商和认证。应用层协议传送的数据在通过TLS协议时都会被加密,从而保证通信的私密性。
客户端和服务通过使用一个握手过程协商出一个有状态的连接以传输数据,通过握手,客户端和服务器协商各种参数用于创建安全连接:
- 当客户端连接到支持TLS协议的服务器要求创建安全连接并列出了受支持的密码组合(加密密码算法和散列算法),握手开始;
- 服务器从该列表中决定加密算法和散列算法,并通知客户端;
- 服务器发回其数字证书,此证书通常包含服务器的名称、受信任的证书颁发机构(CA)和服务器的公钥;
- 客户端验证其收到的服务器证书的有效性;
- 为了生成会话密钥用于安全连接,客户端使用服务器的公钥加密随机生成的密钥,并将其发送到服务器,只有服务器才能使用自己的私钥解密;
- 利用随机数,双方生成用于加密和解密的对称密钥。
以上就是TLS协议的握手,握手完毕后的连接是安全的,直到连接(被)关闭。如果上述任何一个步骤失败,TLS握手过程就会失败,并且断开所有的连接。
CA 和证书
术语介绍
网络安全与数字证书领域的专业术语
简称 | 英文全称 | 中文全称 |
---|---|---|
CA | Certificate Authority / Certification Authority | 证书颁发机构 |
PCA | Private Certificate Authority | 私有证书颁发机构,又名私有 CA |
SSL | Secure Sockets Layer | 安全套接字层协议 |
TLS | Transport Layer Security | 传输层安全性协议 |
HTTP | Hypertext Transfer Protocol | 超文本传输协议 |
HTTPS | Hypertext Transfer Protocol Secure | 超文本传输安全协议 |
EV SSL | Extended Validation SSL Certificates | EV 证书,又名扩展验证证书 |
OV SSL | Organization Validated SSL Certificates | OV 证书,又名组织验证证书 |
DV SSL | Domain Validated SSL Certificates DV | 证书,又名域验证证书 |
Wildcard SSL | Wildcard SSL Certificate | 通配符证书 |
MDC | Multi-Domain Certificates | 多域 SSL 证书 |
UCC | Unified Communications Certificate | 统一通信证书 |
TLD | Top-level domain | 顶级域 |
PKI | Public key infrastructure | 公钥基础设施 |
OCSP | Online Certificate Status Protocol | 在线证书状态协议 |
CSP | Cryptographic Service Provider | 加密服务提供商 |
- | Public key | 公钥 |
- | Private key | 私钥 |
X.509 | - | 密码学里的公钥证书格式标准 |
CSR | Certificate signing request | 证书签名请求 |
证书
证书能够对传输的数据进行签名和认证,签名有双重作用:
- 作用一:保证数据的完整性,证明数据并非伪造,而且在传输的过程中没有被篡改;
- 作用二:防止数据的发布者否认其发布了该数据。
签名同时使用了非对称性加密算法和消息摘要算法,对一块数据签名时,会先对这块数据进行消息摘要运算生成一个摘要,然后对该摘要使用发布者的私钥进行加密。
例如场景:
比如开放平台中最常见open api的签名就是将参数进行字典序排序,将参数名和参数值拼接成字符串,拼接后的字符串就相当于摘要,然后将摘要用平台密钥加密或者签名。接收者接受到数据后,先使用发布者的公钥进行验证,或者解密得到原数据的摘要,同时对接收到的数据使用相同的方法计算摘要,如果两个摘要相同,则说明数据没有被篡改。
数据提供者的私钥是不公开的,接收者通过提供者的公钥能成功对数据进行解密,则说明该数据一定来源于该提供者。
那么如果确定公钥是否属于数据提供者呢?这就需要证书了。证书由认证机构颁发,其内容包含证书所有者的标识和它的公钥,并由认证机构使用它的私钥进行签名。信息的提供者在网络上发布证书来公开它的公钥,该证书由权威认证机构进行签名,认证机构也是通过发布它的证书来公开该机构的公钥,认证机构的证书由更权威的认证机构进行签名,这样就形成了证书链。证书链最顶端的证书称为根证书,根证书只能自签名。
SSL 证书链
证书包含的内容可以概述为三部分,用户的信息、用户的公钥、还有CA中心对该证书里面的信息的签名。在验证证书的有效性的时候,会逐级去寻找签发者的证书,直至根证书为结束,然后通过公钥一级一级验证数字签名的正确性。这里一系列的证书,便是证书链。
从组织结构来看,证书链是从终端用户证书到其后跟着的一系列 CA 证书,而通常最后一个(即根证书)是自签名证书,并且有如下关系:
- 在证书链上除最后一个证书外,证书颁发者等于其后一个证书的主题。
- 除了最后一个证书,每个证书都是由其后的一个证书签名的。
- 最后的证书一般由操作系统直接内置,可以直接信任。
证书链可以用于检查目标证书(证书链里的第一个证书)里的公钥及其它数据是否属于其主题。
检查是这么做的:用证书链中的后一个证书的公钥来验证它的签名,一直检查到证书链的尾端,如果所有验证都成功通过,那个这个证书就是可信的。
在此过程中,涉及到的证书包含如下几类:
-
叶子证书
即最终的实体证书。 -
中间证书
全称为中间证书颁发机构,是证书颁发机构(CA)为了自我隔离而颁发的证书。
其作用是通过中间证书的私钥来签署最终用户 SSL 证书,通过中间根对另一个中间根进行签名,然后 CA 使用它来对证书进行签名。 -
根证书
证书颁发机构的自签名根证书。它的颁发者和主题是相同的,可以用自身的公钥进行合法认证。证书认证过程也将在此终止。
交叉证书
交叉证书的应用场景是这样的:假如现在小白成为一个新的根CA机构,那小白签发的证书想要浏览器信任的话,小白的根证书就需要内置在各大操作系统和浏览器中,这需要较长时间的部署,那在没有完全部署完成之前,小白签发的证书怎么才能让浏览器信任呢,这就需要用到交叉证书了。
简单来说,交叉证书会利用已有根 CA 的来为新 CA 签发一个交叉证书,在这个交叉证书里主题是新 CA 根证书信息,但是签发者是已有的根 CA。
这部分的内容可以参照 Let’s Encrypt 的证书链示意图,或者参考文章: Cross-Signing and Alternate Trust Paths; How They Work
证书相关格式和文件扩展名
证书主要的文件类型和协议有: PEM、DER、PFX、JKS、KDB、CER、KEY、CSR、CRT、CRL 、OCSP、SCEP等。
证书文件格式[Certificate]:
格式 | 扩展名 | 描述 | 特点 |
---|---|---|---|
DER | .cer/.crt/.rsa | 【ASN .1 DER】用于存放证书。 辨别编码规则 (Distinguished Encoding Rules) 可包含所有私钥、公钥和证书。它是大多数浏览器的缺省格式,并按 ASN1 DER 格式存储。它是无报头的 - PEM 是用文本报头包围的 DER。 打开看是二进制格式,不可读。 查看DER格式证书的信息:openssl x509 -in certificate.der -inform der -text -noout | 不含私钥、二进制 Java和Windows服务器偏向于使用这种编码格式. |
PEM | .pem | 【Printable Encoded Message】 该编码格式在RFC1421中定义,其实PEM是【Privacy-Enhanced Mail】的简写,但也同样广泛运用于密钥管理 ASCII文件,一般基于base 64编码 查看PEM格式证书的信息:openssl x509 -in certificate.pem -text -noout | 可以直接用文本编辑器打开查看 Apache和NGINX服务器偏向于使用这种编码格式 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 报头包围,因此适合系统之间的文本模式传输。 |
PKCS7 | .p7b/.p7r | 【PKCS #7】加密信息语法标准 | 1、p7b以树状展示证书链,不含私钥 2、p7r为CA对证书请求签名的回复,只能用于导入 |
PKCS10 | .p10/.csr | 【PKCS #10】公钥加密标准【Certificate Signing Request】 | 1、证书签名请求文件 2、ASCII文件 3、CA签名后以p7r文件回复 |
CMS | .p7c/.p7m/.p7s | 【Cryptographic Message Syntax】 | 1、p7c只保存证书 2、p7m:signature with enveloped data 3、p7s:时间戳签名文件 |
SPC | .pvk/.spc | 【Software Publishing Certificate】 | 微软公司特有的双证书文件格式,经常用于代码签名,其中 1、pvk用于保存私钥 2、spc用于保存公钥 |
相关的文件扩展名
扩展名 | 名称 | 描述 | 示例 |
---|---|---|---|
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,即证书签名请求 | 它并不是证书,而是向权威证书颁发机构获得签名证书的申请,其核心内容是一个公钥(当然还附带了一些别的信息),在生成这个申请的时候,同时也会生成一个私钥,私钥要自己保管好 | 查看的办法:openssl req -noout -text -in my.csr 如果是DER格式的话照旧加上-inform der: openssl req -noout -inform der -text -in my.csr |
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 |
证书编码的转换
- 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…)
-
从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
-
将crt和key合并出pfx:
操作命令:- openssl pkcs12 -export -in certificate.crt -inkey privateKey.key -out certificate.pfx
密钥库文件格式[Keystore] :
格式 | 扩展名 | 描述 | 特点 |
---|---|---|---|
JKS | .jks/.ks | 【Java Keystore】密钥库的Java实现版本,provider为SUN | 密钥库和私钥用不同的密码进行保护 |
JCEKS | .jce | 【JCE Keystore】密钥库的JCE实现版本,provider为SUN JCE | 相对于JKS安全级别更高,保护Keystore私钥时采用TripleDES |
PKCS12 | .p12/.pfx | 【PKCS #12】个人信息交换语法标准 | 1、包含私钥、公钥及其证书 2、密钥库和私钥用相同密码进行保护 |
BKS | .bks | 【Bouncycastle Keystore】密钥库的BC实现版本,provider为BC | 基于JCE实现 |
UBER | .ubr | 【Bouncycastle UBER Keystore】 | 密钥库的BC更安全实现版本,provider为BC |
证书内容
证书文件可以使用记事本直接打开,内容如下:
-----BEGIN CERTIFICATE-----
MIIDdDCCAlygAwIBAgIBAjANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBoxOTIu
MTY4LjMuMzUtY2FAMTcwOTEzMTkyNjAeFw0yNDAyMjgxMzUyMDZaFw0yNTAyMjcx
MzUyMDZaMCIxIDAeBgNVBAMMFzE5Mi4xNjguMy4zNUAxNzA5MTMxOTI2MIIBIjAN
BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvykrt9bSqJpu5eWnuZbiocOagUqR
t6K7zn6OMoj1Tk8N1wscbPnKarWL4WyuVBoL16ux+cPeNZxuMhyw091EbgXEJiQe
oGlIeGpIyZpEvlWIpAQUWnUb0dKtrd1g2rF84CAnjw3RJW221QanB5RhD4twp2/Q
2AKlw8bDTN++Xxs6i9/cSYgRRZh//r8UGcj4q9dHovkNntTWD7QjUeOZThLr7Gn6
AojnX5h3afxnnNMuHWHmlM0G+ARWbYwTZaSAwkkpzpgrm9T7f5NKvX9LNtHQKmVj
6MafYSPqxNa/Z8iX4XsDhP8LPPdVPHW1zWAUlF54qygdQqvnNp45hDeQ2QIDAQAB
o4GxMIGuMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNV
HRMBAf8EAjAAMB8GA1UdIwQYMBaAFCluT2OyAu9sjfyV4H5qRmlLzHFPMFgGA1Ud
EQRRME+CFmt1YmVybmV0ZXMuZGVmYXVsdC5zdmOCEmt1YmVybmV0ZXMuZGVmYXVs
dIIKa3ViZXJuZXRlc4IJbG9jYWxob3N0hwTAqAMjhwQK/gABMA0GCSqGSIb3DQEB
CwUAA4IBAQCMjz/IWqlKkrZVzGpHzDl8KNcbTaCwcJUIeb8WPxDFjJ42Eb0eBogM
VLG5xiHRssavqJFgaWipPVdRgLyjqq7xxEzhfIz/mqhah0eYOrNYqBoHn4e6IgBG
G2Dev4qtlCtZnkX7NMI1lAGZFXKx/HZRJwnCkG1QiZFBH24Ks283PGRXSwvJL2gw
a0uvDAtrT97MwZTwYlwJ6Yxg7v0ir4EY9s8Uz4di5ylJgoTlR336Myt3BT3bUM4l
UHz8s5c9EyV2ugQCdP6P94SZH9gDN3jEw+Fo7fu0XWzZ8ET749xmlEmOZd1ZITta
R1j5w237fI3ZdQDm5b0wC2+741VKPL1v
-----END CERTIFICATE-----
证书申请流程
受信任的数字证书需要向受信任的证书颁发机构(CA)申请,流程如下:
但是受信任的证书颁发机构(CA)颁分的受信任数字证书通常是商业行为,需要商业付费(当然目前也是有免费的)。
如果不想用商业数字证书,也可以自建PCA,或者使用openssl创建CA证书。
参考
网络安全科普:奇妙的 SSL/TLS 证书(基础篇)
局域网内搭建浏览器可信任的SSL证书
Java 证书已经证书管理(keytool实例),jks\crt\cet\ketstore
der pem cer crt key pfx等概念及区别
手动实现CA数字认证(java)
java编程方式生成CA证书