openSSL命令、PKI、CA、SSL证书原理

转自:http://blog.csdn.net/gui694278452/article/details/46373319

目录

1. PKI、CA简介
2. SSL证书
3. SSL证书生成、openSSL学习 
4. CA中心搭建、SSL证书生成过程

1. PKI、CA简介

PKI(Public Key Infrastructure)即"公钥基础设施",是一种遵循既定标准的密钥管理平台,它能够为所有网络应用提供加密和数字签名等密码服务及所必需的密钥和证书管理体系,简单来说,PKI就是利用公钥理论和技术建立的提供安全服务的基础设施。PKI技术是信息安全技术的核心,也是电子商务的关键和基础技术。

PKI是Public Key Infrastructure的缩写,是指用公钥概念和技术来实施和提供安全服务的具有普适性的安全基础设施。这个定义涵盖的内容比较宽,原则上说,任何以公钥技术为基础的安全基础设施都是PKI。当然,没有好的非对称算法和好的密钥管理就不可能提供完善的安全服务,也就不能叫做PKI。也就是说,该定义中已经隐含了必须具有的密钥管理功能。

PKI既不是一个协议,也不是一个软件,它是一个标准,在这个标准之下发展出的为了实现安全基础服务目的的技术统称为PKI

PKI主要由以下组件组成

1. 认证中心CA(证书签发) 
CA是PKI的"核心",即数字证书的申请及签发机关,CA必须具备权威性的特征,它负责管理PKI结构下的所有用户(包括各种应用程序)的证书,把用户的公钥和用户的其他信息捆绑在一起,在网上验证用户的身份,CA还要负责用户证书的黑名单登记和黑名单发布 

2. X.500目录服务器(证书保存) 
X.500目录服务器用于"发布"用户的证书和黑名单信息,用户可通过标准的LDAP协议查询自己或其他人的证书和下载黑名单信息。

3. 具有高强度密码算法(SSL)的安全WWW服务器(即配置了HTTPS的apache) 
Secure socket layer(SSL)协议最初由Netscape 企业发展,现已成为网络用来鉴别网站和网页浏览者身份,以及在浏览器使用者及网页服务器之间进行加密通讯的全球化标准。

4. Web(安全通信平台)
Web有Web Client端和Web Server端两部分,分别安装在客户端和服务器端,通过具有高强度密码算法的SSL 协议保证客户端和服务器端数据的机密性、完整性、身份验证。

5. 自开发安全应用系统 自开发安全应用系统是指各行业自开发的各种具体应用系统,例如银行、证券的应用系统等。完整的PKI包括:
    1) 认证政策的制定,包括
        1.1) 遵循的技术标准
        1.2) 各CA 之间的上下级或同级关系
        1.3) 安全策略
        1.4) 安全程度
        1.5) 服务对象
        1.6) 管理原则和框架等
    2) 认证规则
    3) 运作制度的制定
    4) 所涉及的各方法律关系内容
    5) 技术的实现等

认证中心CA作为PKI的核心部分,CA实现了PKI 中一些很重要的功能

1. 接收验证最终用户数字证书的申请
2. 确定是否接受最终用户数字证书的申请-证书的审批
3. 向申请者颁发、拒绝颁发数字证书-证书的发放
4. 接收、处理最终用户的数字证书更新请求-证书的更新
5. 接收最终用户数字证书的查询、撤销
6. 产生和发布证书废止列表(CRL)
7. 数字证书的归档
8. 密钥归档
9. 历史数据归档

在这么多功能中,CA的核心功能就是"发放"和"管理"数字证书,同时这也是PKI的核心

图2 典型CA框架模型

典型CA框架模型 

安全服务器面向普通用户,用于提供:
    1) 证书申请
    2) 浏览
    3) 证书撤消列表
    4) 证书下载等安全服务
安全服务器与用户的的通信采取安全信道方式(如SSL的方式,不需要对用户进行身份认证)。用户首先得到安全服务器的证书(该证书由CA颁发),然后用户与服务器之间的所有通信,包括用户填
写的申请信息以及浏览器生成的公钥均以安全服务器的密钥进行加密传输,只有安全服务器利用自己的私钥解密才能得到明文,这样可以防止其他人通过窃听得到明文。从而保证了证书申请和传输
过程中的信息安全性。

2. CA服务器
CA服务器是整个证书机构的核心,负责:
    1) 证书的签发
        1.1) 产生自身的私钥和公钥(密钥长度至少为1024位)
        1.2) 然后生成根数字证书,并且将数字证书传输给安全服务器
    2) CA还负责为操作员、安全服务器以及注册机构服务器生成数字证书。安全服务器的数字证书和私钥也需要传输给安全服务器
CA服务器是整个结构中最为重要的部分,存有CA的私钥以及发行证书的脚本文件,出于安全的考虑,应将CA服务器与其他服务器隔离,任何通信采用人工干预的方式,确保认证中心的安全。

3. 注册机构RA
登记中心服务器面向登记中心操作员,在CA体系结构中起承上启下的作用
    1) 一方面向CA转发安全服务器传输过来的证书申请请求
    2) 另一方面向LDAP服务器和安全服务器转发CA颁发的数字证书和证书撤消列表。

4. LDAP服务器
LDAP服务器提供目录浏览服务,负责将注册机构服务器传输过来的用户信息以及数字证书加入到服务器上。这样其他用户通过访问LDAP服务器就能够得到其他用户的数字证书。

5. 数据库服务器:数据库服务器是认证机构中的核心部分,用于:
    1) 认证机构中数据(如密钥和用户信息等)
    2) 日志合统计信息的存储和管理
实际的的数据库系统应采用多种措施,如磁盘阵列、双机备份和多处理器等方式,以维护数据库系统的安全性、稳定性、可伸缩性和高性能。

我们知道,PKI的目的是使用公钥机制加密技术来保护通信的安全,而公钥算法涉及到很多的加密参数,同时PKI机制中还有对用户身份的识别的功能,为了满足这些需求,"证书"的出现就很自然了,证书从本质上来说就是一个ASCII文本文件,它只是将整个公钥机制中需要的各种数据都捆绑打包到了一起,统一管理、分发。

2. SSL证书 

"SSL证书"这个词是一个相对较大的概念,有很多种格式的SSL证书,整个PKI体系中有很多格式标准。PKI的标准规定了PKI的设计、实施和运营,规定了PKI各种角色的"游戏规则"。如果两个PKI应用程序之间要想进行交互,只有相互理解对方的数据含义,交互才能正常进行,标准的作用就是提供了数据语法和语义的共同约定

PKI中最重要的标准,它定义了公钥证书的基本结构。
X.509是国际电信联盟-电信(ITU-T)部分标准和国际标准化组织(ISO)的证书格式标准。作为ITU-ISO目录服务系列标准的一部分,X.509是定义了公钥证书结构的基本标准。1988年首次发布,
1993年和1996年两次修订。当前使用的版本是X.509 V3,它加入了扩展字段支持,这极大地增进了证书的灵活性。X.509 V3证书包括一组按预定义顺序排列的强制字段,还有可选扩展字段
,即使在强制字段中,X.509证书也允许很大的灵活性,因为它为大多数字段提供了多种编码方案。X.509 V4版已经推出。
X.509标准在PKI中起到了举足轻重的作用,PKI由小变大,由原来网络封闭环境到分布式开放环境,X.509起了很大作用,可以说X.509标准是PKI的雏形。PKI是在X.509标准基础上发展起来的
    1) SSL公钥证书
    2) 证书废除列表CRL(Certificate revocation lists 证书黑名单)

2. PKCS标准(公钥加密标准 Public Key Cryptography Standards, PKCS)
它定义了"数据通信协议"的主要标准。这些标准定义了如何恰当地格式化私钥或者公钥,之所以需要定义PKCS标准,是因为证书的产生并不是在本地用的,往往需要在网络中进行传输,因此需要
有一个良好的规范来定义和保证证书在网络中的正常传输
http://zh.wikipedia.org/wiki/PKCS
    1) PKCS#7 
    PKCS#7是由RSA安全体系在公钥加密系统中交换数字证书产生的一种加密标准,PKCS#7为"密码信封封装标准",描述了密码操作(例如数字签名和数字信封)的数据的通用语法。该语法允许
递归,例如一个数字信封可以嵌套在另一个数字信封里面,或者一个实体可以在一个已经封装的数据上签名。该语法同时允许添加任意属性,比如签名时间等。
    该标准和保密增强邮件(PEM)是兼容的,如果以PEM兼容形式构建,那么被签名后的数据和签名后又封装的数据内容可以很容易地被转化成PEM格式。
    这是一种将数据加密和签名(enveloping)的技术标准,它描述
        1.1) 数字证书的语法
        1.2) 其他加密消息
        1.3) 数据加密
        1.4) 数字签名的方法
        1.5) 也包含了算法 
    常见的文件后缀有:
        1.1) .P7B 
        1.2) .p7c
    1.3) .SPC
    文件中包含:
        1) 证书
        2) CRL列表信息
        3) 没有私钥(注意)
    2) PKCS#12 
    它定义了一个用于保存私钥和对应公钥证书的文件格式,并由对称密钥加密保护。PKCS#12通常采用PFX,P12作为文件扩展名。PKCS#12文件可以存放多个证书,并由密码保护,通常用于
WINDOWS IIS,也能够被当作Java Keysotre文件使用,用于Tomcat,Resign,Weblogic,Jboss等,不能被用于Apache.
    常见的文件后缀有:
        2.1) .PFX 
        2.2) .p12
    文件中包含: 
    1) 证书(公钥)
        2) 私钥(受密码保护(可选))
        3) 完整的证书链信息
 
3. X.500和目录服务标准
规定了证书撤销列表存储

0x1: SSL公钥证书

版本号指明X.509证书的格式版本,现在的值可以为:
    1) 0: v1
    2) 1: v2
    3) 2: v3
也为将来的版本进行了预定义

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

3. 签名算法标识符(Signature Algorithm)
签名算法标识用来指定由CA签发证书时所使用的"签名算法"。算法标识符用来指定CA签发证书时所使用的:
    1) 公开密钥算法
    2) hash算法
example: sha1WithRSAEncryption
须向国际知名标准组织(如ISO)注册

4. 签发机构名(Issuer)
此域用来标识签发证书的CA的X.500 DN(DN-Distinguished Name)名字。包括:
    1) 国家(C)
    2) 省市(ST)
    3) 地区(L)
    4) 组织机构(O)
    5) 单位部门(OU)
    6) 通用名(CN)
    7) 邮箱地址

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

6. 证书用户名(Subject)
指定证书持有者的X.500唯一名字。包括:
    1) 国家(C)
    2) 省市(ST)
    3) 地区(L)
    4) 组织机构(O)
    5) 单位部门(OU)
    6) 通用名(CN)
    7) 邮箱地址

7. 证书持有者公开密钥信息(subject PublicKey Info)
证书持有者公开密钥信息域包含两个重要信息:
    1) 证书持有者的公开密钥的值
    2) 公开密钥使用的算法标识符。此标识符包含公开密钥算法和hash算法。
8. 扩展项(extension)
X.509 V3证书是在v2的基础上一标准形式或普通形式增加了扩展项,以使证书能够附带额外信息。标准扩展是指由X.509 V3版本定义的对V2版本增加的具有广泛应用前景的扩展项,任何人都
可以向一些权威机构,如ISO,来注册一些其他扩展,如果这些扩展项应用广泛,也许以后会成为标准扩展项。

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

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

11. 签名算法(Signature Algorithm)
证书签发机构对证书上述内容的签名算法
example: sha1WithRSAEncryption

12. 签名值(Issuer's Signature)
证书签发机构对证书上述内容的签名值

0x2: 证书废除列表CRL

证书废除列表CRL(Certificate revocation lists)为应用程序和其它系统提供了一种检验证书有效性的方式。任何一个证书废除以后,证书机构CA会通过发布CRL的方式来通知各个相关方

    1) 0: 表示X.509 V1 标准
    2) 1: 表示X.509 V2 标准
    3) 2: 表示X.509 V3标准
目前常用的是V3标准

2. 签名算法:包含:
    1) 算法标识
    2) 算法参数
用于指定证书签发机构用来对CRL内容进行签名的算法。

3. 证书签发机构名:签发机构的DN名,由
    1) 国家(C)
    2) 省市(ST)
    3) 地区(L)
    4) 组织机构(O)
    5) 单位部门(OU)
    6) 通用名(CN)
    7) 邮箱地址

4. 此次签发时间:此次CRL签发时间,遵循ITU-T X.509 V2标准的CA在2049年之前把这个域编码为UTCTime类型,在2050或2050年之后年之前把这个域编码为GeneralizedTime类型。

5. 下次签发时间:下次CRL签发时间,遵循ITU-T X.509 V2标准的CA在2049年之前把这个域编码为UTCTime类型,在2050或2050年之后年之前把这个域编码为GeneralizedTime类型。

6. 用户公钥信息,其中包括:
    1) 废除的证书序列号: 要废除的由同一个CA签发的证书的一个唯一标识号,同一机构签发的证书不会有相同的序列号
    2) 证书废除时间 

7. 签名算法:对CRL内容进行签名的签名算法。

8. 签名值:证书签发机构对CRL内容的签名值。

3. SSL证书生成、openSSL学习 

OpenSSL是一个强大的安全套接字层密码库,整个软件包大概可以分成三个主要的功能部分

1. 密码算法库
2. 常用的密钥和证书封装管理功能
3. SSL通信API接口
4. 丰富的应用程序供测试或其它目的使用

使用openSSL开发套件,我们可以完成以下功能

2. 建立 X.509 证书、证书签名请求(CSR)和CRLs(证书回收列表) 
3. 计算消息摘要 
4. 使用各种 Cipher加密/解密 
5. SSL/TLS 客户端以及服务器的测试 
6. 处理S/MIME 或者加密邮件 

openssl提供了很多不同的命令,每个子命令有很多的选项和参数,我们来逐一学习一下

    1) asn1parse: asn1parse用于解释用ANS.1语法书写的语句(ASN一般用于定义语法的构成) 
    2) ca: ca用于CA的管理 
    openssl ca [options]:
        2.1) -selfsign
        使用对证书请求进行签名的密钥对来签发证书。即"自签名",这种情况发生在生成证书的客户端、签发证书的CA都是同一台机器(也是我们大多数实验中的情况),我们可以使用同一个
密钥对来进行"自签名"
        2.2) -in file
        需要进行处理的PEM格式的证书
        2.3) -out file
        处理结束后输出的证书文件
        2.4) -cert file
        用于签发的根CA证书
        2.5) -days arg 
        指定签发的证书的有效时间
        2.6) -keyfile arg   
        CA的私钥证书文件
        2.7) -keyform arg
        CA的根私钥证书文件格式:
            2.7.1) PEM
            2.7.2) ENGINE 
        2.8) -key arg   
        CA的根私钥证书文件的解密密码(如果加密了的话)
        2.9) -config file    
        配置文件
    example1: 利用CA证书签署请求证书
    openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key  

    3) req: X.509证书签发请求(CSR)管理
    openssl req [options] <infile >outfile
        3.1) -inform arg
        输入文件格式
            3.1.1) DER
            3.1.2) PEM
        3.2) -outform arg   
        输出文件格式
            3.2.1) DER
            3.2.2) PEM
        3.3) -in arg
        待处理文件
        3.4) -out arg
        待输出文件
        3.5) -passin        
        用于签名待生成的请求证书的私钥文件的解密密码
        3.6) -key file
        用于签名待生成的请求证书的私钥文件
        3.7) -keyform arg  
            3.7.1) DER
            3.7.2) NET
            3.7.3) PEM
        3.8) -new
        新的请求
        3.9) -x509          
        输出一个X509格式的证书 
        3.10) -days
        X509证书的有效时间  
        3.11) -newkey rsa:bits 
        生成一个bits长度的RSA私钥文件,用于签发  
        3.12) -[digest]
        HASH算法
            3.12.1) md5
            3.12.2) sha1
            3.12.3) md2
            3.12.4) mdc2
            3.12.5) md4
        3.13) -config file   
        指定openssl配置文件
        3.14) -text: text显示格式
    example1: 利用CA的RSA密钥创建一个自签署的CA证书(X.509结构) 
    openssl req -new -x509 -days 3650 -key server.key -out ca.crt 
    example2: 用server.key生成证书签署请求CSR(这个CSR用于之外发送待CA中心等待签发)
    openssl req -new -key server.key -out server.csr
    example3: 查看CSR的细节
    openssl req -noout -text -in server.csr

    4) genrsa: 生成RSA参数
    openssl genrsa [args] [numbits]
        [args]
        4.1) 对生成的私钥文件是否要使用加密算法进行对称加密:
            4.1.1) -des: CBC模式的DES加密
            4.1.2) -des3: CBC模式的3DES加密
            4.1.3) -aes128: CBC模式的AES128加密
            4.1.4) -aes192: CBC模式的AES192加密
            4.1.5) -aes256: CBC模式的AES256加密
        4.2) -passout arg: arg为对称加密(des、3des、aes)的密码(使用这个参数就省去了console交互提示输入密码的环节)
        4.3) -out file: 输出证书私钥文件
        [numbits]: 密钥长度
    example: 生成一个1024位的RSA私钥,并用3DES加密(密码为1111),保存为server.key文件
    openssl genrsa -out server.key -passout pass:1111 -des3 1024 

    5) rsa: RSA数据管理
    openssl rsa [options] <infile >outfile
        5.1) -inform arg
        输入密钥文件格式:
            5.1.1) DER(ASN1)
            5.1.2) NET
            5.1.3) PEM(base64编码格式)
         5.2) -outform arg
         输出密钥文件格式
            5.2.1) DER
            5.2.2) NET
            5.2.3) PEM
        5.3) -in arg
        待处理密钥文件 
        5.4) -passin arg
        输入这个加密密钥文件的解密密钥(如果在生成这个密钥文件的时候,选择了加密算法了的话)
        5.5) -out arg
        待输出密钥文件
        5.6) -passout arg  
        如果希望输出的密钥文件继续使用加密算法的话则指定密码 
        5.7) -des: CBC模式的DES加密
        5.8) -des3: CBC模式的3DES加密
        5.9) -aes128: CBC模式的AES128加密
        5.10) -aes192: CBC模式的AES192加密
        5.11) -aes256: CBC模式的AES256加密
        5.12) -text: 以text形式打印密钥key数据 
        5.13) -noout: 不打印密钥key数据 
        5.14) -pubin: 检查待处理文件是否为公钥文件
        5.15) -pubout: 输出公钥文件
    example1: 对私钥文件进行解密
    openssl rsa -in server.key -passin pass:111 -out server_nopass.key
    example:2: 利用私钥文件生成对应的公钥文件
    openssl rsa -in server.key -passin pass:111 -pubout -out server_public.key

    6) x509:
    本指令是一个功能很丰富的证书处理工具。可以用来显示证书的内容,转换其格式,给CSR签名等X.509证书的管理工作
    openssl x509 [args]    
        6.1) -inform arg
        待处理X509证书文件格式
            6.1.1) DER
            6.1.2) NET
            6.1.3) PEM
        6.2) -outform arg   
        待输出X509证书文件格式
            6.2.1) DER
            6.2.2) NET
            6.2.3) PEM
        6.3) -in arg 
        待处理X509证书文件
        6.4) -out arg       
        待输出X509证书文件
        6.5) -req            
        表明输入文件是一个"请求签发证书文件(CSR)",等待进行签发 
        6.6) -days arg       
        表明将要签发的证书的有效时间 
        6.7) -CA arg 
        指定用于签发请求证书的根CA证书 
        6.8) -CAform arg     
        根CA证书格式(默认是PEM) 
        6.9) -CAkey arg      
        指定用于签发请求证书的CA私钥证书文件,如果这个option没有参数输入,那么缺省认为私有密钥在CA证书文件里有
        6.10) -CAkeyform arg  
        指定根CA私钥证书文件格式(默认为PEM格式)
        6.11) -CAserial arg   
        指定序列号文件(serial number file)
        6.12) -CAcreateserial 
        如果序列号文件(serial number file)没有指定,则自动创建它     
    example1: 转换DER证书为PEM格式
    openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem
    example2: 使用根CA证书对"请求签发证书"进行签发,生成x509格式证书
    openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
    example3: 打印出证书的内容
    openssl x509 -in server.crt -noout -text 

    7) crl: crl是用于管理CRL列表 
    openssl crl [args]
        7.1) -inform arg
        输入文件的格式
            7.1.1) DER(DER编码的CRL对象)
            7.1.2) PEM(默认的格式)(base64编码的CRL对象)
        7.2) -outform arg
        指定文件的输出格式 
            7.2.1) DER(DER编码的CRL对象)
            7.2.2) PEM(默认的格式)(base64编码的CRL对象)
        7.3) -text: 
        以文本格式来打印CRL信息值。
        7.4) -in filename
        指定的输入文件名。默认为标准输入。
        7.5) -out filename
        指定的输出文件名。默认为标准输出。
        7.6) -hash
        输出颁发者信息值的哈希值。这一项可用于在文件中根据颁发者信息值的哈希值来查询CRL对象。
        7.7) -fingerprint
        打印CRL对象的标识。
        7.8) -issuer
        输出颁发者的信息值。
        7.9) -lastupdate
        输出上一次更新的时间。
        7.10) -nextupdate
        打印出下一次更新的时间。 
        7.11) -CAfile file
        指定CA文件,用来验证该CRL对象是否合法。 
        7.12) -verify
        是否验证证书。        
    example1: 输出CRL文件,包括(颁发者信息HASH值、上一次更新的时间、下一次更新的时间)
    openssl crl -in crl.crl -text -issuer -hash -lastupdate –nextupdate 
    example2: 将PEM格式的CRL文件转换为DER格式
    openssl crl -in crl.pem -outform DER -out crl.der  

    8) crl2pkcs7: 用于CRL和PKCS#7之间的转换 
    openssl crl2pkcs7 [options] <infile >outfile
    转换pem到spc
    openssl crl2pkcs7 -nocrl -certfile venus.pem -outform DER -out venus.spc
    https://www.openssl.org/docs/apps/crl2pkcs7.html

    9) pkcs12: PKCS#12数据的管理
    pkcs12文件工具,能生成和分析pkcs12文件。PKCS#12文件可以被用于多个项目,例如包含Netscape、 MSIE 和 MS Outlook
    openssl pkcs12 [options] 
    http://blog.csdn.net/as3luyuan123/article/details/16105475
    https://www.openssl.org/docs/apps/pkcs12.html

    10) pkcs7: PCKS#7数据的管理 
    用于处理DER或者PEM格式的pkcs#7文件
    openssl pkcs7 [options] <infile >outfile
    http://blog.csdn.net/as3luyuan123/article/details/16105407
    https://www.openssl.org/docs/apps/pkcs7.html
 
2. openssl list-message-digest-commands(消息摘要命令)
    1) dgst: dgst用于计算消息摘要 
    openssl dgst [args]
        1.1) -hex           
        以16进制形式输出摘要
        1.2) -binary        
        以二进制形式输出摘要
        1.3) -sign file    
        以私钥文件对生成的摘要进行签名
        1.4) -verify file    
        使用公钥文件对私钥签名过的摘要文件进行验证 
        1.5) -prverify file  
        以私钥文件对公钥签名过的摘要文件进行验证
        verify a signature using private key in file
        1.6) 加密处理
            1.6.1) -md5: MD5 
            1.6.2) -md4: MD4         
            1.6.3) -sha1: SHA1 
            1.6.4) -ripemd160
    example1: 用SHA1算法计算文件file.txt的哈西值,输出到stdout
    openssl dgst -sha1 file.txt
    example2: 用dss1算法验证file.txt的数字签名dsasign.bin,验证的private key为DSA算法产生的文件dsakey.pem
    openssl dgst -dss1 -prverify dsakey.pem -signature dsasign.bin file.txt

    2) sha1: 用于进行RSA处理
    openssl sha1 [args] 
        2.1) -sign file
        用于RSA算法的私钥文件 
        2.2) -out file
        输出文件爱你
        2.3) -hex   
        以16进制形式输出
        2.4) -binary
        以二进制形式输出  
    example1: 用SHA1算法计算文件file.txt的HASH值,输出到文件digest.txt
    openssl sha1 -out digest.txt file.txt
    example2: 用sha1算法为文件file.txt签名,输出到文件rsasign.bin,签名的private key为RSA算法产生的文件rsaprivate.pem
    openssl sha1 -sign rsaprivate.pem -out rsasign.bin file.txt

3. openssl list-cipher-commands (Cipher命令的列表)
    1) aes-128-cbc
    2) aes-128-ecb
    3) aes-192-cbc
    4) aes-192-ecb
    5) aes-256-cbc
    6) aes-256-ecb
    7) base64
    8) bf
    9) bf-cbc
    10) bf-cfb
    11) bf-ecb
    12) bf-ofb
    13) cast
    14) cast-cbc
    15) cast5-cbc
    16) cast5-cfb
    17) cast5-ecb
    18) cast5-ofb
    19) des
    20) des-cbc
    21) des-cfb
    22) des-ecb
    23) des-ede
    24) des-ede-cbc
    25) des-ede-cfb
    26) des-ede-ofb
    27) des-ede3
    28) des-ede3-cbc
    29) des-ede3-cfb
    30) des-ede3-ofb
    31) des-ofb
    32) des3
    33) desx
    34) rc2
    35) rc2-40-cbc
    36) rc2-64-cbc
    37) rc2-cbc
    38) rc2-cfb
    39) rc2-ecb
    40) rc2-ofb
    41) rc4
    42) rc4-40

4. CA中心搭建、SSL证书生成过程

我们知道,用openSSL这个套件可以完成CA的搭建、SSL证书从生成到签发的全部过程,在使用openssl的指令的时候,我们需要记住几点:

使用这些特定的文件扩展名只是为了遵循某些约定俗称的规范,让人能一目了然。

2. openssl的指令之间具有一些功能上的重叠,所以我们会发现完成同样一个目的(例如SSL证书生成),往往可以使用看似不同的指令组达到目的

3. 理解CA、SSL证书最重要的不是记住这些openssl指令,而是要理解CA的运行机制,同时理解openssl指令的功能,从原理上去理解整个流程,就不会觉得模糊了

下面我们来一起学习一下怎么用openssl来完成一个CA的功能,并且签发一个apache可以使用的SSL证书

0x1: CA认证中心准备

我们首先要明白,要进行一个证书的签发工作,第一步要做的就是进行CA认证中心的准备工作,CA负责对请求证书(CSR)进行签名,有两种选择

1. 选择市场上公认的权威性的CA中心

http://www.webtrust.net/

2. GlobalSign
http://cn.globalsign.com/
http://globalsign.tbs-certificats.com/

3. GTE
http://certificate.fyicenter.com/335_Root_CA_GTE_CyberTrust_Global_Root_GTE_CyberTrust_Solutions.html

4. Nortel
http://www.nortel.com/

5. Verisign
http://www.verisign.com/

选择权威的CA进行证书签发的好处就是目前大多数的浏览器都会预装内置了这些权威CA的公钥证书,这样,在使用这些权威CA签发过的证书的时候,浏览器一般不会报风险提示

相反,如果我们的证书的签发机构不是一个权威机构,浏览器在访问的时候就会报风险提示

2. 本机搭建CA认证中心

我们同样可以使用openssl在本机搭建CA认证中心

1. 建立CA目录结构
按照OpenSSL的默认配置建立CA,需要在文件系统中建立相应的目录结构。相关的配置内容一般位于/usr/ssl/openssl.cnf内
-- demoCA/
    |-- index.txt
    |-- newcerts/
    |-- private/
    |-- serial
2. 生成CA证书的RSA密钥对
我们知道,要利用公钥机制,必要需要先建立密钥文件
3. 生成CA证书请求
4. 对CA证书请求进行自签名
(3、4两步可以合并执行)
*/
mkdir -p ./demoCA/{private,newcerts}
touch ./demoCA/index.txt
echo 01 > ./demoCA/serial
cp /usr/lib/ssl/openssl.cnf ./
openssl genrsa -out ./demoCA/private/cakey.pem 2048
openssl req -new -days 365 -key ./demoCA/private/cakey.pem -out careq.pem
..按照提示填写申请者身份信息..
//openssl中有些指令可以为一条指令(3、4步骤可以合并到以下一步完成)
openssl req -new -x509 -days 365 -key ./demoCA/private/cakey.pem -out ./demoCA/cacert.pem

0x2: 服务端证书准备

要配置apache的SSL通信,需要为apache配置服务端的"服务器根证书"

/*
1. 生成服务端证书的RSA密钥对
和根CA一样,生成服务端证书同样也是使用RSA机制,自然也需要为服务端生成一个RSA私钥文件(但不能和CA的一样)
2. 生成服务端证书请求
4. 查看刚才生成的请求签发证书
3. 使用CA根书对"服务端请求签发证书文件"进行签名 
*/
openssl genrsa -out serverkey.pem
openssl req -new -days 3650 -key serverkey.pem -out serverreq.pem
..填写证书申请者的身份信息..(common name不能为空,申请证书的countryName必须和CA的countryName相同)
openssl req -noout -text -in serverreq.pem
openssl ca -in serverreq.pem -out servercert.pem -config openssl.cnf
(如果在签发的时候遇到异常,记得到openssl.cnf配置文件中查看是否是配置项出了问题)

0x3: 配置apache的SSL证书

/*
1. 加载SSL模块
2. 配置apache的ports.conf文件
3. 设置site-enabled
4. 修改配置文件
5. 重启APACHE
*/
sudo a2enmod ssl
这条命令相当于
sudo ln -s /etc/apache2/mods-available/ssl.load /etc/apache2/mods-enabled
sudo ln -s /etc/apache2/mods-available/ssl.conf /etc/apache2/mods-enabled
如果没有a2enmod指令,也可直接在apache2.conf中设置SSL模块加载:
LoadModule ssl_module /usr/lib/apache2/modules/mod_ssl.so

vim /etc/apache2/ports.conf
加入443端口 
Listen 443

ln -s /etc/apache2/sites-available/default-ssl /etc/apache2/sites-enabled/001-ssl

vim /etc/apache2/sites-enabled/001-ssl
把端口改为443,在<Virtualhost>下加入SSL认证配置,其它的根据需要自己定制 与普通配置无异
NameVirtualHost *:443 
<VirtualHost *:443> 
SSLEngine on 
SSLCertificateFile /etc/apache2/ssl/servercert.pem
SSLCertificateKeyFile /etc/apache2/ssl/server.key
ServerAdmin webmaster@localhost 
DocumentRoot /var/www 
ServerName myServerName 
<Directory /> 
    Options FollowSymLinks 
    AllowOverride All 
</Directory> 
<Directory /var/www/> 
    Options FollowSymLinks MultiViews 
    AllowOverride None 
    Order allow,deny 
    allow from all 
# This directive allows us to have apache2's default start page 
# in /apache2-default/, but still have / go to the right place 
#RedirectMatch ^/$ /apache2-default/ 
</Directory>
</VirtualHost> 

cd /etc/apache2/ssl/
openssl genrsa -out server.key 1024
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 365 -in server.csr -signkey server.key -out servercert.pem 

/etc/init.d/apache2 restart

0x4: 配置客户端的SSL证书

客户端证书并不一定需要,只有在服务端配置了一个"验证客户端选项"的时候,才需要配置客户端证书,在大多数情况下都不需要客户端证书

整个CA架构如下图所示

 

posted on 2015-09-22 13:14  caroline_lc  阅读(971)  评论(0编辑  收藏  举报

导航