一、PKI(Public Key Infrastructure)

(一)PKI,即公共基础设施

它是利用了公钥技术和x.509证书所提供的安全服务。它由以下部分组成:

  • PKI策略

PKI安全策略建立和定义了一个组织信息安全方面的规则,同时也定义了密码系统使用的处理方法和原则。这包括CA是如何建立和运作的,证书是如何发行、接收和废除的,密钥是如何产生、注册的,以及密钥是如何存储的,用户是如何得到它的等等。

  • 软硬件系统

  • 认证机构CA

证书机构CA是PKI的信任基础,它管理公钥的整个生命周期,其作用包括:发放证书、规定证书的有效期和通过发布证书废除列表(CRL)确保必要时可以废除证书。

  • 注册机构RA

注册机构RA提供用户和CA之间的一个接口,它获取并认证用户的身份,向CA提出证书请求。

  • 证书发布系统

证书发布系统负责证书的发放,如可以通过用户自己,或是通过目录服务。目录服务器可以是一个组织中现存的,也可以是PKI方案中提供的。

  • PKI应用

PKI的应用非常广泛,包括在web服务器和浏览器之间的通讯、电子邮件、电子数据交换(EDI)、在Internet上的信用卡交易和虚拟私有网(×××)等。

(二)数字证书

数字证书是一种标识,它是一个经过一个权威的证书授权中心数字签名的包含密钥拥有者信息和公开密钥的文件。它就是一个用于网络的数字***明或安全护照。

1、证书格式

数字证书遵从X.509标准,它为证书及其CRL(Certificate Revocation List,证书吊销列表)的格式提供了一个标准。

证书的主要格式定义如下:

  • 证书版本号(Version):指明X.509证书的格式版本

  • 证书序列号(SerialNumber):序列号指定由CA分配给证书的唯一的数字型标识符。当证书被取消时,实际上是将此证书的序列号放入由CA签发的CRL中,这也是序列号唯一的原因。

  • 签名算法标识符(Signature):签名算法标识用来指定由CA签发证书时所使用的签名算法。

  • 签发机构名(Issuer):此域用来标识签发证书的CA的X.500 DN名字。包括国家、省市、地区、组织机构、单位部门和通用名。

  • 有效期(Validity):指定证书的有效期,包括证书开始生效的日期和时间以及失效的日期和时间。每次使用证书时,需要检查证书是否在有效期内。

  • 主题名称(Subject):指定证书持有者的X.500唯一名字。包括国家、省市、地区、组织机构、单位部门和通用名,还可包含email地址等个人信息等

  • 证书持有者公开密钥信息(Subject Public KeyInfo):证书持有者公开密钥信息域包含两个重要信息:证书持有者的公开密钥的值;公开密钥使用的算法标识符。此标识符包含公开密钥算法和hash算法。

  • 签发者唯一标识符(Issuer Unique Identifier):签发者唯一标识符在第2版加入证书定义中。此域用在当同一个X.500名字用于多个认证机构时,用一比特字符串来唯一标识签发者的X.500名字。可选。

  • 证书持有者唯一标识符(Subject Unique Identifier):持有证书者唯一标识符在第2版的标准中加入X.509证书定义。此域用在当同一个X.500名字用于多个证书持有者时,用一比特字符串来唯一标识证书持有者的X.500名字。可选。

  • CA签名值(Issuer's Signature):证书签发机构对证书上述内容的签名值。

2、证书格式举例

使用OpenSSL自建CA简单实现PKI_PKI

使用OpenSSL自建CA简单实现PKI_OpenSSL_02 使用OpenSSL自建CA简单实现PKI_CA_03

3、证书的常见格式

X.509 DER 编码(ASCII)的后缀是: .der .cer .crt

X.509 PAM 编码(Base64)的后缀是: .pem .cer .crt

Firefox就支持der格式的,即ASCII编码的证书。

 

当然,PKI还有很多的内容,这里不再赘述。

(三)三者关系

PKI是利用公钥加密技术为网上通信提供安全的基础平台。

SSL/TLS(Secure Socket Layer/Transport Layer Secure)则是利用PKI来保障网上安全通信的一种解决方案。

OpenSSL是一个可以开源的SSL、TLS实现。同时它提供丰富的密码算法库和应用程序集,可以搭建一个PKI框架的实例。

 

二、SSL/TLS

(一)ssl是什么

SSL,Secure Socket Layer,为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取及窃听。一般通用规格为40 bit的安全标准。只要3.0版本以上之I.E.或Netscape浏览器即可支持SSL。它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。    
SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议本身可以分为两层:底层为SSL记录协议(SSL record protocol);上层为SSL握手协议(SSL handshake protocol)、SSL密码变化协议(SSL change cipher spec protocol)和SSL警告协议(SSL alert protocol)。

使用OpenSSL自建CA简单实现PKI_OpenSSL_04

上图为SSL的协议栈

  • SSL记录协议:主要负责对上层的数据进行分块、压缩、计算并添加MAC(消息认证码)、加密,最后把记录块传输给对方。

  • SSL握手协议:客户端和服务器通过握手协议建立一个会话。会话包含一组参数,主要有会话ID、对方的证书、加密套件(包括密钥交换算法、数据加密算法和MAC算法)、压缩算法以及主密钥。SSL会话可以被多个连接共享,以减少会话协商开销。

  • SSL密码变化协议:客户端和服务器端通过密码变化协议通知接收方,随后的报文都将使用新协商的加密套件和密钥进行保护和传输。

  • SSL警告协议:用来允许一方向另一方报告告警信息。消息中包含告警的严重级别和描述。

有SSL协议栈可知,应用层协议可以使用SSL协议来完成安全网络传输,例如HTTPS协议(TCP 443)就是HTTP协议使用了SSL协议作为其子层。

(二)TLS是什么

IETF将SSL作了标准化,并称其为TLS(Transport Layer Security),安全传输层协议。

 


三、OpenSSL

(一)OpenSSL是什么

OpenSSL是SSL协议的开源实现。它有以下3部分组成:

使用OpenSSL自建CA简单实现PKI_CA_05

1、密码算法库:

它是OpenSSL的基础,实现了现代密码学中大部分主流的密码算法和标准,主要包括公开密钥算法(非对称)、对称加密算法、MAC(信息摘要算法)、X509数字证书标准、OCSP在线证书状态查询协议、CRL证书吊销列表等标准。在Linux平台下,其编译后文件位于/usr/lib/或者/usr/lib64/下,以CentOS 6.5 64位为例

使用OpenSSL自建CA简单实现PKI_PKI_06

支持的密码算法有

  • 对称算法:DES、AES、IDEA、CAST、RC2、RC5及RC4
  • 非对称算法:DH、RSA、DSA、EC
  • 单向加密算法:MD2、MD5、SHA、SHA1

2、SSL协议

实现封装了SSL协议的3个版本(V1、V2、V3)和TLS协议1.0。它是基于密码算法库实现的。

CentOS 6.5 64位下,位于/usr/lib64/libssl

3、应用程序(命令)

实现了很多实用的应用程序,主要包括:

  • 多种算法加密程序
  • 多种类型密钥产生程序,如RSA、MD5等
  • 证书签发和验证程序,如ca、x509、crl等
  • SSL连接测试程序
  • 其他标准应用程序

通过以上的介绍,可以看出OpenSSL实现了SSL/TLS协议,并提供强大的应用程序,可以使用它搭建一个简单的PKI环境。

 

四、PKI环境搭建

CentOS默认安装了openssl,可以使用# rpm -ql openssl 查看这个包安装了哪些内容,例如库、配置文件等。

如果没有安装,请自行配置yum源安装,# yum install openssl。配置yun请参看博主博文 《 Linux的程序安装和包管理》,此类博文很多,这里不再赘述。

一个简单的CA也应该包括注册机构、认证机构、CRL的功能。

(一)证书认证中心CA搭建 

0、工作环境初始化

/etc/pki/CA,openssl的根路径

# touch /etc/pki/CA/{index.txt,serial} #这些文件配置文件中有提到
 
# echo "01" > /etc/pki/CA/serial #只有第一次这么做,为证书生成编号
 
# mkdir csr #建立此目录准备放置签署证书请求的
 
# echo 00 > /etc/pki/CA/crlnumber #只有第一次这么做,为证书吊销列表生成编号

 

1、生成私钥

密钥文件非常重要,除了管理员,其他用户、组都不能有任何权限访问此文件,所以其权限要求为600或者400。

# cd /etc/pki/CA
# (umask 077;openssl grenrsa -out private/cakey.pem 2048)

2、配置CA的签发机构信息

内容主要包括:国家代码、省或州、城市、组织名、部门、通用名、EMail等

配置文件为 /etc/pki/tls/openssl.cnf

1)缺省配置

[ CA_default ]
 
dir             = /etc/pki/CA           # Where everything is kept     
certs           = $dir/certs            # Where the issued certs are kept     
crl_dir         = $dir/crl              # Where the issued crl are kept     
database        = $dir/index.txt        # database index file.     
#unique_subject = no                    # Set to 'no' to allow creation of     
                                        # several ctificates with same subject.     
new_certs_dir   = $dir/newcerts         # default place for new certs.
 
certificate     = $dir/cacert.pem       # The CA certificate     
serial          = $dir/serial           # The current serial number     
crlnumber       = $dir/crlnumber        # the current crl number     
                                        # must be commented out to leave a V1 CRL     
crl             = $dir/crl.pem          # The current CRL     
private_key     = $dir/private/cakey.pem# The private key     
RANDFILE        = $dir/private/.rand    # private random number file
 
x509_extensions = usr_cert              # The extentions to add to the cert
 
# Comment out the following two lines for the "traditional"     
# (and highly broken) format.     
name_opt        = ca_default            # Subject Name options     
cert_opt        = ca_default            # Certificate field options
2)请求匹配策略
policy          = policy_match    #使用policy_match来匹配请求的域信息     
[ policy_match ]     
countryName             = match     
stateOrProvinceName     = match     
organizationName        = match     
organizationalUnitName  = optional     
commonName              = supplied     
emailAddress            = optional   

3)对配置修改如下

default_days    = 3650 #证书期限
 
[ req_distinguished_name ]     
 
#默认机构信息修改
countryName                     = Country Name (2 letter code)     
countryName_default             = CN     
countryName_min                 = 2     
countryName_max                 = 2
 
stateOrProvinceName             = State or Province Name (full name)     
stateOrProvinceName_default     = JS
 
localityName                    = Locality Name (eg, city)     
localityName_default    = NJ
 
0.organizationName              = Organization Name (eg, company)     
0.organizationName_default      = NJU
 
# we can do this but it is not needed normally :-)     
#1.organizationName             = Second Organization Name (eg, company)     
#1.organizationName_default     = World Wide Web Pty Ltd
 
organizationalUnitName          = Organizational Unit Name (eg, section)     
organizationalUnitName_default  = Heyuan
 
commonName                      = Common Name (eg, your name or your server\'s hostname)     
commonName_max                  = 64
 
emailAddress                    = Email Address     
emailAddress_max                = 64

3、自签署证书

# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650     
You are about to be asked to enter information that will be incorporated     
into your certificate request.     
What you are about to enter is what is called a Distinguished Name or a DN.     
There are quite a few fields but you can leave some blank     
For some fields there will be a default value,     
If you enter '.', the field will be left blank.     
-----     
Country Name (2 letter code) [CN]:     
State or Province Name (full name) [JS]:     
Locality Name (eg, city) [NJ]:     
Organization Name (eg, company) [NJU]:     
Organizational Unit Name (eg, section) [Heyuan]:     
Common Name (eg, your name or your server's hostname) []:www.heyuan.com     
Email Address []:webmaster@heyuan.com

这样就在/etc/pki/CA下,拥有了CA的证书。

传送到windows,修改cacert.pem为cacert.cer,查看

使用OpenSSL自建CA简单实现PKI_CA_07 使用OpenSSL自建CA简单实现PKI_PKI_08 

使用OpenSSL自建CA简单实现PKI_OpenSSL_09 使用OpenSSL自建CA简单实现PKI_CA_10

 

到此一个简单的CA已经准备好了。

(二)节点申请证书

1、节点生成请求

(1)生成密钥对

# mkdir /etc/httpd/ssl     
# (umask 077;openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)

(2)生成证书签署请求

从CA的配置文件中可以看到,国家代码、省州、城市和组织机构名称必须一样。

[root@localhost ~]# openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr     
 
 
You are about to be asked to enter information that will be incorporated     
into your certificate request.     
What you are about to enter is what is called a Distinguished Name or a DN.     
There are quite a few fields but you can leave some blank     
For some fields there will be a default value,     
If you enter '.', the field will be left blank.     
-----     
Country Name (2 letter code) [XX]:CN     
State or Province Name (full name) []:JS     
Locality Name (eg, city) [Default City]:NJ     
Organization Name (eg, company) [Default Company Ltd]:NJU     
Organizational Unit Name (eg, section) []:Heyuan    
Common Name (eg, your name or your server's hostname) []:www1.heyuan.com     
Email Address []:web1@heyuan.com
 
Please enter the following 'extra' attributes     
to be sent with your certificate request     
A challenge password []:     
An optional company name []:

(3)提交给CA

这里采用scp命令将申请文件复制到CA的目录中

# scp /etc/httpd/ssl/httpd.csr 192.168.60.172:/etc/pki/CA/csr/

2、CA签署证书

(1)对接收到的请求进行验证,如果通过,执行下一步

(2)签署证书

# openssl ca -in /etc/pki/CA/csr/httpd.csr -out /etc/pki/CA/csr/httpd.crt -days 1000     
# cat index.txt     
V    170429085617Z        01    unknown    /C=CN/ST=JS/O=NJU/OU=Heyuan/CN=www1.heyuan.com/emailAddress=web1@heyuan.com# cat serial     
02     
# ls /etc/pki/CA/newcerts/ /etc/pki/CA/csr/     
/etc/pki/CA/csr/:     
httpd.crt  httpd.csr
 
/etc/pki/CA/newcerts/:     
01.pem


(3)发布证书

可以通知证书申请者下载证书,或者直接发给他。这里采用scp发回个申请者。

# scp /etc/pki/CA/newcerts/httpd.crt 192.168.60.133:/etc/httpd/ssl/

查看证书

  使用OpenSSL自建CA简单实现PKI_OpenSSL_11 使用OpenSSL自建CA简单实现PKI_OpenSSL_12

(三)证书吊销

1、节点提取证书的serial和subject,并提交CA请求吊销证书。使用x509子命令查看

# openssl x509 -in /etc/httpd/ssl/httpd.crt -noout -serial -subject     
serial=01     
subject= /C=CN/ST=JS/O=NJU/OU=Heyuan/CN=www1.heyuan.com/emailAddress=web1@heyuan.com

2、CA根据提交的信息验证核实,是否一致

# cat /etc/pki/CA/index.txt     
V    170429085617Z        01    unknown    /C=CN/ST=JS/O=NJU/OU=Heyuan/CN=www1.heyuan.com/emailAddress=web1@heyuan.com

3、CA吊销证书

# openssl ca -revoke /etc/pki/CA/newcerts/01.pem     
# cat index.txt     
R    170429085617Z    140803091048Z    01    unknown    /C=CN/ST=JS/O=NJU/OU=Heyuan/CN=www1.heyuan.com/emailAddress=web1@heyuan.com

4、CA更新证书吊销列表

# echo 00 > /etc/pki/CA/crlnumber
# openssl ca -gencrl -out /etc/pki/CA/crl/ca.crl     
Using configuration from /etc/pki/tls/openssl.cnf

查看crl证书吊销列表文件

# openssl crl -in /etc/pki/CA/crl/ca.crl -text -noout     
Certificate Revocation List (CRL):     
        Version 2 (0x1)     
    Signature Algorithm: sha1WithRSAEncryption     
        Issuer: /C=CN/ST=JS/L=NJ/O=NJU/OU=Heyuan/CN=www.heyuan.com/emailAddress=webmaster@heyuan.com     
        Last Update: Aug  3 09:20:05 2014 GMT     
        Next Update: Sep  2 09:20:05 2014 GMT     
        CRL extensions:     
            X509v3 CRL Number:     
                0     
Revoked Certificates:     
    Serial Number: 01     
        Revocation Date: Aug  3 09:10:48 2014 GMT     
    Signature Algorithm: sha1WithRSAEncryption     
         85:e5:7b:ad:7f:9c:04:03:2e:e8:cf:66:ac:e8:46:70:c3:9a:     
         8e:80:a6:8b:6a:39:31:c1:27:7a:28:e7:50:ba:8b:fd:07:f5:     
         c4:40:29:f2:e3:91:c7:e3:86:69:49:ad:28:cf:17:d1:a2:4c:     
         5d:52:f8:18:a2:84:32:3e:49:ad:04:54:3b:50:79:f8:e6:74:     
         a0:1a:85:40:e7:ce:c0:10:9c:c8:9e:19:f6:18:2d:5a:9a:85:     
         f8:2f:c8:75:56:4b:d9:15:39:f3:75:27:82:cc:04:02:09:be:     
         6e:10:6d:e9:bd:99:82:36:6e:f7:f7:c6:90:a7:18:66:2b:4e:     
         c2:ee:1c:0d:6e:2f:22:9f:da:d6:ac:e3:ae:e2:6e:50:64:43:     
         45:87:2c:63:18:de:c5:9e:d9:71:ff:84:9c:72:8f:20:2a:f4:     
         92:f6:2d:42:33:ae:f3:93:89:2f:57:b1:62:28:ba:c0:ec:31:     
         d8:b0:98:03:1f:73:fb:f5:91:52:52:98:ed:c0:30:a3:bb:8d:     
         5d:d6:54:13:e1:6a:6a:70:ef:c6:89:c9:4b:47:b0:59:0c:94:     
         8d:1b:9b:e4:09:e1:48:47:8b:4b:2c:5a:98:f0:4c:91:1f:65:     
         c8:76:49:13:d0:8f:79:9c:57:9b:7c:9d:35:d2:90:66:60:c3:     
         9e:95:7c:99

实际生成环境中,CA应该把CRL共享出来,使用者要经常更新这个列表文件并导入本地浏览器中,这样浏览器就会自动去判断证书是否被吊销。

 

OpenSSL心脏出血漏洞

OpenSSL在2014年4月爆出惊天heartbleed漏洞,该漏洞是通过改造心跳包,让服务器端未检查边界的c的memcpy函数多拷贝数据返回给发送者。哎,边界检查一旦忘记,就是C和C++程序员的噩梦。

所以,生成环境中使用OpenSSL还需检查是否需要打补丁修复漏洞。

 

参考资料

PKI技术及应用开发指南

http://www.ibm.com/developerworks/cn/security/se-pkiusing/index.html