[TOC]
0x00 前言简述
OpenSSL命令有两种运行模式交互模式和批处理:
- 输入openssl回车进入交互模式
- 输入带命令选项的openssl进入批处理模式
OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序
,OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的;
功能说明:
- 处理数字证书:
可以用作证书颁发机构(Certificate Authority 即 CA)
。 - 进行证书、公钥、私钥的管理
0x01 Openssl 命令
Syntax & Param
基础语法:
代码语言:javascript复制openssl [Standard]
基础参数:
代码语言:javascript复制#Standard commands (标准命令)
asn1parse ca ciphers cms
crl crl2pkcs7 dgst dh
dhparam(dh加密方式) dsa dsaparam(dsa加密方式) ec
ecparam enc(加密) engine errstr
gendh gendsa genpkey genrsa(生成rsa密匙)
nseq ocsp passwd pkcs12
pkcs7 pkcs8 pkey pkeyparam
pkeyutl prime rand(随机) req
rsa(密钥生成公钥) rsautl(公私钥加解密)s_client s_server
s_time sess_id smime speed
spkac ts verify version
x509(公钥证书的格式标准)
#Message Digest commands (消息摘要命令)
md2 md4 md5 rmd160
sha sha1
#Cipher commands (Cipher commands)
aes-128-cbc aes-128-ecb aes-192-cbc aes-192-ecb
aes-256-cbc aes-256-ecb base64 bf
bf-cbc bf-cfb bf-ecb bf-ofb
camellia-128-cbc camellia-128-ecb camellia-192-cbc camellia-192-ecb
camellia-256-cbc camellia-256-ecb cast cast-cbc
cast5-cbc cast5-cfb cast5-ecb cast5-ofb
des des-cbc des-cfb des-ecb
des-ede des-ede-cbc des-ede-cfb des-ede-ofb
des-ede3 des-ede3-cbc des-ede3-cfb des-ede3-ofb
des-ofb des3 desx idea
idea-cbc idea-cfb idea-ecb idea-ofb
rc2 rc2-40-cbc rc2-64-cbc rc2-cbc
rc2-cfb rc2-ecb rc2-ofb rc4
rc4-40 rc5 rc5-cbc rc5-cfb
rc5-ecb rc5-ofb seed seed-cbc
seed-cfb seed-ecb seed-ofb zlib
命令一览
代码语言:javascript复制#实例:文件生成base64字符串
openssl base64 -in test.txt #等同于 base64 test.txt
N2ZmYjJhZmQ2ODZjZDk5NDdlOTY1ODMyZTY4MGQwYzI0NTY0ZGM4NDlhZmRjZGVhMDQzZmRkZDY1ZDIxN2ZlNwo=
rand
代码语言:javascript复制#实例1.随机数的生成
openssl rand -base64 位数 -out 写出的文件
openssl rand -base64 128
od3xDJVOVKGYfSXHELXI3oVw0hyElUE34tZWsYHrU6yk7Gyr6Z7B8QlZ2zbZBcTCR3DJMr81j1l3SaFYxbO1xhs4ki4iZXPwwpO1gyG4sAnfGC1bDEBYzKw u/jlSCSBlCoukUa41nvEQ2hE2BGxbQoWeuwO0L3hQk5wwxMHPiE=
req大致有3个功能:生成证书请求文件、验证证书请求文件和创建根CA。
dgst - 摘要校验与生成
描述:它是OpenSSL子命令主要用于文件的摘要信息的验证与生成;
代码语言:javascript复制$openssl dgst -h
options are
-c to output the digest with separating colons
-r to output the digest in coreutils format
-d to output debug info
-hex output as hex dump
-binary output in binary form
-hmac arg set the HMAC key to arg
-non-fips-allow allow use of non FIPS digest
-sign file 在文件中使用私钥的符号摘要
-verify file 使用文件中的公钥验证签名
-prverify file 使用文件中的私钥验证签名
-keyform arg 关键文件格式(PEM或引擎)
-out filename 输出到文件名而不是标准输出
-signature file 签名验证
-sigopt nm:v 参数验证
-hmac key create hashed MAC with key
-mac algorithm create MAC (not neccessarily HMAC)
-macopt nm:v MAC algorithm parameters or key
-engine e 使用引擎e,可能是硬件设备。
# 支持的信息摘要算法
-md4 to use the md4 message digest algorithm
-md5 to use the md5 message digest algorithm
-ripemd160 to use the ripemd160 message digest algorithm
-sha to use the sha message digest algorithm
-sha1 to use the sha1 message digest algorithm
-sha224 to use the sha224 message digest algorithm
-sha256 to use the sha256 message digest algorithm
-sha384 to use the sha384 message digest algorithm
-sha512 to use the sha512 message digest algorithm
-whirlpool to use the whirlpool message digest algorithm
简单示例:
代码语言:javascript复制# (1) 用SHA1/MD5算法计算文件file.txt的哈希值输出到stdout;
openssl dgst -sha1 file.txt
openssl dgst -md5 file.txt
当在配置ssl_ciphers参数中的套件顺序不一样,浏览器在协商时会优先使用排位靠前的套件,我们可通过执行openssl ciphers
命令检查加密套件配置支持的协议信息,以及椭圆曲线的套件(ECDHE)队列情况,此时我们只要调整顺序(前置)就可以加大协商出支持椭圆曲线算法的套件的可能性。
$ openssl ciphers -V 'ECDHE-RSA-AES128-GCM-SHA256:ECDH:AES:EECDH CHACHA20:EECDH CHACHA20-draft:EECDH AES128:RSA AES128:EECDH AES256:RSA AES256:EECDH 3DES:RSA 3DES:HIGH:!NULL:!aNULL:!eNULL:!EXPORT:!PSK:!ADH:!DES:!MD5:!RC4' | column -t
# 执行结果
0x13,0x02 - TLS_AES_256_GCM_SHA384 TLSv1.3 Kx=any Au=any Enc=AESGCM(256) Mac=AEAD
0x13,0x03 - TLS_CHACHA20_POLY1305_SHA256 TLSv1.3 Kx=any Au=any Enc=CHACHA20/POLY1305(256) Mac=AEAD
0x13,0x01 - TLS_AES_128_GCM_SHA256 TLSv1.3 Kx=any Au=any Enc=AESGCM(128) Mac=AEAD
0xC0,0x2F - ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(128) Mac=AEAD
0xC0,0x2C - ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(256) Mac=AEAD
0xC0,0x30 - ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD
0xCC,0xA9 - ECDHE-ECDSA-CHACHA20-POLY1305 TLSv1.2 Kx=ECDH Au=ECDSA Enc=CHACHA20/POLY1305(256) Mac=AEAD
0xCC,0xA8 - ECDHE-RSA-CHACHA20-POLY1305 TLSv1.2 Kx=ECDH Au=RSA Enc=CHACHA20/POLY1305(256) Mac=AEAD
....
0x00,0xBA - CAMELLIA128-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=Camellia(128) Mac=SHA256
0x00,0x84 - CAMELLIA256-SHA SSLv3 Kx=RSA Au=RSA Enc=Camellia(256) Mac=SHA1
0x00,0x41 - CAMELLIA128-SHA SSLv3 Kx=RSA Au=RSA Enc=Camellia(128) Mac=SHA1
s_client - 客户端证书查询与导出
语法参数
代码语言:javascript复制
# 语法示例
openssl s_client -showcerts -connect {HOSTNAME}:{PORT} </dev/null 2>/dev/null
实践案例:
代码语言:javascript复制# 1.例如,导出我的博客网站证书的命令,执行命令证书保存在文件 blog.weiyigeek.top.pem 中。
openssl s_client -showcerts -connect blog.weiyigeek.top:443 </dev/null 2>/dev/null | openssl x509 -outform PEM > blog.weiyigeek.top.pem
# 查看其证书SAN中的HOST
openssl x509 --text -in blog.weiyigeek.top.pem -noout | grep "Subject Alternative Name" -A 1
X509v3 Subject Alternative Name:
DNS:*.weiyigeek.top, DNS:weiyigeek.top