美文网首页程序员
OpenSSL 相关整理

OpenSSL 相关整理

作者: 58bc06151329 | 来源:发表于2017-10-17 09:59 被阅读242次

    文前说明

    作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。

    本文仅供学习交流使用,侵权必删。
    不用于商业目的,转载请注明出处。

    1. PKI

    PKI (Public Key Infrastructure) 即 "公钥基础设施",是一种遵循既定标准的密钥管理平台,它能够为所有网络应用提供加密和数字签名等密码服务及所必需的密钥和证书管理体系,简单来说,PKI 就是利用公钥理论和技术建立的提供安全服务的基础设施。这个定义涵盖的内容比较宽,原则上说,任何以公钥技术为基础的安全基础设施都是 PKI。当然,没有好的非对称算法和好的密钥管理就不可能提供完善的安全服务,也就不能叫做 PKI。也就是说,该定义中已经隐含了必须具有的密钥管理功能。PKI 既不是一个协议,也不是一个软件,它是一个标准,在这个标准之下发展出的为了实现安全基础服务目的的技术统称为 PKI

    1.1 PKI 的组成部分

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

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

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

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

    • 自开发安全应用系统 是指各行业自开发的各种具体应用系统,例如银行、证券的应用系统等。

    1.2 完整的 PKI 包括

    • 认证政策的制定
      • 遵循的技术标准
      • 各 CA 之间的上下级或同级关系
      • 安全策略
      • 安全程度
      • 服务对象
      • 管理原则和框架
    • 认证规则
    • 运作制度的制定
    • 所涉及的各方法律关系内容
    • 技术的实现等

    1.3 认证中心 CA

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

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

    1.4 典型 CA 框架模型

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

      • 证书申请
      • 浏览
      • 证书撤消列表
      • 证书下载
    • CA 服务器 是整个证书机构的核心。负责下列功能。

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

      • 向 CA 转发安全服务器传输过来的证书申请请求
      • 向 LDAP 服务器和安全服务器转发 CA 颁发的数字证书和证书撤消列表。
    • LDAP 服务器 提供目录浏览服务,负责将注册机构服务器传输过来的用户信息以及数字证书加入到服务器上。这样其他用户通过访问 LDAP 服务器就能够得到其他用户的数字证书。

    • 数据库服务器 是认证机构中的核心部分。实际的的数据库系统应采用多种措施,如磁盘阵列、双机备份和多处理器等方式,以维护数据库系统的安全性、稳定性、可伸缩性和高性能。用于下列功能。

      • 认证机构中数据(如密钥和用户信息等)
      • 日志合统计信息的存储和管理

    2. SSL 证书

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

    2.1 X.509标准

    是 PKI 中最重要的标准,它定义了公钥证书的基本结构。是国际电信联盟-电信(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 标准基础上发展起来。包含 SSL 公钥证书和证书废除列表 CRL(Certificate revocation lists 证书黑名单)。

    2.1.1 SSL 公钥证书

    • 证书版本号(Version) 版本号指明 X.509 证书的格式版本,现在的值可以为。也为将来的版本进行了预定义。

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

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

      • 公开密钥算法
      • hash 算法,例如 sha1WithRSAEncryption,须向国际知名标准组织(如ISO)注册。
    • 签发机构名(Issuer) 此域用来标识签发证书的 CA 的 X.500 DN(DN-Distinguished Name)名字。

      • 国家(C)
      • 省市(ST)
      • 地区(L)
      • 组织机构(O)
      • 单位部门(OU)
      • 通用名(CN)
      • 邮箱地址
    • 有效期(Validity)指定证书的有效期,每次使用证书时,需要检查证书是否在有效期内。

      • 证书开始生效的日期时间
      • 证书失效的日期和时间
    • 证书用户名(Subject)

      • 国家(C)
      • 省市(ST)
      • 地区(L)
      • 组织机构(O)
      • 单位部门(OU)
      • 通用名(CN)
      • 邮箱地址
    • 证书持有者公开密钥信息(subject PublicKey Info)证书持有者公开密钥信息域包含两个重要信息。

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

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

    • 签名算法(Signature Algorithm) 证书签发机构对证书上述内容的签名算法。

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

    Certificate:
    Data:
    Version: 3 (0x2)
    Serial Number:
        b7:90:fc:87:f2:27:ec:1e
    Signature Algorithm: sha1WithRSAEncryption
    Issuer: C=ZH, ST=JS, L=WX, O=JN, OU=IOT, CN=XXX/emailAddress=xxxxx@xxxx.com
    Validity
        Not Before: May  7 05:25:14 2014 GMT
        Not After : May  4 05:25:14 2024 GMT
    Subject: C=ZH, ST=JS, L=WX, O=JN, OU=IOT, CN=XXX/emailAddress=xxxx@xxxx.com
    Subject Public Key Info:
        Public Key Algorithm: rsaEncryption
        RSA Public Key: (1024 bit)
        Modulus (1024 bit):
            00:c3:f2:9b:b8:20:3f:9e:c0:be:1d:18:a8:64:c0:
            47:79:71:bb:32:2e:63:43:af:da:01:bc:f3:f5:74:
            f8:29:4d:a8:ad:68:30:a4:bf:0a:42:71:8d:5f:58:
            c0:b1:97:a2:ae:e7:be:1e:6a:a7:d8:4a:14:f1:8f:
            67:f4:b3:64:45:88:a6:fa:ed:8f:9a:49:20:33:ca:
            dc:15:22:39:d9:40:02:1c:5f:4f:5b:1d:2c:ca:3d:
            30:8b:bc:07:0b:0f:58:03:6f:52:c7:0b:c4:54:59:
            cc:12:2a:4b:23:c6:98:fe:d3:80:a9:3f:d9:c0:1f:
            36:47:25:5a:72:fe:88:94:81
        Exponent: 65537 (0x10001)
    X509v3 extensions:
        X509v3 Subject Key Identifier: 
        88:11:74:9F:7C:12:9C:92:FD:81:33:18:D0:2C:04:64:0F:00:1D:64
        X509v3 Authority Key Identifier: 
        keyid:88:11:74:9F:7C:12:9C:92:FD:81:33:18:D0:2C:04:64:0F:00:1D:64
        DirName:/C=ZH/ST=JS/L=WX/O=JN/OU=IOT/CN=XXX/emailAddress=xxxx@xxxx.com
        serial:B7:90:FC:87:F2:27:EC:1E
    
        X509v3 Basic Constraints: 
        CA:TRUE
    Signature Algorithm: sha1WithRSAEncryption
    a1:6b:be:44:ba:2c:6f:88:c4:15:2d:27:0d:d7:60:0a:6a:c4:
    6d:6f:1c:83:b4:0f:af:af:be:f9:f1:3e:9c:1b:d7:0a:e2:7b:
    2b:70:96:d5:7e:90:51:1a:01:a3:36:7f:c3:2a:06:7a:f5:b1:
    dd:c9:c5:fc:f1:98:f6:45:f6:40:ce:8a:93:4a:4e:1d:8f:9e:
    2c:9f:8a:5c:d5:72:5a:0a:3e:f5:96:4b:2f:3d:ae:bf:55:50:
    99:14:4a:63:34:43:41:5a:41:6e:b1:ec:7f:9d:4b:f6:d8:18:
    ee:7a:10:5a:bc:d6:4b:5b:c4:0d:15:e3:23:cb:b2:63:03:62:
    48:af
    

    2.1.2 证书废除列表 CRL

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

    • CRL 的版本号

      • 0: 表示 X.509 V1 标准
      • 1: 表示 X.509 V2 标准
      • 2: 表示 X.509 V3 标准
    • 签名算法 用于指定证书签发机构用来对CRL内容进行签名的算法。

      • 算法标识
      • 算法参数
    • 证书签发机构名(签发机构的 DN 名)

      • 国家(C)
      • 省市(ST)
      • 地区(L)
      • 组织机构(O)
      • 单位部门(OU)
      • 通用名(CN)
      • 邮箱地址
    • 此次签发时间 此次 CRL 签发时间,遵循 ITU-T X.509 V2 标准的 CA 在 2049 年之前把这个域编码为 UTCTime 类型,在 2050 或 2050 年之后年之前把这个域编码为 GeneralizedTime 类型。

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

    • 用户公钥信息

      • 废除的证书序列号,要废除的由同一个 CA 签发的证书的一个唯一标识号,同一机构签发的证书不会有相同的序列号。
      • 证书废除时间
    • 签名算法 对 CRL 内容进行签名的签名算法。

    • 签名值 证书签发机构对 CRL 内容的签名值。

    Certificate Request:
        Data:
            Version: 0 (0x0)
            Subject: C=zh, ST=wx, L=js, O=jn, OU=iot, CN=XXX/emailAddress=xxxx@xxxx.com
            Subject Public Key Info:
                Public Key Algorithm: rsaEncryption
                RSA Public Key: (2048 bit)
                    Modulus (2048 bit):
                        00:be:2c:a4:fc:9f:f7:b3:2a:6b:c8:2f:ec:8d:59:
                        ba:12:ed:8e:c1:82:e0:6b:5d:12:99:ff:a1:54:3f:
                        64:d5:31:7f:26:b6:70:95:a7:1e:7f:89:77:3b:c9:
                        cd:00:7c:9a:cc:32:c9:2f:56:f5:36:8d:2b:65:d9:
                        73:0c:a8:6f:03:46:1e:97:76:66:5c:93:a4:2c:00:
                        99:0e:b0:38:e5:43:22:ae:6e:c6:0c:f7:b5:ef:59:
                        9b:c8:d3:af:5a:35:9b:78:1d:e3:bd:c5:7e:08:9e:
                        fc:de:73:fd:2a:fc:f6:11:97:ca:60:30:f4:37:0f:
                        e7:d6:b7:36:d4:84:3e:e2:81:02:27:24:96:16:6d:
                        da:97:7c:d9:bf:5b:79:51:f1:ba:4e:e9:17:44:1e:
                        7c:fe:2d:b3:ec:62:34:2b:4d:ce:84:49:9f:0a:ec:
                        1e:fe:ee:69:60:e5:14:73:cd:8f:3d:75:d7:d9:c5:
                        b3:dc:c6:d7:d2:df:e6:ba:3a:a3:da:97:dd:24:cf:
                        6b:e4:00:df:64:13:22:da:25:e2:4b:47:d3:12:39:
                        60:0e:ab:a3:bc:54:c9:c3:36:80:9d:e5:f0:be:83:
                        d4:b5:d4:73:70:15:42:6e:74:04:06:ab:12:3e:02:
                        45:1f:02:20:79:fd:b5:00:48:b1:78:f0:a7:76:a5:
                        94:2f
                    Exponent: 65537 (0x10001)
            Attributes:
                a0:00
        Signature Algorithm: sha1WithRSAEncryption
            82:1a:93:02:7d:42:02:91:7f:59:31:75:84:49:8a:d4:4a:90:
            ec:ad:c9:f7:3b:75:68:23:f4:d0:9b:de:ab:0e:4e:60:7c:46:
            be:26:35:38:68:6b:1e:d0:61:19:86:b2:b6:a6:94:5e:8a:c1:
            90:01:63:df:a7:c2:b0:79:75:bd:01:72:30:9a:08:21:83:82:
            51:e7:79:07:7b:c8:27:9d:fa:5d:38:89:3a:97:87:87:21:65:
            a7:00:3d:4b:c6:2f:ac:0c:45:57:8c:1a:bd:89:78:2b:7a:00:
            4d:48:09:c5:55:22:9e:92:6b:f9:c8:dd:8f:de:5c:61:c7:3d:
            20:6a:a3:6b:e5:32:00:2f:dd:68:d8:a5:66:be:19:fb:95:e1:
            e2:cc:18:1e:96:2e:e5:2f:58:d9:4c:f8:d5:92:1d:34:ed:79:
            52:a2:3d:02:2e:58:2f:86:d3:29:b7:5c:66:27:25:61:d3:0e:
            5e:86:77:12:0f:4f:12:3c:bf:95:85:5c:b7:77:05:11:9e:bb:
            06:ac:f8:cc:c3:42:84:f7:a7:84:b3:6c:fe:fe:66:92:31:32:
            dc:47:8d:a2:04:e0:2e:43:74:de:9f:03:c6:7e:f0:90:1d:0f:
            8a:f3:bc:5c:2c:5c:0b:db:d9:7d:69:05:31:a9:13:f4:18:1f:
            7d:69:f4:26
    

    2.2 PKCS 标准(公钥加密标准 Public Key Cryptography Standards, PKCS)

    定义了"数据通信协议"的主要标准。这些标准定义了如何恰当地格式化私钥或者公钥,之所以需要定义 PKCS 标准,是因为证书的产生并不是在本地用的,往往需要在网络中进行传输,因此需要有一个良好的规范来定义和保证证书在网络中的正常传输。

    2.2.1 PKCS#7

    由 RSA 安全体系在公钥加密系统中交换数字证书产生的一种加密标准,PKCS#7 为"密码信封封装标准",描述了密码操作(例如数字签名和数字信封)的数据的通用语法。该语法允许递归,例如一个数字信封可以嵌套在另一个数字信封里面,或者一个实体可以在一个已经封装的数据上签名。该语法同时允许添加任意属性,比如签名时间等。该标准和保密增强邮件(PEM)是兼容的,如果以 PEM 兼容形式构建,那么被签名后的数据和签名后又封装的数据内容可以很容易地被转化成 PEM 格式。这是一种将数据加密和签名(enveloping)的技术标准,它描述了。

    • 数字证书的语法
      • 其他加密消息
      • 数据加密
      • 数字签名的方法
      • 包含了算法
    • 常见的文件后缀
      • .P7B
      • .p7c
    • .SPC 文件中包含
      • 证书
      • CRL 列表信息
      • 没有私钥(注意)

    2.2.2 PKCS#12

    定义了一个用于保存私钥和对应公钥证书的文件格式,并由对称密钥加密保护。PKCS#12 通常采用 PFX,P12 作为文件扩展名。PKCS#12 文件可以存放多个证书,并由密码保护,通常用于
    WINDOWS IIS,也能够被当作 Java Keysotre 文件使用,用于 Tomcat,Resign,Weblogic,Jboss 等,不能被用于 Apache。

    • 常见的文件后缀
      • .PFX
      • .p12
    • 文件中包含
      • 证书(公钥)
      • 私钥(受密码保护(可选))
      • 完整的证书链信息

    2.3 X.500 和目录服务标准

    规定了证书撤销列表存储

    3. OpenSSL

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

      • 密码算法库
      • 常用的密钥和证书封装管理功能
      • SSL 通信API接口
      • 丰富的应用程序供测试或其它目的使用
    • 使用 OpenSSL 开发套件,可以完成以下功能。

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

    3.1 OpenSSL 命令

    3.1.1 标准命令 Standard commands

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

    用例:利用 CA 证书签署请求证书。前置条件为自建 CA。

    openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key
    
    • req 是 X.509 证书签发请求(CSR)管理。
    openssl req [options] <infile >outfile
    
    options 说明
    -inform arg 输入文件格式 DER 或 PEM。
    -outform arg 输出文件格式 DER 或 PEM。
    -in arg 待处理文件
    -out arg 待输出文件
    -passin 用于签名待生成的请求证书的私钥文件的解密密码。
    -key file 用于签名待生成的请求证书的私钥文件。
    -keyform arg DER、NET、PEM
    -new 新的请求
    -x509 输出一个 X509 格式的证书。
    -days X509 证书的有效时间。
    -newkey rsa:bits 生成一个 bits 长度的 RSA 私钥文件,用于签发。
    -[digest] HASH算法:md5、sha1、md2、mdc2、md4。
    -config file 指定 OpenSSL 配置文件。
    -text text 显示格式

    用例:利用 CA 的 RSA 密钥创建一个自签署的 CA 证书(X.509结构)。

    openssl req -new -x509 -days 3650 -key server.key -out ca.crt 
    

    用例: 用 server.key 生成证书签署请求 CSR(这个 CSR 用于之外发送待 CA 中心等待签发)。

    openssl req -new -key server.key -out server.csr
    

    用例:查看 CSR 的细节。

    openssl req -noout -text -in server.csr
    
    • genrsa 成 RSA 参数
    openssl genrsa [args] [numbits]
    
    args 说明
    -des CBC 模式的 DES 加密
    -des3 CBC 模式的 3DES 加密
    -aes128 CBC 模式的 AES128 加密
    -aes192 CBC 模式的 AES192 加密
    -aes256 CBC 模式的 AES256 加密
    -passout arg arg 为对称加密(des、3des、aes)的密码(使用这个参数就省去了 console 交互提示输入密码的环节)
    -out file 输出证书私钥文件

    numbits 为密钥长度。

    用例:生成一个 1024 位的 RSA 私钥,并用 3DES 加密(密码为1111),保存为 server.key 文件。

    openssl genrsa -out server.key -passout pass:1111 -des3 1024 
    
    • rsa RSA 数据管理
    openssl rsa [options] <infile >outfile
    
    options 说明
    -inform arg 输入密钥文件格式:DER(ASN1)、NET、PEM(base64 编码格式)
    -outform arg 输出密钥文件格式:DER、NET、PEM
    -in arg 待处理文件
    -out arg 待输出文件
    -passin arg 输入这个加密密钥文件的解密密钥(如果在生成这个密钥文件的时候,选择了加密算法了的话)
    -passout arg 如果希望输出的密钥文件继续使用加密算法的话则指定密码
    -des CBC 模式的 DES 加密
    -des3 CBC 模式的 3DES 加密
    -aes128 CBC 模式的 AES128 加密
    -aes192 CBC 模式的 AES192 加密
    -aes256 CBC 模式的 AES256 加密
    -text 以 text 形式打印密钥 key 数据
    -noout 不打印密钥 key 数据
    -pubin 检查待处理文件是否为公钥文件
    -pubout 输出公钥文件

    用例:对私钥文件进行解密。

    openssl rsa -in server.key -passin pass:111 -out server_nopass.key
    

    用例:利用私钥文件生成对应的公钥文件。

    openssl rsa -in server.key -passin pass:111 -pubout -out server_public.key
    
    • x509 是一个功能很丰富的证书处理工具。可以用来显示证书的内容,转换其格式,给 CSR 签名等 X.509 证书的管理工作。
    openssl x509 [args]
    
    args 说明
    -inform arg 待处理 X509 证书文件格式:DER、NET、PEM
    -outform arg 待输出 X509 证书文件格式:DER、NET、PEM
    -in arg 待处理 X509 证书文件
    -out arg 待输出 X509 证书文件
    -req 表明输入文件是一个 "请求签发证书文件(CSR)",等待进行签发
    -days arg 表明将要签发的证书的有效时间
    -CA arg 指定用于签发请求证书的根 CA 证书
    -CAform arg 根 CA 证书格式(默认是 PEM 格式)
    -CAkey arg 指定用于签发请求证书的 CA 私钥证书文件,如果这个 option 没有参数输入,那么缺省认为私有密钥在 CA 证书文件里有
    -CAkeyform arg 指定根 CA 私钥证书文件格式(默认为 PEM 格式)
    -CAserial arg 指定序列号文件(serial number file)
    -CAcreateserial 如果序列号文件(serial number file)没有指定,则自动创建它

    用例:转换 DER 证书为 PEM 格式。

    openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem
    

    用例:使用根 CA 证书对 "请求签发证书" 进行签发,生成 x509 格式证书。

    openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
    

    用例:打印出证书的内容。

    openssl x509 -in server.crt -noout -text
    
    • crl 是用于管理 CRL 列表。
    openssl crl [args]
    
    args 说明
    -inform arg 输入文件的格式:DER(DER 编码的 CRL 对象)、PEM(默认的格式)(base64 编码的 CRL 对象)
    -outform arg 指定文件的输出格式:DER(DER 编码的 CRL 对象)、PEM(默认的格式)(base64 编码的 CRL 对象)
    -text 以文本格式来打印 CRL 信息值。
    -in filename 指定的输入文件名。默认为标准输入。
    -out filename 指定的输出文件名。默认为标准输出。
    -hash 输出颁发者信息值的哈希值。这一项可用于在文件中根据颁发者信息值的哈希值来查询 CRL 对象。
    -fingerprint 打印 CRL 对象的标识。
    -issuer 输出颁发者的信息值。
    -lastupdate 输出上一次更新的时间。
    -nextupdate 打印出下一次更新的时间。
    -CAfile file 指定 CA 文件,用来验证该 CRL 对象是否合法。
    -verify 是否验证证书。

    用例:输出 CRL 文件,包括(颁发者信息 hash 值、上一次更新的时间、下一次更新的时间)。

    openssl crl -in crl.crl -text -issuer -hash -lastupdate –nextupdate 
    

    用例:将 PEM 格式的 CRL 文件转换为 DER 格式。

    openssl crl -in crl.pem -outform DER -out crl.der
    
    • crl2pkcs7 用于 CRL 和 PKCS#7 之间的转换。
    openssl crl2pkcs7 [options] <infile >outfile
    

    用例:转换 pem 到 spc。

    openssl crl2pkcs7 -nocrl -certfile venus.pem -outform DER -out venus.spc
    
    • pkcs12 PKCS#12 数据的管理,pkcs12 文件工具,能生成和分析 pkcs12 文件。PKCS#12 文件可以被用于多个项目,例如包含 Netscape、 MSIE 和 MS Outlook。
    openssl pkcs12 [options] 
    

    分析选项

    options 说明
    -in filename 指定私钥和证书读取的文件,默认为标准输入。必须为 PEM 格式。
    -out filename 指定输出的 pkcs12 文件,默认为标准输出。
    -password arg 指定导入导出口令来源。
    -passin arg 输入文件保护口令来源。
    -passout arg 指定所有输出私钥保护口令来源。
    -noout 不打印参数编码的版本信息。
    -clcerts 仅仅输出客户端证书,不输出 CA 证书。
    -cacerts 仅仅输出 CA 证书,不输出客户端证书。
    -nocerts 不输出任何证书。
    -nokeys 不输出任何私钥信息值。
    -info 输出 PKCS#12 文件结构的附加信息值。例如用的算法信息以及迭代次数。
    -des 在输出之前用 DES 算法加密私钥值。
    -des3 在输出之前用 3DES 算法加密私钥值。此项为默认。
    -idea 在输出之前用 IDEA 算法加密私钥值。
    -aes128、-aes192、-aes256 在输出之前用 AES 算法加密私钥值。
    -camellia128、-camellia192、-camellia256 在输出之前用 camellia 算法加密私钥值。
    -nodes 一直对私钥不加密。
    -nomacver 读取文件时不验证 MAC 值的完整性。
    -twopass 需要用户分别指定 MAC 口令和加密口令。

    文件创建选项

    options 说明
    -export 这个选项指定了一个 PKCS#12 文件将会被创建。
    -in filename 指定私钥和证书读取的文件,默认为标准输入。必须为PEM格式。
    -out filename 指定输出的 pkcs12 文件,默认为标准输出。
    -inkey filename 指定私钥文件的位置。如果没有被指定,私钥必须在 -in filename 中指定。
    -name name 指定证书以及私钥的友好名字。当用软件导入这个文件时,这个名字将被显示出来。
    -certfilefilename 添加 filename 中所有的证书信息值。
    -caname name 指定其它证书的友好名字。这个选项可以被用于多次。
    -password arg 指定导入导出口令来源。
    -passin arg 输入文件保护口令来源。
    -passout arg 指定所有输出私钥保护口令来源。
    -chain 如果这个选项被提出,则添加用户证书的证书链。标准 CA 中心用它来搜索。如果搜索失败,则是一个重大的错误。
    -descert 用 3DES 对 PKCS12 进行加密,这样可能会导致 PKCS12 文件被一些 “export grade” 软件不能够读取。默认的是用 3DES 对私钥文件进行加密,用 40 位的 RC2 对证书公钥文件进行加密。
    -certpbealg 该选项允许指定证书的加密算法。任何 PKCS#5 v1.5 或 PKCS#12 PBE 类型的算法都可以被使用。默认使用的是 40 位的 RC2。
    -keypbe alg 该选项允许指定证书私钥的加密算法。任何 PKCS#5 v1.5 或 PKCS#12 PBE 类型的算法都可以被使用。默认使用的是 3DES。
    -keyex 设置私钥仅仅被用于密钥交换。
    -keysig 设置私钥仅仅被用于数字签名。
    -macalg digest 指定 MAC 摘要算法。如果没有被指定,则默认使用 sha1。
    -nomaciter、-noiter 这个选项影响 MAC 值和密钥算法的迭代次数。除非你希望产生的文件能与 MSIE 4.0 相兼容,可以把这两个选项丢弃一边。
    -maciter 加强完整性保护,多次计算 MAC。
    -nomac 不去规定 MAC 值的完整性。
    -rand file(s) 指定随机数种子文件,多个文件间用分隔符分开,windows 用 “;”,OpenVMS用 “,“,其他系统用 “:”。
    -CApatharg 指定 CA 目录。该目录必须是一个标准证书目录:每个 CA 文件的文件名为 XXXX.0,XXXX 为其持有者摘要值。
    -CAfile arg 指定 CA 文件。
    -LMK 添加本地的机械属性到私钥中。
    -CSP name 微软的 CSP 的名字。
    -engine id 指定硬件引擎。

    用例:分析一个 PKCS#12 文件和输出到文件中。

    openssl pkcs12 -in file.p12 -out file.pem 
    

    用例:仅仅输出客户端证书到文件中。

    openssl pkcs12 -in file.p12 -clcerts -out file.pem
    

    用例:不加密私钥文件。

    openssl pkcs12 -in file.p12 -out file.pem -nodes
    

    用例:打印 PKCS#12 格式的信息值。

    openssl pkcs12 -in file.p12 -info -noout
    

    用例:生成 pkcs12 文件,但不包含 CA 证书。

    openssl pkcs12 -export -inkey ocspserverkey.pem -in ocspservercert.pem  -out ocspserverpkcs12.pfx
    

    用例:生成 pcs12 文件,包含 CA 证书。

    openssl pkcs12 -export -inkey ocspserverkey.pem -in ocspservercert.pem -CAfile demoCA/cacert.pem -chain -out ocsp1.pfx
    

    用例:将 pcks12 中的信息分离出来,写入文件。

    openssl pkcs12 –in ocsp1.pfx -out certandkey.pem 
    

    用例:显示 pkcs12 信息。

    openssl pkcs12 –in ocsp1.pfx -info
    
    • pkcs7 PCKS#7 数据的管理。

    用例:用于处理 DER 或者 PEM 格式的 pkcs#7 文件。

    openssl pkcs7 [options] <infile >outfile
    
    options 说明
    -inform 输入文件格式,DER 或者 PEM 格式。DER 格式采用 ASN1 的 DER 标准格式。一般用的多的都是 PEM 格式,就是 base64 编码格式。
    -outform 输出文件格式,DER 或者 PEM 格式。
    -in filename 输入的需要处理的文件,默认为标准输入。
    -out filename 输出文件,默认为标准输出。
    -print 打印出 pkcs7 的所有信息值。
    -print_certs 打印证书或 CRL 信息,在一行中打印出持有者和颁发者。
    -text 打印证书相关信息。
    -noout 不打印证书信息值。
    -engine id 指定硬件引擎。

    用例:把一个 PKCS#7 文件从 PEM 格式转换成 DER 格式。

    openssl pkcs7 -in file.pem -outform DER -out file.der
    

    用例:打印文件所有证书。

    openssl pkcs7 -in file.pem -print_certs -out certs.pem
    

    消息摘要命令 Message Digest Commands

    • dgst 用于计算消息摘要。
    openssl dgst [-算法名称] [-其他选项] inputfile
    
    算法名称 说明
    -md5 MD5 加密处理
    -md4 MD4 加密处理
    -sha1 SHA1 加密处理
    -ripemd160 ripemd160 算法
    -mdc2 用mdc2算法进行摘要。
    -sha 用 sha 算法进行摘要。
    -sha224 用 sha 算法进行摘要。
    -dss1 用 dss1 算法进行摘要。
    -dss1 用 whirlpool 算法进行摘要。
    其他选项 说明
    -hex 以 16 进制形式输出摘要
    -binary 以二进制形式输出摘要
    -sign file 以私钥文件对生成的摘要进行签名
    -verify file 使用公钥文件对私钥签名过的摘要文件进行验证
    -prverify file 以私钥文件对公钥签名过的摘要文件进行验证
    -out file 输出到指定文件
    -c 打印出两个哈希结果的时候用冒号来分隔开。仅仅设置了 -hex 的时候有效。
    -r 用 coreutils 格式来输出摘要值。
    -rand file 产生随机数种子的文件。
    -d 打印出 BIO 调试信息值。

    用例:用 SHA1 算法计算文件 file.txt 的哈西值,输出到 stdout。

    openssl dgst -sha1 file.txt
    

    用例:用 dss1 算法验证 file.txt 的数字签名 dsasign.bin,验证的 private key 为 DSA 算法产生的文件 dsakey.pem。

    openssl dgst -dss1 -prverify dsakey.pem -signature dsasign.bin file.txt
    
    RSA 密钥签名验签

    生成RSA密钥对。

    openssl genrsa -out rsa_private.key
    

    由公钥导出私钥。

    openssl rsa -in rsa_private.key -pubout -out rsa_public.key
    

    用 RSA 私钥对 SHA1 计算得到的摘要值签名。

    openssl dgst -sign rsa_private.key -sha1 -out sha1_rsa_file.sign file.txt
    

    用相应的公钥和相同的摘要算法进行验签,否则会失败,也可以使用相同的私钥和相同的摘要算法进行验证。

    openssl dgst -verify rsa_public.key -sha1 -signature sha1_rsa_file.sign file.txt
    
    DSA 密钥对签名验签

    生成DSA参数。

    openssl dsaparam -out dsa.param 1024
    

    由 DSA 参数产生 DSA 私钥。

    openssl gendsa -out dsa_private.key dsa.param
    

    由 DSA 私钥生成 DSA 公钥。

    openssl dsa -in dsa_private.key -out dsa_public.key -pubout
    

    用 DSA 私钥对 SHA384 计算的摘要值进行签名。

    openssl dgst -sign dsa_private.key -sha384 -out sha384_dsa.sign file.txt
    

    用相应的公钥和摘要算法进行验签。

    openssl dgst -verify dsa_public.key -sha384 -signature sha384_dsa.sign file.txt
    

    用相同的私钥和摘要算法验签。

    openssl dgst -prverify dsa_private.key -sha384 -signature sha384_dsa.sign file.txt
    
    HMAC

    HMAC 是密钥相关的哈希运算消息认证码,HMAC 运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。

    openssl dgst -md5 -hmac "asfdsdfsg" file.txt
    

    参考资料

    http://blog.csdn.net/scuyxi/article/details/54884976
    http://blog.csdn.net/scuyxi/article/details/55002130

    相关文章

      网友评论

        本文标题:OpenSSL 相关整理

        本文链接:https://www.haomeiwen.com/subject/bfwluxtx.html