OpenSSL从基础到应用系列:

       1) OpenSSL之安全通讯基础 

       2) OpenSSL之PKI

       3) OpenSSL之SSL协议的Web安全实现

       4) OpenSSL之编译安装

        

透过上面几个方面的学习,我们应该对OpenSSL有了一个基本的了解。OpenSSL功能之强大,命令组合用法之多,往往让我们的学习不知所措。在此,我们来对openssl命令的使用做一个总结


OpenSSl命令总览:

语法格式:

openssl command [ command_opts ] [ command_args ]

常用command:

version    用于查看版本信息

enc        用于加解密

ciphers    列出加密套件

genrsa     用于生成私钥

rsa        RSA密钥管理(例如:从私钥中提取公钥)

req        生成证书签名请求(CSR)

crl        证书吊销列表(CRL)管理

ca         CA管理(例如对证书进行签名)

dgst       生成信息摘要

rsautl     用于完成RSA签名、验证、加密和解密功能

passwd     生成散列密码

rand       生成伪随机数

speed      用于测试加解密速度                    

s_client   通用的SSL/TLS客户端测试工具

X509       X.509证书管理

verify      X.509证书验证

pkcs7       PKCS#7协议数据管理



OpenSSL命令---version:

用途:

version命令用来打印版本以及openssl其他各种信息。

用法:


openssl version [-a] [-v] [-b] [-o] [-f] [-p] [-d]

选项说明:

-a:打印所有信息。

-v:仅打印版本信息

-b:打印当前版本构建的日期

-o:库构建时的相关信息

-f:编译参数

-p:平台信息

-d: 列出openssl的安装目录



OpenSSL命令---enc:

用途:

对称加密算法工具。它能够运用块或流算法对数据进行加解密。还能够将加解密的结果进行base64编码。

用法:

openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e] 

[-d] [-a/-base64] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt]

[-salt] [-nosalt] [-z] [-md] [-p] [-P] [-bufsize number] [-nopad] [-debug] [-none] 

[-engine id]

选项说明:

-ciphername:对称算法名称,此命令有两种使用方式:-ciphername方式或者省略enc直接使用ciphername。

-in filename:要加密/解密的输入文件,默认为标准输入。

-out filename:要加密/解密的输出文件,默认为标准输出。

-pass arg:输入文件如果有密码保护,指定密码来源。

-e:进行加密操作,默认操作。可以省略

-d:进行解密操作。

-a:使用base64编码对加密结果进行处理。加密后进行base64编码,解密前进行base64解密。

-base64:同-a选项。

-A:默认情况下,base64编码为一个多行的文件。使用此选项,可以让生成的结果为一行。解密时,必须使用同样的选项,否则读取数据时会出错。

-k:指定加密口令,不设置此项时,程序会提示用户输入口令。

-kfile:指定口令存放文件。可以从这个口令存放文件的第一行读取加密口令。

-K key:使用一个16进制的输入口令。如果仅指定-K key而没有指定-k password,必须用-iv选项指定IV。当-K key和-k password都指定时,用-K选项给定的key将会被使用,而使用password来产生初始化向量IV。不建议两者都指定。

-iv IV:手工指定初始化向量(IV)的值。IV值是16进制格式的。如果仅使用-K指定了key而没有使用-k指定password,那么就需要使用-iv手工指定IV值。如果使用-k指定了password,那么IV值会由这个password的值来产生。

-salt:产生一个随机数,并与-k指定的password串联,然后计算其Hash值来防御字典***和rainbow table***。

       rainbow table***:用户将密码使用单向函数得到Hash摘要并存入数据库中,验证时,使用同一种单向函数对用户输入口令进行Hash得到摘要信息。将得到的摘要信息和数据中该用户的摘要信息进行比对,一致则通过。考虑到多数人使用的密码为常见的组合,***者可以将所有密码的常见组合进行单向Hash,得到一个摘要组合。然后与数据库中的摘要进行比对即可获得对应的密码。

      salt将随机数加入到密码中,然后对一整串进行单向Hash。***者就很难通过上面的方式来得到密码。

-S salt:使用16进制的salt。

-nosalt:表示不使用salt。

-z:压缩数据(前提是OpenSSL编译时加入了zip库)。

-md:指定摘要算法。如:MD5  SHA1  SHA256等。

-p:打印出使用的salt、口令以及初始化向量IV。

-P:打印出使用的salt、口令以及IV,不做加密和解密操作,直接退出。

-bufsize number:设置I/O操作的缓冲区大小。因为一个加密的文件可能会很大,每次能够处理的数据是有限的。

-nopad:没有数据填充(主要用于非对称加密操作)。

-debug:打印调试信息。

-none:不对数据进行加密操作。

-engine:指定硬件引擎。


注意: 密码可以用来产生初始化密钥key和初始化向量IV。

       新版的OpenSSL必须使用-salt选项。


OpenSSL支持的加密算法:des  des3  bf  cast cast5 rc2 rc4 rc5 aes等


使用实例:

对文件进行base64编码:

# which ls

# cp /bin/ls .

# file ls

# openssl base64 -in ls -out ls.b64

# file ls.b64


对base64编码文件进行解码:

# rm -rf ls

# openssl base64 -d -in ls.b64 -out ls

# file ls


使用des3加密文件并在密码结果中加入salt:

# echo "Hello World" >file.txt

# cat file.txt

# openssl des3 -salt -k 123456 -in file.txt -out file.des3

# cat file.des3


使用des3解密文件,并使用-k指定密码:

# openssl des3 -d -salt -k 123456 -in file.des3 -out file2.txt

# cat file2.txt


使用bf算法加密文件,并将加密结果进行base64编码:

# openssl bf -a -salt -k 123456 -in file.txt -out file.bf

# file file.bf

# cat file.bf


先用base64解码文件,再解密:

# openssl bf -d -salt -a -k 123456 -in file.bf -out file3.txt

# cat file3.txt


从密码文件中读取密码进行加解密:

# echo "123456" >123.txt

# cat 123.txt

# openssl des3 -salt -kfile 123.txt -in file.txt -out file.des3      //加密

# cat file.des3

# openssl des3 -d -salt -k 123456 -in file.des3 -out file2.txt       //解密

# cat file2.txt

# openssl des3 -d -salt -kfile 123.txt -in file.des3 -out file3.txt  

# cat file3.txt

# echo "654321" >>123.txt

# cat 123.txt

# openssl des3 -salt -kfile 123.txt -in file.txt -out file3.des3

# cat file3.des3

# openssl des3 -d -salt -k 654321 -in file3.des4 -out file4.txt

   //解密失败 因为kfile只会读取密码文件的第一行作为密码进行加密

# openssl des3 -d -salt -k 654321 -in file3.des4 -out file4.txt

# cat file4.txt


加密文件并进行压缩

# dd if=/dev/zero of=/tmp/123 bs=100M count=10     //生成一个100M的文件

# openssl des3 -salt -k 123456 -in 123 -out 123.des3    //普通加密

# openssl des3 -salt -k 123456 -z -in 123 -out 123.des3.z   //带压缩的加密

# du -sh /tmp/123  /tmp/123.des3  /tmp/123.des3.z      //比较文件大小


打印salt、key和IV的信息:

# rm -rf 123.des3

# openssl des3 -salt -k 123456 -p -in 123 -out 123.des3        //打印信息 并加密

# openssl des3 -salt -k 123456 -P -in 123 -out 123.des3.P     //仅打印信息 不加密



OpenSSL命令---ciphers:

用途:

用来展示加密算法套件的工具。它能够把所有OpenSSL支持的加密算法按照一定规律排列(一般是加密强度)。

用法:

openssl ciphers [-v] [-ssl2] [-ssl3] [-tls1] [cipherlist]

选项说明:

-v:详细列出所有加密套件。包括SSL版本(SSLv2、SSLv3以及TLS)、密钥交换算法、身份验证算法、对称算法、摘要算法以及该算法是否允许出口。

-ssl2:只列出sslv2使用的加密套件。

-ssl3:只列出sslv3使用的加密套件。

-tls1: 只列出tls使用的加密套件。

cipherlist:列出一个cipher list的详细内容。此项能列出所有符合规则的加密套件,如果不加-v选项,它只会显示各个套件名称。

cipherlist格式:


 openssl ciphers ‘cipherstring1:cipherstring2.....'

          1)可以显示一个或多个cipher string套件。多个cipher string直接使用分隔符分割。

          2)分隔符:通常使用冒号(:)分割,也可以使用逗号或空格来分割。

          3)每一个cipher string前面都可以加上!、-、+

            -:表示将这个cipher从List中删除。以后也可以选择再添加回来。

            +: 表示将这个cipher移动到List的底部

               注意:这个选项不是添加任何新的cipher,而只是移动匹配到的cipher。

            !:表示将这个cipher从List中永久删除。

          4)@STRENGTH 表示使用加密算法key的长度进行排序。

使用实例:

# openssl ciphers -h          //列出ciphers参数简要帮助

# openssl ciphers -v -ssl2 

# openssl ciphers -v -ssl3

# openssl ciphers -v -tls1

# openssl ciphers 'SHA1'     //列出所有使用SHA1算法的套件

# openssl ciphers 'SSLv3'    //列出SSLv3所使用的算法

# openssl ciphers 'SHA1+DES'  //列出所有包含SHA1和DES的套件

# openssl ciphers -v 'ALL:eNULL' //详细列出所有非加密算法

# openssl ciphers -v 'ALL:!ADH:@STRENGTH' //列出所有不包含匿名DH的算法并排序

# openssl ciphers -v '3DES:+RSA' //仅列出包含3DES和RSA算法的套件且将包含RSA的显示在底部


OpenSSL命令---genrsa:

用途:

用来产生RSA私钥。

用法:

openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] [-f4] [-3] 

[-rand   file(s)] [-engine id] [numbits]

选项说明:

-out fiename: 指定输出文件。如果没有设定此选项,将会输出到标准输出。

-passout arg: 指定密码来源。

-des|-des3|-idea:用来加密私钥文件的三种对称加密算法。

-F4|-3:指定指数。-f4为0x1001  

-rand file(s):指定随机种子。

-engine id:硬件引擎。

numbits:  生成的密钥位数。必须是本指令的最后一个参数。默认为512bits。

使用实例:

# openssl genrsa -des3 -out prikey.pem -f4 1024


OpenSSL命令---rsa:

用途: