程序员

OpenSSL 相关整理

2017-10-17  本文已影响242人  58bc06151329

文前说明

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

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

1. PKI

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

1.1 PKI 的组成部分

1.2 完整的 PKI 包括

1.3 认证中心 CA

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

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

1.4 典型 CA 框架模型

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 公钥证书

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 的方式来通知各个相关方。

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)的技术标准,它描述了。

2.2.2 PKCS#12

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

2.3 X.500 和目录服务标准

规定了证书撤销列表存储

3. OpenSSL

3.1 OpenSSL 命令

3.1.1 标准命令 Standard commands

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
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
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 
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
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
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
openssl crl2pkcs7 [options] <infile >outfile

用例:转换 pem 到 spc。

openssl crl2pkcs7 -nocrl -certfile venus.pem -outform DER -out venus.spc
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

用例:用于处理 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

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

上一篇下一篇

猜你喜欢

热点阅读