openssl 命令详解

| 选择喜欢的代码风格  

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

openssl 命令安装:


-bash: openssl: command not found
 
#CentOS/RHEL 安装
yum group install 'Development Tools' && yum install perl-core libtemplate-perl zlib-devel 
或者:
yum search openssl
yum install openssl openssl-devel

openssl version -a #安装后验证

 
#Debian/Ubuntu 安装
sudo apt-get install openssl
sudo apt-get install libssl-dev
 
#Fedora
dnf install openssl

#OpenSUSE
zypper addrepo https://download.opensuse.org/repositories/openSUSE:12.1/standard/openSUSE:12.1.repo
zypper refresh
zypper install openssl

---------------
#Debian
apt-get install openssl

#Ubuntu
apt-get install openssl

#Alpine
apk add openssl

#Arch Linux
pacman -S openssl

#Kali Linux
apt-get install openssl

#CentOS
yum install openssl

#Fedora
dnf install openssl

#OS X
brew install openssl

#Raspbian
apt-get install openssl

#Docker
docker run cmd.cat/openssl openssl

openssl 命令补充说明:


OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。

OpenSSL 有两种运行模式:交互模式和批处理模式

直接输入 openssl 回车进入交互模式,输入带命令选项的 openssl 进入批处理模式。

OpenSSL 整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL 协议库以及应用程序。OpenSSL 的目录结构自然也是围绕这三个功能部分进行规划的。

openssl 命令主要用途:


  • 创建和管理私钥,公钥和参数
  • 公钥加密操作
  • 创建 X.509 证书,CSRCRL
  • 消息摘要的计算
  • 使用密码进行加密和解密
  • SSL/TLS 客户端和服务器测试
  • 处理 S/MIME 签名或加密的邮件
  • 时间戳请求,生成和验证

openssl 命令语法:


openssl command [ command_opts ] [ command_args ]

openssl [ list-standard-commands | list-message-digest-commands | list-cipher-commands | list-cipher-algorithms | list-message-digest-algorithms | list-public-key-algorithms]

openssl no-XXX [ arbitrary options ]

openssl 命令实例


检查您的 OpenSSL 版本,在准备生成私钥或 CSR 时,确定使用的 OpenSSL 版本是重要的第一步。您的 OpenSSL 版本规定了生成密钥时可以使用的加密算法以及支持的协议。例如,OpenSSL 版本 1.0.1 是第一个支持 TLS 1.1TLS 1.2 的版本。在获得对可能遇到的问题进行故障诊断的帮助时,了解正在使用的 OpenSSL 版本也很重要。

使用以下命令来确定您正在运行的 OpenSSL 版本:

$ openssl version -a

OpenSSL 1.0.2k-fips  26 Jan 2017
built on: reproducible build, date unspecified
platform: linux-x86_64
options:  bn(64,64) md2(int) rc4(16x,int) des(idx,cisc,16,int) idea(int) blowfish(idx) 
compiler: gcc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DKRB5_MIT -m64 -DL_ENDIAN -Wall -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches   -m64 -mtune=generic -Wa,--noexecstack -DPURIFY -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DRC4_ASM -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
OPENSSLDIR: "/etc/pki/tls"
engines:  rdrand dynamic 

在此 openssl 命令中,-a 开关显示完整的版本信息,包括:

  • 版本号和版本发布日期(OpenSSL 1.0.2k,2017年1月26日)
  • 使用库构建的选项(options)
  • 存储证书和私钥的目录(OPENSSLDIR)

使用 openssl 生成密码

$ openssl rand -base64 10
9dFsv+DV/gnNJQ==

openssl 消息摘要算法应用例子

#用SHA1算法计算文件file.txt的哈西值,输出到stdout:
$ openssl dgst -sha1 file.txt

#用SHA1算法计算文件file.txt的哈西值,输出到文件digest.txt:
$ openssl sha1 -out digest.txt file.txt

#用DSS1(SHA1)算法为文件file.txt签名,输出到文件dsasign.bin。签名的private key必须为DSA算法产生的,保存在文件dsakey.pem中。
$ openssl dgst -dss1 -sign dsakey.pem -out dsasign.bin file.txt

#用dss1算法验证file.txt的数字签名dsasign.bin,验证的private key为DSA算法产生的文件dsakey.pem。
$ openssl dgst -dss1 -prverify dsakey.pem -signature dsasign.bin file.txt

#用sha1算法为文件file.txt签名,输出到文件rsasign.bin,签名的private key为RSA算法产生的文件rsaprivate.pem。
$ openssl sha1 -sign rsaprivate.pem -out rsasign.bin file.txt

#用sha1算法验证file.txt的数字签名rsasign.bin,验证的public key为RSA算法生成的rsapublic.pem。
$ openssl sha1 -verify rsapublic.pem -signature rsasign.bin file.txt

openssl 对称加密应用例子

#对称加密应用例子,用DES3算法的CBC模式加密文件plaintext.doc,加密结果输出到文件ciphertext.bin。
$ openssl enc -des3 -salt -in plaintext.doc -out ciphertext.bin

#用DES3算法的OFB模式解密文件ciphertext.bin,提供的口令为trousers,输出到文件plaintext.doc。注意:因为模式不同,该命令不能对以上的文件进行解密。
$ openssl enc -des-ede3-ofb -d -in ciphertext.bin -out plaintext.doc -pass pass:trousers

#用Blowfish的CFB模式加密plaintext.doc,口令从环境变量PASSWORD中取,输出到文件ciphertext.bin。
$ openssl bf-cfb -salt -in plaintext.doc -out ciphertext.bin -pass env:PASSWORD

#给文件ciphertext.bin用base64编码,输出到文件base64.txt。
$ openssl base64 -in ciphertext.bin -out base64.txt

#用RC5算法的CBC模式加密文件plaintext.doc,输出到文件ciphertext.bin,salt、key和初始化向量(iv)在命令行指定。
$ openssl rc5 -in plaintext.doc -out ciphertext.bin -S C62CB1D49F158ADC -iv E9EDACA1BD7090C6 -K 89D4B1678D604FAA3DBFFD030A314B29

openssl Diffie-Hellman 应用例子

#使用生成因子2和随机的1024-bit的素数产生D0ffie-Hellman参数,输出保存到文件dhparam.pem
$ openssl dhparam -out dhparam.pem -2 1024

#从dhparam.pem中读取Diffie-Hell参数,以C代码的形式,输出到stdout。
$ openssl dhparam -in dhparam.pem -noout -C

openssl DSA 应用例子

#生成1024位DSA参数集,并输出到文件dsaparam.pem。
$ openssl dsaparam -out dsaparam.pem 1024

#使用参数文件dsaparam.pem生成DSA私钥匙,采用3DES加密后输出到文件dsaprivatekey.pem
$ openssl gendsa -out dsaprivatekey.pem -des3 dsaparam.pem

#使用私钥匙dsaprivatekey.pem生成公钥匙,输出到dsapublickey.pem
$ openssl dsa -in dsaprivatekey.pem -pubout -out dsapublickey.pem

#从dsaprivatekey.pem中读取私钥匙,解密并输入新口令进行加密,然后写回文件dsaprivatekey.pem
$ openssl dsa -in dsaprivatekey.pem -out dsaprivatekey.pem -des3 -passin

openssl RSA 应用例子

#产生1024位RSA私匙,用3DES加密它,口令为trousers,输出到文件rsaprivatekey.pem
$ openssl genrsa -out rsaprivatekey.pem -passout pass:trousers -des3 1024

#从文件rsaprivatekey.pem读取私匙,用口令trousers解密,生成的公钥匙输出到文件rsapublickey.pem
$ openssl rsa -in rsaprivatekey.pem -passin pass:trousers -pubout -out rsapubckey.pem

#用公钥匙rsapublickey.pem加密文件plain.txt,输出到文件cipher.txt
$ openssl rsautl -encrypt -pubin -inkey rsapublickey.pem -in plain.txt -out cipher.txt

#使用私钥匙rsaprivatekey.pem解密密文cipher.txt,输出到文件plain.txt
$ openssl rsautl -decrypt -inkey rsaprivatekey.pem -in cipher.txt -out plain.txt

#用私钥匙rsaprivatekey.pem给文件plain.txt签名,输出到文件signature.bin
$ openssl rsautl -sign -inkey rsaprivatekey.pem -in plain.txt -out signature.bin

#用公钥匙rsapublickey.pem验证签名signature.bin,输出到文件plain.txt
$ openssl rsautl -verify -pubin -inkey rsapublickey.pem -in signature.bin -out plain

#从X.509证书文件cert.pem中获取公钥匙,用3DES加密mail.txt,输出到文件mail.enc
$ openssl smime -encrypt -in mail.txt -des3 -out mail.enc cert.pem

#从X.509证书文件cert.pem中获取接收人的公钥匙,用私钥匙key.pem解密S/MIME消息mail.enc,结果输出到文件mail.txt
$ openssl smime -decrypt -in mail.enc -recip cert.pem -inkey key.pem -out mail.txt

#cert.pem为X.509证书文件,用私匙key,pem为mail.txt签名,证书被包含在S/MIME消息中,输出到文件mail.sgn
$ openssl smime -sign -in mail.txt -signer cert.pem -inkey key.pem -out mail.sgn

#验证S/MIME消息mail.sgn,输出到文件mail.txt,签名者的证书应该作为S/MIME消息的一部分包含在mail.sgn中
$ openssl smime -verify -in mail.sgn -out mail.txt

用 openssl 验证网站 SSL 证书的有效性:

$ openssl s_client -connect commandnotfound.cn:443 -servername commandnotfound.cn

CONNECTED(00000003)
depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = R3
verify return:1
depth=0 CN = commandnotfound.cn
verify return:1
---
Certificate chain
 0 s:/CN=commandnotfound.cn
   i:/C=US/O=Let's Encrypt/CN=R3
 1 s:/C=US/O=Let's Encrypt/CN=R3
   i:/C=US/O=Internet Security Research Group/CN=ISRG Root X1
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFQjCC...
...
-----END CERTIFICATE-----
subject=/CN=commandnotfound.cn
issuer=/C=US/O=Let's Encrypt/CN=R3
...


 Start Time: 1634539335
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

openssl 命令扩展阅读:




openssl 命令评论