网络安全和加密二——证书签发
上篇文章我们对网络安全和加密的一些基本原理和概念进行了一些介绍,这里再对一些证书签发过程进行更详细的阐述,以及更多相关概念。
OpenSSL和HTTPS的关系
OpenSSL和HTTPS想必大家都听说过,但是他们是什么关系呢?网上有一个比喻比较形象——HTTPS与OpenSSL就是iPhone与富士康的关系。
具体来说,HTTPS是一种协议,等于HTTP+TLS(由于历史原因,SSL3.0之后就被TLS1.0替代了)。而openssl是一套开源工具集,主要有两个特性:
1. 实现了ssl2,ssl3,TLSv1,TLSv1.1,TLSv1.2协议。
2. 实现目前常用的加密算法。
一个是协议,一个是实现。
SSL是啥?
大家知道我们访问网站的时候,以 HTTPS 开头的表示你和服务器之间传输的数据经过了加密,这里所使用的加密协议就是 SSL ( Secure Sockets Layer ,后来又推出了它的后续版本,改名叫 TLS )。也就是说,把 HTTP 协议经过一层 SSL 协议进行加密包装,就变成了 HTTPS 。当然, SSL/TLS 还用在很多协议中,例如VPN、加密的电子邮件协议等。
那么 OpenSSL 又是啥?
在 SSL 协议中,我们使用了很多密码学手段来保护数据,其中包括对称密码、公钥密码、数字签名、证书、完整性校验、伪随机数生成等。由于这些算法和操作都非常复杂,于是开源社区就开发了一套库,这个库里面提供了很多现成的标准方法,其他开发者只要用正确调用这些方法,就可以实现 SSL 协议中的各种加密/解密操作了。因此, OpenSSL 是一套开源的密码学工具包( open source cryptography toolkit )
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其他的目的使用
OpenSSL 由三部分组成:
l Libencrpt:加解密库
l Libssl:实现ssl安全通信机制的库
l Openssl:多用途命令行工具
证书的签发过程
上一篇文章我们介绍了什么是CA,什么是证书,那么这里再讲一下CA签发证书的的完整过程:
1. 服务方S向第三方机构CA提交公钥、组织信息、个人信息(域名)等信息(CSR)并申请认证;
2. CA通过线上、线下等多种手段验证申请者提供信息的真实性,如组织是否存在、企业是否合法,是否拥有域名的所有权等;
3. 如信息审核通过,CA 会向申请者签发认证文件-证书。
证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构 CA 的信息、有效时间、证书序列号等信息的明文,同时包含一个签名;
签名的产生算法:首先,使用散列函数计算公开的明文信息的信息摘要,然后,采用 CA 的私钥对信息摘要进行加密,密文即签名;
4. 客户端C向服务器S发出请求时,S返回证书文件;
5. 客户端C读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应 CA 的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即公钥合法;
6. 客户端然后验证证书相关的域名信息、有效时间等信息;
7. 客户端会内置信任 CA 的证书信息(包含公钥),如果CA不被信任,则找不到对应 CA 的证书,证书也会被判定非法。
在这个过程注意几点:
l 申请证书不需要提供私钥,确保私钥永远只能服务器掌握;
l 证书的合法性仍然依赖于非对称加密算法,证书主要是增加了服务器信息以及签名;
l 内置 CA 对应的证书称为根证书,颁发者和使用者相同,自己为自己签名,即自签名证书;
l 证书=公钥+申请者与颁发者信息+签名;
什么是CSR以及CSR的作用和生成
说起的时候,势必会提到CSR这么一个词汇,这里关于CSR做个详细的说明。
CSR是什么
CSR是Certificate Signing Request的英文缩写,即证书签名请求文件,是证书申请者在申请数字证书时由CSP(加密服务提供者)在生成私钥的同时也生成证书请求文件,证书申请者只要把CSR文件提交给证书颁发机构后,证书颁发机构使用其根证书私钥签名就生成了证书公钥文件,也就是颁发给用户的证书。
CSR什么样
CSR是以-----BEGIN CERTIFICATE REQUEST-----开头,-----END CERTIFICATE REQUEST-----为结尾的base64格式的编码。将其保存为文本文件,就是所谓的CSR文件。
CSR如何生成
目前,CSR生成工具非常多,比如openssl工具,keystore explore,XCA等,这里介绍一款在线工具:
这里有几个关键的要注意下:
l 域名必须正确输入(如果是非SSL证书,则输入相应的通用名)。
l 密钥算法选择RSA的话,密钥长度需要2048bit以上(这个默认是2048,没有特殊情况,不要特殊设置);ECC则是256bit以上。
l 摘要签名虽说目前可以任意,但建议是sha2-256以上。
有CSR必定有KEY,是成对的,CSR最终变成为证书,和私钥key配对使用。Key是以-----BEGIN RSA PRIVATE KEY-----开头的,-----END RSA PRIVATE KEY-----结尾的。Key必须保存好。
CSR生命周期
证书下发后,CSR无需使用,仅提交时候需要。
openssl生成证书流程
openssl中有如下后缀名的文件:
.key格式:私有的密钥,通常使用RSA算法
.csr格式:证书签名请求(证书请求文件),含有公钥信息,certificate signing request的缩写
.crt格式:证书文件,certificate的缩写
.crl格式:证书吊销列表,Certificate Revocation List的缩写
.pem格式:用于导出,导入证书时候的证书的格式,有证书开头,结尾的格式
CA根证书的生成步骤
生成CA私钥(.key)-->生成CA证书请求(.csr)-->自签名得到根证书(.crt)(CA给自已颁发的证书)。
1. 安装包
#unzip openssl-1.0.0e.zip
2. 对及目录下所有的文件赋予可读可写可执行权限
#chmod 777 -R openssl-1.0.0e
# cd openssl-1.0.0e/
3. 将你要安装的程序装到目录/home/blave/openssl下
#./config --prefix=/home/blave/openssl
4. 生成服务器端的私钥 (key 文件)
#openssl genrsa -out server.key 1024
5. 生成服务器端证书签名请求文件 (csr 文件)
#openssl req -new -key server.key -out server.csr
点击(此处)折叠或打开
- Country Name (2 letter code) [XX]:CN----------------------------------- 证书持有者所在国家
- State or Province Name (full name) []:BJ------------------------------- 证书持有者所在州或省份(可省略不填)
- Locality Name (eg, city) []:BJ----------------------------------------- 证书持有者所在城市(可省略不填)
- Organization Name (eg, company) []:NH---------------------------------- 证书持有者所属组织或公司Organizational Unit Name (eg, section) []:.---------------------------- 证书持有者所属部门(可省略不填)
- Common Name (eg, your name or your server
6. 生成证书文件 (crt 文件)
# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
执行完后查看openssl-1.0.0e发现有server.crt和server.key 两个文件
在实际的软件开发工作中,往往服务器就采用这种自签名的方式,因为毕竟找第三方签名机构是要给钱的,也是需要花时间的。
用户证书的生成步骤
生成私钥(.key)-->生成证书请求(.csr)-->用CA根证书签名得到证书(.crt)
l 服务器端用户证书:
点击(此处)折叠或打开
-
# private key
-
$openssl genrsa -des3 -out server.key 1024
-
# generate csr
-
$openssl req -new -key server.key -out server.csr
- # generate certificate
- $openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key
l 客户端用户证书
点击(此处)折叠或打开
-
$openssl genrsa -des3 -out client.key 1024
-
$openssl req -new -key client.key -out client.csr
- $openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key
l 生成pem格式证书:
有时需要用到pem格式的证书,可以用以下方式合并证书文件(crt)和私钥文件(key)来生成
点击(此处)折叠或打开
-
$cat client.crt client.key> client.pem
- $cat server.crt server.key > server.pem
l 结果
服务端证书:ca.crt, server.key, server.crt, server.pem
客户端证书:ca.crt, client.key, client.crt, client.pem