openssl是目前最流行的SSL密码库工具,其提供了一个通用、健壮、功能完备的工具套件,用以支持SSL/TLS协议的实现。官网:https://www.openssl.org/source/。其主要有以下借个部分构成:

  • 密码算法库

  • 秘钥和证书封装管理功能

  • SSL通信API接口

主要用途有:

  • 建立 RSA、DH、DSA key 参数

  • 建立X.509证书、证书签名请求(CSR)和CRLs(证书回收列表)

  • 计算消息摘要

  • 使用各种Cipher加密/解密

  • SSL/TLS客户端以及服务器的测试

  • Https/MIME或者邮件加密

1. 密钥、证书请求、证书概要说明

在证书申请签发过程中,客户端涉及到秘钥、证书请求、证书这几个概念,初学者可能会搞不清楚这三者的关系。我们以申请证书的流程说明三者的关系。客户端(相对于CA)在申请证书的时候,大体上有三个步骤:

第一步:  生成客户端的额秘钥, 即客户端的公私钥对,切要保证私钥只有客户端自己拥有。

第二步: 以客户端的秘钥和客户端的自身信息(国家、机构、域名、邮箱等)为输入,生成证书请求文件。其中客户端公钥和客户端信息是明文保存在证书请求文件中的;
        而客户端私钥的作用是对客户端公钥及客户端信息做签名,自身是不包含在证书请求中的。然后把证书请求文件发送给CA机构。
(注意: 这里明文的意思是指没必要加密,用户可以明文形式保存在证书请求文件中,具体做法是生成证书请求时添加-pubkey选项)

第三步: CA机构接收到客户端的证书请求文件后,首先校验其签名,然后审核客户端的信息,最后CA机构使用自己的私钥为证书请求文件签名,生成证书文件,下发给客户端。
        此证书就是客户端的身份证,来表明用户的身份。

至此客户端申请证书流程结束,其中涉及到证书签发机构CA,CA是被绝对信任的机构。如果把客户端证书比作用户身份证,那么CA就是颁发身份证的机构,我们以https为例说明证书的用处:

为了数据传输安全,越来越多的网站启用https。在https握手阶段,服务器首先把自己的证书发送给用户(浏览器),浏览器查看证书中的发证机构,然后在机器内置的证书中(在PC机或者手机上,内置了世界上著名的CA机构的证书)查找对应的CA证书,然后使用内置的证书公钥校验服务器证书的真伪。如果校验失败,浏览器会提示服务器证书有问题,询问用户是否继续。

例如12306网站,它使用自签名的证书,所以浏览器会提示证书有问题,在12306的网站上有提示下载安装根证书,其用户就是把该根证书安装到用户的内置证书中,这样浏览器就不会报证书错误。但是注意,除非特别相信某个机构,否则不要在机器上随便导入证书,很危险。

2. openssl安装

这里我们讲述一下Openssl的源代码安装(Centos7.4):

1) 下载源代码

到openssl官方网站:https://www.openssl.org/source/,下载稳定版本的openssl。当前稳定版本为1.1.0:

# wget https://www.openssl.org/source/openssl-1.1.0g.tar.gz
# tar -zxvf openssl-1.1.0g.tar.gz
# cd openssl-1.1.0g/

2) 编译

# mkdir -p /usr/local/openssl
# ./config -fPIC --prefix=/usr/local/openssl/ enable-shared   

# make
# make install
# ls /usr/local/openssl
bin  include  lib  share  ssl

这里:

  • --prefix:指定安装目录

  • -fPIC:编译openssl的静态库

  • enable-shared:编译动态库

3) 查看openssl依赖关系

# /usr/local/openssl/bin/openssl --help
/usr/local/openssl/bin/openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
# ldd /usr/local/openssl/bin/openssl 
        linux-vdso.so.1 =>  (0x00007ffc0d5f6000)
        libssl.so.1.1 => not found
        libcrypto.so.1.1 => not found
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f819423a000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f819401e000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f8193c5c000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f8194454000)

这里我们看到,有一些库并没有找到。因此这里我们需要设定环境变量:

# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/openssl/lib
# /usr/local/openssl/bin/openssl --help
Invalid command '--help'; type "help" for a list.

因为这里我们系统中有另外一个openssl,这里我们就不真正把该路径配置到配置文件中了:

# which openssl
/usr/bin/openssl

3. 示例

3.1 RSA秘钥操作

默认情况下,openssl输出格式为: PKCS#1-PEM

1) 生成RSA私钥(无加密)

# openssl genrsa -out rsa_private.key 2048
Generating RSA private key, 2048 bit long modulus
..............................+++
..........................................+++
e is 65537 (0x10001)

//生成的私钥文件
# ls
rsa_private.key

2) 生成RSA公钥

# openssl rsa -in rsa_private.key -pubout -out rsa_public.key
writing RSA key

# ls
rsa_private.key  rsa_public.key

3) 生成RSA私钥(使用aes256加密)

因为有时候我们不想别人看到我们的明文私钥,这时候我们可以对产生的RSA私钥进行加密。这样即使我们的私钥加密文件泄露,私钥还是安全的:

# openssl genrsa -aes256 -passout pass:111111 -out rsa_aes_private.key 2048
Generating RSA private key, 2048 bit long modulus
............+++
.........................+++
e is 65537 (0x10001)

# ls
rsa_aes_private.key  

其中 passout 代替shell 进行密码输入,否则会提示输入密码。此时如果基于此,要生成公钥,需要提供密码:

# openssl rsa -in rsa_aes_private.key -passin pass:111111 -pubout -out rsa_public.key

3.2 openssl转换命令

1) 对加密的私钥进行解密

首先我们使用aec256方法,产生一个加密的私钥,然后再对其进行解密:

# ls

# openssl genrsa -aes256 -passout pass:111111 -out rsa_aes_private.key 2048         //产生加密私钥
# ls
rsa_aes_private.key

# openssl rsa -in rsa_aes_private.key -passin pass:111111 -out rsa_private.key     //解密后的私钥
writing RSA key
# ls
rsa_aes_private.key  rsa_private.key

2) 对明文私钥进行加密

这里我们对上文解密后的私钥rsa_private.key再进行手动加密,看得出的结果是否与原来的rsa_aes_private.key一致:

# ls

# openssl genrsa -out rsa_private.key 2048                        //产生明文私
Generating RSA private key, 2048 bit long modulus
............................................+++
................................................................+++
e is 65537 (0x10001)

# openssl rsa -in rsa_private.key -aes256 -passout pass:111111 -out rsa_aes_private.key    //对明文私钥进行加密
writing RSA key
# ls
rsa_aes_private.key  rsa_private.key

#  openssl rsa -in rsa_aes_private.key -passin pass:111111 -out rsa_private_2.key          //在对加密后的私钥进行解密
writing RSA key

# diff rsa_private.key rsa_private_2.key                                //对比,发现一模一样

3) 私钥PEM转DER

默认产生的公、私钥都是PEM格式的,现在转换成DER格式:

#ls

# openssl genrsa -out rsa_private.key 2048                              //产生一个明文私钥
# openssl rsa -in rsa_private.key -outform der -out rsa_private.der     //转换成DER格式
writing RSA key

# ls
rsa_private.der  rsa_private.key

4) 查看私钥明细

# openssl genrsa -out rsa_private.key 2048         //产生一个明文私钥
# openssl rsa -in rsa_private.key -noout -text
Private-Key: (2048 bit)
modulus:
    00:bf:3b:ce:56:56:3b:f9:16:8c:31:6e:6d:1d:10:
    b1:3b:57:34:99:e9:f0:10:aa:06:a6:a7:de:59:23:
    cb:09:ab:31:e9:b0:e7:ab:a1:30:9c:32:8d:9f:a0:
    c2:a3:e7:3e:f6:76:26:a5:14:56:56:04:cb:5e:3a:
    c7:84:f2:51:1a:53:09:dd:91:5c:24:e7:53:25:bb:
    ed:51:0e:6d:04:71:4b:bb:58:86:26:d2:bd:c4:bc:
    f7:7e:dc:ef:79:ed:b6:00:e7:d4:25:dc:10:5f:27:
    7d:51:8b:1b:b4:36:80:4d:8a:3c:28:6f:71:f4:92:
    3a:65:de:17:2a:92:d4:03:7a:2d:46:b2:3c:c1:cf:

.....

这里将-in参数替换成-pubin参数,就可以查看公钥明细.

5) 私钥PKCS#1转PKCS#8

# openssl genrsa -out rsa_private.key 2048         //产生一个明文私钥(传统私钥格式PKCS#1,即rsa)
# openssl pkcs8 -topk8 -in rsa_private.key -passout pass:111111 -out pkcs8_private.key  (rsa转PKCS#8)

其中-passout指定了密码,输出的pkcs8格式密钥为加密形式,pkcs8默认采用des3 加密算法。使用-nocrypt参数可以输出无加密的pkcs8密钥,如下:

# openssl pkcs8 -topk8 -in rsa_private.key -nocrypt -out nocrypt_pkcs8_private.key

3.3 生成自签名证书

1) 生成RSA私钥和自签名证书

# openssl req -newkey rsa:2048 -nodes -keyout rsa_private.key -x509 -days 365 -out cert.crt
Generating a 2048 bit RSA private key
............+++
.........................................................+++
writing new private key to 'rsa_private.key'
-----
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) []:Guangdong
Locality Name (eg, city) [Default City]:Shenzhen
Organization Name (eg, company) [Default Company Ltd]:test_company
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) []:test_name
Email Address []:11111111@qq.com

# ls
cert.crt  rsa_private.key

上面我们输入了:

  • Country Name

  • State/Province Name

  • Locality Name(Default city)

  • Organizational Name(Default Company Ltd)

  • Organizational Unit name(section)

  • Common Name(your name or your server’s hostname)

  • Email Address

如果想要省去这些输入,可以用-subj选项:

# openssl req -newkey rsa:2048 -nodes -keyout rsa_private.key -x509 -days 365 -out cert.crt -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=test_company/OU=IT/CN=test_name/emailAddress=11111111@qq.com"

我们再对上面的命令做一个简单的说明: req是证书请求的子命令,-newkey rsa:2048 -keyout private_key.pem 表示生成私钥(PKCS8格式),-nodes 表示私钥不加密,若不带参数将提示输入密码; -x509表示输出证书,-days365 为有效期。


2) 使用 已有RSA 私钥生成自签名证书

# openssl genrsa -out rsa_private.key 2048     //产生一个明文私钥
# openssl req -new -x509 -days 365 -key rsa_private.key -out cert.crt -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=test_company/OU=IT/CN=test_name/emailAddress=11111111@qq.com"
# ls
cert.crt  rsa_private.key

-new指生成证书请求,加上-x509 表示直接输出证书,-key指定私钥文件,其余选项与上述命令相同

3.4 生成签名求情及CA签名

1) 使用RSA私钥生成CSR签名请求

# openssl genrsa -aes256 -passout pass:111111 -out server.key 2048      //生成aes256加密的rsa私钥
# ls
server.key

# openssl req -new -key server.key  -out server.csr                //生成CSR签名请求
Enter pass phrase for server.key:
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) []:Guangdong
Locality Name (eg, city) [Default City]:Shenzhen
Organization Name (eg, company) [Default Company Ltd]:test_company
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) []:test_name
Email Address []:11111111@qq.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

# ls
server.csr  server.key

如上分别输入了解密server.key的密码111111; 然后是subject主题信息;再接着会要求输入一个challenge密码(此密码可以为空)。也可以采用如下命令,简化输入:

# openssl genrsa -aes256 -passout pass:111111 -out server.key 2048 

# openssl req -new -key server.key -passin pass:111111 -out server.csr -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=test_company/OU=IT/CN=test_name/emailAddress=11111111@qq.com"

注意这里可以增加-pubkey选项,使客户端公钥和客户信息明文保存在证书请求文件中:

# openssl genrsa -aes256 -passout pass:111111 -out server.key 2048 
# openssl req -new -key server.key -passin pass:111111 -out server.csr -pubkey -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=test_company/OU=IT/CN=test_name/emailAddress=11111111@qq.com"

此时生成的 csr签名请求文件可提交至 CA进行签发

2) 查看CSR 的细节

# cat server.csr
-----BEGIN CERTIFICATE REQUEST-----
MIIC0jCCAboCAQAwgYwxCzAJBgNVBAYTAkNOMRIwEAYDVQQIDAlHdWFuZ2Rvbmcx
ETAPBgNVBAcMCFNoZW56aGVuMRUwEwYDVQQKDAx0ZXN0X2NvbXBhbnkxCzAJBgNV
BAsMAklUMRIwEAYDVQQDDAl0ZXN0X25hbWUxHjAcBgkqhkiG9w0BCQEWDzExMTEx
MTExQHFxLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMjMzntn
V8IeDtOq78iVnaUtrtEfho2ugzD3ozV7/YQVwpj8NLK8tNKzL84kqENBFDExWGZv
eo1/eSpxrSOE36QLrjlizhT365B9bRXUyqlg53J6EvecVxCmhTfaYNIu0LVtJSdw
IGhBjjfOL004xPkwOvaGvQs149G6lADH+lIJPJVlOPb3OcLoZUJka96c4699REmI
M9RJIGuiltix7TLLrQhjRh9U/jAO/s9K7VdezAzO2N+7ObY27I9HHhjmZ9wPMPlJ
Ffo20kpGRgdwc8VOPmAxtvBe8e9ih9NcS1SH5KyQH9z1sCU9WnIz2BEwI1OiW4/6
Nr+jW5DyYl0wiT8CAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4IBAQBZj3eFle1V3UQO
wlh7oyez/lNpf1W/bO3FIVb8hJhFmnGTIOdypT2t5wSJpChOKqSn2D6Jyd91ccd6
9FvXISA5s0Jkq8pmgLbt3cjQ2civFhCI0meX7FGGO3ArwWsbbiGJWZqZuxfZWWr6
oKuOtYq7EWie2dcz4rSpiVc3twfU4+vuInOIUGM5jTCsVRalHqcms1WwOBrP6+Vu
i2kMzA51FSfmB71x69MT41bYDwn40D3EDRdF9d9ly8v+TGAY84BIoyW+qwOkFd7r
8o+IwQsoVA4QJzsr9yoPB3m5aF+rDJf4mU1/UwNTOjCKgx/SqT1TI/j7tPsguQ0K
YapUplH4
-----END CERTIFICATE REQUEST-----

# openssl req -noout -text -in server.csr

3) 使用 CA 证书及CA密钥 对请求签发证书进行签发,生成 x509证书

//首先我们产生一个自签名的CA证书及CA秘钥
# openssl req -newkey rsa:2048 -nodes -keyout rsa_private.key -x509 -days 365 -out cert.crt -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=test_company/OU=IT/CN=ivan1001/emailAddress=1181891136@qq.com"
Generating a 2048 bit RSA private key
......................................+++
...+++
writing new private key to 'rsa_private.key'
-----
# ls
cert.crt  rsa_private.key  server.csr  server.key


//然后采用上述自签名的CA证书及CA秘钥,对请求签发证书进行签发
# openssl x509 -req -days 3650 -in server.csr -CA cert.crt -CAkey rsa_private.key -passin pass:111111 -CAcreateserial -out server.crt
Signature ok
subject=/C=CN/ST=Guangdong/L=Shenzhen/O=test_company/OU=IT/CN=test_name/emailAddress=11111111@qq.com
Getting CA Private Key
# ls
cert.crt  cert.srl  rsa_private.key  server.crt  server.csr  server.key


//用CA根证书对我们签发的x509证书进行校验
# openssl verify -CAfile cert.crt server.crt 
server.crt: OK

其中CAxxx选项用于指定CA参数输入。上面我们对server.csr进行了签发,生成了server.crt x509证书。(注意这里-CAkey是证书签发机构的私钥)

3.5 证书查看及转换

1) 查看证书细节

# openssl x509 -in cert.crt -noout -text           //查看我们上面产生的自签名证书细节
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            d0:81:5a:0e:1f:64:77:92
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=CN, ST=Guangdong, L=Shenzhen, O=test_company, OU=IT, CN=ivan1001/emailAddress=1181891136@qq.com
        Validity
            Not Before: Mar 23 02:17:39 2018 GMT
            Not After : Mar 23 02:17:39 2019 GMT
        Subject: C=CN, ST=Guangdong, L=Shenzhen, O=test_company, OU=IT, CN=ivan1001/emailAddress=1181891136@qq.com
        Subject Public Key Info:

# openssl x509 -in server.crt -noout -text         //查看我们上面产生的CA签名证书细节
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            d6:81:fa:f4:ad:fd:48:19
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=CN, ST=Guangdong, L=Shenzhen, O=test_company, OU=IT, CN=ivan1001/emailAddress=1181891136@qq.com
        Validity
            Not Before: Mar 23 02:19:12 2018 GMT
            Not After : Mar 20 02:19:12 2028 GMT
        Subject: C=CN, ST=Guangdong, L=Shenzhen, O=test_company, OU=IT, CN=test_name/emailAddress=11111111@qq.com
        Subject Public Key Info:

2) 转换证书编码格式

# openssl x509 -in cert.crt -inform PEM -outform DER -out cert.der
# ls
cert.crt  cert.der  cert.srl  rsa_private.key  server.crt  server.csr  server.key

默认产生的证书格式是PEM格式。

3) 合成 pkcs#12 证书(含私钥)

  • 将 pem 证书和私钥转 pkcs#12 证书
//将server的pem证书和私钥进行转换
# openssl pkcs12 -export -in server.crt -inkey server.key -passin pass:111111 -password pass:111111 -out server.p12
# ls
cert.crt  cert.der  cert.srl  rsa_private.key  server.crt  server.csr  server.key  server.p12

//将自签名的pem证书和私钥进行转换(因为这里自签名的pem证书并没有密码,因此这里不需要-passin选项)
# openssl pkcs12 -export -in cert.crt -inkey rsa_private.key  -password pass:111111 -out cert.p12
# ls
cert.crt  cert.der  cert.p12  cert.srl  rsa_private.key  server.crt  server.csr  server.key  server.p12

其中-export指导出pkcs#12 证书,-inkey 指定了私钥文件,-passin 为私钥(文件)密码(nodes为无加密),-password 指定 p12文件的密码(导入导出)

  • 将pem 证书和私钥/CA 证书 合成pkcs#12 证书
# openssl pkcs12 -export -in server.crt -inkey server.key -passin pass:111111 -chain -CAfile cert.crt -password pass:111111 -out server-all.p12
# ls
cert.crt  cert.der  cert.p12  cert.srl  rsa_private.key  server-all.p12  server.crt  server.csr  server.key  server.p12

其中-chain指示同时添加证书链,-CAfile 指定了CA证书,导出的p12文件将包含多个证书。(其他选项:-name可用于指定server证书别名;-caname用于指定ca证书别名)

  • pcks#12 提取PEM文件(含私钥)
# mkdir out
# openssl pkcs12 -in server.p12 -password pass:111111 -passout pass:111111 -out out/server.pem
MAC verified OK
# ls out/
server.pem

# cat out/server.pem

其中-password指定 p12文件的密码(导入导出),-passout指输出私钥的加密密码(nodes为无加密)导出的文件为pem格式,同时包含证书和私钥(pkcs#8):

4) 从pkcs#12证书中提取私钥

# openssl pkcs12 -in server.p12 -password pass:111111 -passout pass:111111 -nocerts -out out/key.pem
MAC verified OK

5) 仅提取证书(所有证书)

# openssl pkcs12 -in server.p12 -password pass:111111 -nokeys -out out/server_all.crt
MAC verified OK

6) 仅提取CA证书

# openssl pkcs12 -in server-all.p12 -password pass:111111 -nokeys -cacerts -out out/cacert.pem

7) 仅提取server证书

# openssl pkcs12 -in server-all.p12 -password pass:111111 -nokeys -clcerts -out out/cert.pem 

4. openssl 命令参考

1. openssl list-standard-commands(标准命令)
    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模式的DES加密
            4.1.3) -aes128: CBC模式的AES128加密
            4.1.4) -aes192: CBC模式的AES192加密
            4.1.5) -aes256: CBC模式的AES256加密
        4.2) -passout arg: arg为对称加密(des、des、aes)的密码(使用这个参数就省去了console交互提示输入密码的环节)
        4.3) -out file: 输出证书私钥文件
        [numbits]: 密钥长度
    example: 生成一个1024位的RSA私钥,并用DES加密(密码为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模式的DES加密
        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
	
    example3: 用sha256算法计算文件uploadfile的哈希值,输出到stdout
    openssl dgst -sha256 ./uploadfile
	
    example4: hmac-sha256算法
    openssl dgst -sha256 -hmac keystr ./uploadfile

    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
	  
# openssl version -v   (查看openssl版本)
OpenSSL 1.0.2k-fips  26 Jan 2017



[参看]:

  1. openssl 证书请求和自签名命令req详解

  2. Centos7下的Openssl和CA

  3. 使用 openssl 生成证书

  4. Nginx+Https配置

  5. Linux下OpenSSL 源码安装的9个步骤

  6. openssl - 数字证书的编程解析

  7. SSL多域名绑定证书的解决方案

  8. linux下openssl命令详解