PKI、CA、SSL、TLS、OpenSSL几个概念
PKI 和 CA
PKI 就是 Public Key Infrastructure 的缩写,翻译过来就是公开密钥基础设施。它是利用公开密钥技术所构建的,解决网络安全问题的,普遍适用的一种基础设施。
PKI 是目前唯一的能够基本全面解决安全问题的可能的方案。 PKI 通过电子证书以及管理这些电子证书的一整套设施,维持网络世界的秩序;通过提供一系列的安全服务,为网络电子商务、电子政务提供有力的安全保障。
通俗点说 PKI 就是一整套安全相关标准,然后基于这套标准体系衍生一系列安全相关的产品,主要目的是保证数据在网络上安全、可靠地传输。
PKI 主要由以下组件组成:
- 认证中心 CA(证书签发) ;
- X.500目录服务器(证书保存) ;
- 具有高强度密码算法(SSL)的安全WWW服务器(即配置了 HTTPS 的 apache) ;
- Web(安全通信平台): Web 有 Web Client 端和 Web Server 端两部分
- 自开发安全应用系统 自开发安全应用系统是指各行业自开发的各种具体应用系统,例如银行、证券的应用系统等。
CA 是 PKI 的”核心”,即数字证书的申请及签发机关,CA 必须具备权威性的特征,它负责管理 PKI 结构下的所有用户(包括各种应用程序)的证书,把用户的公钥和用户的其他信息捆绑在一起,在网上验证用户的身份,CA 还要负责用户证书的黑名单登记和黑名单发布 。
CA 实现了 PKI 中一些很重要的功能:
- 接收验证最终用户数字证书的申请;
- 确定是否接受最终用户数字证书的申请-证书的审批;
- 向申请者颁发、拒绝颁发数字证书-证书的发放;
- 接收、处理最终用户的数字证书更新请求-证书的更新;
- 接收最终用户数字证书的查询、撤销;
- 产生和发布证书废止列表(CRL);
- 数字证书的归档;
- 密钥归档;
- 历史数据归档;
在这么多功能中,CA 的核心功能就是”发放”和”管理”数字证书:
SSL 和 TLS
SSL 和 TLS 协议是介于 HTTP 协议与 TCP 之间的一个可选层,主要用于 Web 客户端和服务器之间进行数据的安全传输:
- SSL: Secure Socket Layer,安全套接字层),为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取。当前版本为3.0。它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层:
SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。
SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。 - TLS: (Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。
TLS 1.0是IETF(Internet Engineering Task Force,Internet工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本,可以理解为SSL 3.1,它是写入了 RFC 的。该协议由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshake)。较低的层为 TLS 记录协议,位于某个可靠的传输协议(例如 TCP)上面。
SSL/TLS协议提供的服务主要有:
- 认证用户和服务器,确保数据发送到正确的客户机和服务器;
- 加密数据以防止数据中途被窃取;
- 维护数据的完整性,确保数据在传输过程中不被改变;
OpenSSL
OpenSSL 是一个开源的加密工具包,主要包括如下三部分:
- libssl (with platform specific naming):
Provides the client and server-side implementations for SSLv3 and TLS. - libcrypto (with platform specific naming):
Provides general cryptographic and X.509 support needed by SSL/TLS but
not logically part of it. - openssl:
A command line tool that can be used for:Creation of key parameters Creation of X.509 certificates, CSRs and CRLs Calculation of message digests Encryption and decryption SSL/TLS client and server tests Handling of S/MIME signed or encrypted mail And more...
使用 OpenSSL 生产自签名 SSL 证书过程
以下为 Centos7 环境下生成自签名 SSL 证书的具体过程:
修改 openssl 配置文件
1
2
3
4
5
6
7
8
9vi /etc/pki/tls/openssl.cnf
# match 表示后续生成的子证书的对应项必须和创建根证书时填的值一样,否则报错。以下配置只规定子证书的 countryName 必须和根证书一致。
[ policy_match ] 段配置改成如下:
countryName = match
stateOrProvinceName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional在服务器 pki 的 CA 目录下新建两个文件
1
cd /etc/pki/CA && touch index.txt serial && echo 01 > serial
生成 CA 根证书密钥
1
cd /etc/pki/CA/ && openssl genrsa -out private/cakey.pem 2048 && chmod 400 private/cakey.pem
生成根证书(根据提示输入信息,除了 Country Name 选项需要记住的,后面的随便填)
1
openssl req -new -x509 -key private/cakey.pem -out cacert.pem
生成密钥文件
1
openssl genrsa -out nginx.key 2048
生成证书请求文件(CSR):
A. 根据提示输入信息,除了 Country Name 与前面根证书一致外,其他随便填写
B. Common Name 填写要保护的域名,比如:*.qhh.me1
openssl req -new -key nginx.key -out nginx.csr
使用 openssl 签署 CSR 请求,生成证书
1
2
3
4
5
6
7
8openssl ca -in nginx.csr -cert /etc/pki/CA/cacert.pem -keyfile /etc/pki/CA/private/cakey.pem -days 365 -out nginx.crt
参数项说明:
-in: CSR 请求文件
-cert: 用于签发的根 CA 证书
-keyfile: 根 CA 的私钥文件
-days: 生成的证书的有效天数
-out: 生成证书的文件名
至此自签名证书生成完成,最终需要:nginx.key 和 nginx.crt
配置 Nginx 使用自签名证书
1 | server { |
相关资料
http://seanlook.com/2015/01/18/openssl-self-sign-ca/ | 基于 OpenSSL 自签署证书
http://www.cnblogs.com/littlehann/p/3738141.html | openSSL命令、PKI、CA、SSL证书原理
https://cnzhx.net/blog/ssl-on-lamp-on-vps/
http://seanlook.com/2015/01/15/openssl-certificate-encryption/ | OpenSSL 与 SSL 数字证书概念贴
https://kb.cnblogs.com/page/194742/ | 数字证书及 CA 的扫盲
http://netsecurity.51cto.com/art/200602/21066.htm | PKI/CA 技术的介绍
http://cnzhx.net/blog/self-signed-certificate-as-trusted-root-ca-in-windows/ | 浏览器添加自签名证书
https://aotu.io/notes/2016/08/16/nginx-https/index.html | Nginx 配置 HTTPS 服务器