1.什么是SSL证书?
首先来了解下,现在HTTP协议中为什么增加了SSL证书,HTTP协议以明问发送请求
在传递数据的过程中可能被黑客进行监听和盗取,是极度不安全的,所以产生了HTTPS协议,HTTPS协议可以看成是HTTP+SSL的结合体
网站实现加密传输
用户通过http协议访问网站时,浏览器和服务器之间是明文传输,这就意味着用户填写的密码、帐号、交易记录等机密信息都是明文,随时可能被泄露、窃取、篡改,被黑客加以利用。网站安装SSL证书后,使用https加密协议访问网站,可激活客户端浏览器到网站服务器之间的"SSL加密通道"(SSL协议),实现高强度双向加密传输,防止传输数据被泄露或篡改。
认证服务器真实身份
钓鱼欺诈网站泛滥,用户如何识别网站是钓鱼网站还是安全网站?网站部署全球信任的SSL证书后,浏览器内置安全机制,实时查验证书状态,通过浏览器向用户展示网站认证信息,让用户轻松识别网站真实身份,防止钓鱼网站仿冒。
2.SSL的验证流程
3、 数字证书的基本概念
数字证书的标准
- X.509版本号:指出该证书使用了哪种版本的X.509标准,版本号会影响证书中的一些特定信息
- 序列号:由CA给予每一个证书分配的唯一的数字型编号,当证书被取消时,实际上是将此证书序列号放入由CA签发的CRL(Certificate Revocation List证书作废表,或证书黑名单表)中。这也是序列号唯一的原因
- 签名算法标识符: 用来指定CA签署证书时所使用的签名算法,常见算法如RSA
- 签发者信息: 颁发证书的实体的 X.500 名称信息。它通常为一个 CA
- 证书的有效期: 证书起始日期和时间以及终止日期和时间;指明证书在这两个时间内有效。
- 主题信息: 证书持有人唯一的标识,在 Internet上应该是唯一的
- 发布者的数字签名: 这是使用发布者私钥生成的签名,以确保这个证书在发放之后没有被撰改过。
- 证书的公钥: 包括证书的公钥、算法(指明密钥属于哪种密码系统)的标识符和其他相关的密钥参数
数字证书的常见格式
- CSR: 证书请求文件,这个并不是证书,而是向证书颁发机构获得签名证书的申请文件
- CER: 存放证书文件可以是二进制编码或者BASE64编码
- CRT: 证书可以是DER编码,也可以是PEM编码,在linux系统中比较常见
- pem: 该编码格式在RFC1421中定义,但他也同样广泛运用于密钥管理,实质上是 Base64 编码的二进制内容
- DER: 用于二进制DER编码的证书。这些证书也可以用CER或者CRT作为扩展名
- JKS: java的密钥存储文件,二进制格式,是一种 Java 特定的密钥文件格式, JKS的密钥库和私钥可以用不同的密码进行保护
- p12/PFX: 包含所有私钥、公钥和证书。其以二进制格式存储,也称为 PFX 文件,在windows中可以直接导入到密钥区,密钥库和私钥用相同密码进行保护
数字证书和公钥的关系
数字证书是经过权威机构(CA)认证的公钥,通过查看数字证书,可以知道该证书是由那家权威机构签发的,证书使用人的信息,使用人的公钥。它有以下特点:
1、由专门的机构签发的数字证书才安全有效。
2、签发数字证书是收费的。
3、不会被冒充,安全可信。
4、数字证书有使用期限,过了使用期限,证书变为不可用。CA也可以在试用期内,对证书进行作废操作。
4、生成自签证书步骤
要理解创建证书的每一步操作必须要先理解创建证书的流程和每一步的含义。生成证书的标准流程是这样的:
-
生成自己的私钥文件(.key)
-
基于私钥生成证书请求文件(.csr)
-
将证书请求文件(.csr)提交给证书颁发机构(CA),CA会对提交的证书请求中的所有信息生成一个摘要,然后使用CA根证书对应的私钥进行加密,这就是所谓的“签名”操作,完成签名后就会得到真正的签发证书(.cer或.crt)
-
用户拿到签发后的证书,可能需要导入到自己的密钥库中,如Java的keystore,或根据需要再进行各种格式转换(.pem .p12 .jks等等)
注意:
-
第1/2两步可以通过一个命令合并完成。
-
第3步向公认可信的CA机构申请证书是线上线下都要进行操作的一系列流程,申请的公司或组织还要提交各种资质和证明,与企业申请某种执照或办理某种手续性质类似,但企业最终拿到的就是一个CA签名的证书文件。所以,对于企业内部应用来说,完全可以自己创建自己的根证书,自己给自己签发证书,然后通过域控手段强制用户浏览器接受来自相应CA签发的证书。
-
再次解释一下“签名”的含义,这个概念很关键。在CA签发的证书中,包含申请者的公钥在内,几乎所有的数据都是明文的,也都是申请者自己提供的(当然CA需要审核),签发的证书唯一多出来的信息就是基于申请者提供的所有信息生成了一份摘要,然后用CA自己的私钥对摘要进行了加密,这段加密后的密文被称之为“签名”,这部分数据是返还的签发证书(.cer或.crt)中多出来的关键数据。下图是CA签发证书的原理:
- 汇总所有的情况来看,生成证书不外乎三种情形:
- 标准CA签发流程
- 生成自签名证书
- 生成私有CA签发的证书
对于绝大多数的开发者而言,需要使用的其实是后两种:自签名证书和私有CA签发的证书。网上的说法是:自签名证书无法被吊销,私有CA签发的证书可以被吊销。从它们各自的命令行工具上看,后者确实有一个撤销操作openssl ca -revoke。此外,生成这两种证书的命令也是不一样的。
针对私有CA签发的证书,网上有如下的建议:
如果你的规划需要创建多个证书,那么使用私有CA的方法比较合适,因为只要给所有的客户端都安装了CA的证书,那么以该证书签名过的证书,客户端都是信任的,也就是安装一次就够了
如果你直接用自签名证书,你需要给所有的客户端安装该证书才会被信任,如果你需要第二个证书,则还的挨个给所有的客户端安装证书后才会被信任。
5、标准的CA签发流程
1、创建私钥(.key)
openssl genrsa -out my.key 2048
2、基于私钥创建证书签名请求
openssl req -new -key my.key -out my.csr -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=domain1/CN=domain2"
这一操作有一个关键点:除了在请求中提交了申请人的一些组织信息之外,最重要的就是把上次生成的私钥作为参数传给命令行,这是因为命令行工具能根据私钥算出对应的公钥,公钥是未来证书的核心组成部分。
(可选)直接同时生成私钥和证书签名请求
上述两个操作是可以通过一条命令完成的,即同时生成my.key和my.csr两个文件:
openssl req -new -newkey rsa:2048 -nodes -keyout my.key -out my.csr -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=domain1/CN=domain2"
两个关键参数:
- -newkey rsa:2048 -> 生成一个新的证书签名请求,同时生成一个2048位的RSA私钥
- -nodes -> 不对新私钥加密
3、将证书申请请求(.csr)提交给CA认证机构申请证书
简单将:从CSR到CRT,就是一个签名过程,这个过程需要用签发方的私钥。走标准CA签发流程,是CA机构来操作,用的是他的根证书对应的私钥来签名;走自签名证书或私有CA证书的流程,用的就是自己的私钥。
4、CA机构生成CA证书链
绝大多书情况下,CA机构返还不是一个单一的证书,而一个证书链。关于证书链,我们会单独起一篇文章进行解释。这里先简单介绍一下:通常机构颁发的证书中会包含完整的证书链,可以直接使用。如果没有包含完整的证书链,浏览器通常会自动下载并补全上级证书,安装完成后不再显示安全警告。在颁发的证书中都会有它的上级和下级证书的相关信息,也包括下载地址,所以浏览器是可以自动下载补全的。但很多企业内网往往不允许连接到互联网,无法补全证书链。所以最好的办法是先补全证书链,再部署到网站上。
一张标准的证书,都会包含自己的颁发者名称,以及颁发者机构访问信息: Authority Info Access,其中就会有颁发者CA证书的下载地址。
通过这个URL,我们可以获得这个证书的颁发者证书,即中间证书。Windows、IOS、MAC都支持这种证书获取方式。
6、生成自签名证书
1、 创建私钥(.key)
openssl genrsa -out my.key 2048
2、基于私钥(.key)创建证书签名请求(.csr)
openssl req -new -key my.key -out my.csr -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=domain1/CN=domain2"
3、使用自己的私钥(.key)签署自己的证书签名请求(.csr),生成自签名证书(.crt)
openssl x509 -req -in my.csr -out my.crt -signkey my.key -days 3650
对于这条命令,要注意以下几点:
- 这个命令是
openssl x509,-req是参数,和前面生成证书签名请求的openssl req命令不同。 -signkey my.key配置清晰地表明使用自己的私钥进行签名。
7、openssl req命令参数说明
由于创建证书的关键命令是openssl req命令,此处特别罗列一个这个命令的关键参数。
-days <n>
指定证书有效期,默认是30天,与 -x509 选项一起使用
-newkey rsa:2048
生成一个新的证书申请,同时生成一个 2048 位的 RSA 私钥
-keyout <keyfile>
新私钥要写入的文件
-nodes
不对新私钥加密
-key <keyfile>
读取指定的私钥文件.
-text
同时打印纯文本版本和编码版本信息
-noout
不打印编码后版本 (BASE64编码)
-new
生成一个新的证书申请,会提示用户输入相关字段的值,如果没有 -key 选项,会使用指定配置文件中的信息生成一个新的 RSA 私钥.
-x509
输出自签名的证书,而不是请求一个证书. 通常用于生成测试证书或自签名的根证书.
-subj <arg>
申请人信息,格式是 /C=CN/O=Corp/.../CN=www.ez.com,可以使用 \ 转义,不会跳过空格.
-[digets] 指定签署请求时使用的信息摘要算法,如 -md5,-sha1,-sha256