OpenSSL入门
OpenSSL 是一个强大的安全套接字层密码库,包括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序
对称加密算法
代码语言:javascript复制给文件或者消息加密,加密和解密用的同一密码,即对称加密
OpenSSL一共提供了8种对称加密算法,其中7种是分组加密算法,仅有的一种流加密算法是RC4。
这7种分组加密算法分别是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支持电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常用的分组密码加密模式。
其中,AES使用的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128位,其它算法使用的则是64位。
事实上,DES算法里面不仅仅是常用的DES算法,还支持三个密钥和两个密钥3DES算法。
非对称加密算法
对文件或者消息加密时用一个密码,而解锁时需要用另一个密码,即非对称加密,两个密钥分别叫做「公钥」、「私钥」
代码语言:javascript复制OpenSSL一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。
DH算法一般用于密钥交换。RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。
DSA算法则一般只用于数字签名。
信息摘要算法
数据摘要算法(信息摘要)是密码学算法通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能,由于算法具有其不可逆性,有时候也会被用做敏感信息加密。也被称为哈希(Hash)算法、散列算法。
代码语言:javascript复制OpenSSL实现了5种信息摘要算法,分别是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD。
SHA算法事实上包括了SHA和SHA1两种信息摘要算法,此外,OpenSSL还实现了DSS标准中规定的两种信息摘要算法DSS和DSS1。
密钥和证书管理
数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。
最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名。数字证书还有一个重要的特征就是只在特定的时间段内有效。数字证书是一种权威性的电子文档,可以由权威公正的第三方机构,即CA(例如中国各地方的CA公司)中心签发的证书,也可以由企业级CA系统进行签发。
一般证书分有三类,根证书、服务器证书和客户端证书。根证书,是生成服务器证书和客户端证书的基础,是信任的源头,也可以叫自签发证书,即CA证书。服务器证书,由根证书签发,配置在服务器上的证书。客户端证书,由根证书签发,配置在服务器上,并发送给客户,让客户安装在浏览器里的证书。
密钥包含:
代码语言:javascript复制公钥:公钥是公开的,用来传输对方的随机密钥,只有通过私钥才能解密,这时就只有双方知道密钥了,从而达到安全传输的目的。
私钥:自己保留,只有通过私钥才能解密公钥加密的数据,对于私钥的使用可以设置密码。
密钥和证书管理是PKI的一个重要组成部分,OpenSSL为之提供了丰富的功能,支持多种标准。
首先,OpenSSL实现了ASN.1的证书和密钥相关标准,提供了对证书、公钥、私钥、证书请求以及CRL等数据对象的DER、PEM和BASE64的编解码功能。OpenSSL提供了产生各种公开密钥对和对称密钥的方法、函数和应用程序,同时提供了对公钥和私钥的DER编解码功能。并实现了私钥的PKCS#12和PKCS#8的编解码功能。OpenSSL在标准中提供了对私钥的加密保护功能,使得密钥可以安全地进行存储和分发。
在此基础上,OpenSSL实现了对证书的X.509标准编解码、PKCS#12格式的编解码以及PKCS#7的编解码功能。并提供了一种文本数据库,支持证书的管理功能,包括证书密钥产生、请求产生、证书签发、吊销和验证等功能。
事实上,OpenSSL提供的CA应用程序就是一个小型的证书管理中心(CA),实现了证书签发的整个流程和证书管理的大部分机制。
openssl的简单使用
概念解释
代码语言:javascript复制CA:
CA就相当于一个认证机构,只要经过这个机构签名的证书我们就可以当做是可信任的。我们的浏览器中,已经被写入了默认的CA根证书。
证书:
证书就是将我们的公钥和相关信息写入一个文件,CA用它们的私钥对我们的公钥和相关信息进行签名后,将签名信息也写入这个文件后生成的一个文件。
证书格式(是一种标准):
x509 这种证书只有公钥,不包含私钥。
pcks#7 这种主要是用于签名或者加密。
pcks#12 这种含有私钥,同时也含有公钥,但是有口令保护。
编码方式:
.pem 后缀的证书都是base64编码
.der 后缀的证书都是二进制格式
证书:
.csr 后缀的文件是用于向ca申请签名的请求文件
.crt .cer 后缀的文件都是证书文件(编码方式不一定,有可能是.pem,也有可能是.der)
私钥:
.key 后缀的文件是私钥文件
1、对称加密算法的应用
利用OpenSSL作对称加密需要使用其子命令enc,其用法为:
代码语言:javascript复制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]
其中常用的选项为:
代码语言:javascript复制-e:加密;
-d:解密;
-ciphername:ciphername为相应的对称加密算命名字,如-des3、-ase128、-cast、-blowfish等等。
-a/-base64:使用base-64位编码格式;
-salt:自动插入一个随机数作为文件内容加密,默认选项;
-in FILENAME:指定要加密的文件的存放路径;
-out FILENAME:指定加密后的文件的存放路径;
加密字符串
代码语言:javascript复制(base) C02G20FCMD6M:$ echo "hellow openssl"|openssl enc -des3 -e -a -salt
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:
Using -iter or -pbkdf2 would be better.
U2FsdGVkX1/vUfi6NBKaBITVfUnQCVmpWiftmAybkwg=
加密文件
代码语言:javascript复制(base) C02G20FCMD6M:$ openssl enc -des3 -e -a -in test_openssl.txt -out test_openssl
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
(base) C02G20FCMD6M:$ openssl enc -d -des3 -a -salt -in test_openssl
enter des-ede3-cbc decryption password:
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
hellow openssl
2、单向加密
OpenSSL单向加密的子命令为dgst,其语法如下:
代码语言:javascript复制openssl dgst [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] [-c] [-d] [-hex] [-binary] [-out filename] [-sign filename] [-keyform arg] [-passin arg] [-verify filename] [-prverify filename] [-signature filename] [-hmac key] [file...]
其常用的选项为:
代码语言:javascript复制[-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1]:指定一种单向加密算法;
-out FILENAME:将加密的内容保存到指定的文件中;
单向加密除了 openssl dgst 工具还有:md5sum,sha1sum,sha224sum,sha256sum ,sha384sum,sha512sum
3、加密密码
OpenSSL还支持生成密码的hash离散值,其子命令为passwd,语法如下:
代码语言:javascript复制openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify] [-quiet] [-table] {password}
常用选项为:
-salt STRING:添加随机数;
-in FILE:对输入的文件内容进行加密;
-stdin:对标准输入的内容进行加密;
4、生成随机数
代码语言:javascript复制openssl命令也支持生成随机数,其子命令为rand,对应的语法为:
openssl rand [-out file] [-rand file(s)] [-base64] [-hex] num
常用选项有:
-base64:以base64编码格式输出;
-hex:使用十六进制编码格式;
-out FILE:将生成的内容保存在指定的文件中;
5、生成密钥对
利用openssl命令的子命令genrsa生成私钥,然后再使用子命令rsa私钥中提取公钥。 genrsa的语法如下:
代码语言:javascript复制openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] [-f4] [-3] [-rand file(s)] [-engine id] [numbits]
常用选项:
-out FILENAME:将生成的私钥保存至指定的文件中;
[-des] [-des3] [-idea]:指定加密算法;
numbits:指明生成的私钥大小,默认是512;
而随后可利用rsa子命令生成的私钥文件中提取公钥,rsa子命令的语法为:
代码语言:javascript复制openssl rsa [-inform PEM|NET|DER] [-outform PEM|NET|DER] [-in filename] [-passin arg] [-out filename] [-passout arg] [-sgckey] [-des] [-des3] [-idea] [-text] [-noout] [-modulus] [-check] [-pubin] [-pubout] [-engine id]
常用选项为:
-in FILENAME:指明私钥文件的存放路径;
-out FILENAME:指明将公钥的保存路径;
-pubout:根据提供的私钥,从中提取出公钥;
6,查看证书信息
代码语言:javascript复制openssl x509 -in/etc/pki/CA/certs/httpd.crt-noout -serial -dates -subject复制复制
上述查看证书使用了openssl命令的子命令x509,其选项解释为:
代码语言:javascript复制-noout:不输出加密的证书内容;
-serial:输出证书序列号;
-dates:显示证书有效期的开始和终止时间;
-subject:输出证书的subject;
7,从pkcs12中导出证书、秘钥和证书编号
•查看所有信息
代码语言:javascript复制openssl pkcs12 -info -in apiclient_cert.p12-nodes
•导出证书
代码语言:javascript复制openssl pkcs12 -in apiclient_cert.p12-out cert.pem-nokeys
•导出秘钥
代码语言:javascript复制openssl pkcs12 -in apiclient_cert.p12-out private_key.pem-nodes -nocerts
•查看证书序列号
代码语言:javascript复制openssl x509 -in cert.pem-noout -serial
•从证书文件和私钥生成 PKCS#12 (PFX) 密钥库文件
代码语言:javascript复制openssl pkcs12 -export -out server.p12 -inkey server.key -in server.crt -certfile CACert.crt
可以查看原文:
https://mp.weixin.qq.com/s?__biz=MzA5NTgwNzY1NA==&mid=2247483705&idx=1&sn=881e213362d733807198d5932a97a313&chksm=90b8f0f0a7cf79e668dbdf7de3afb968a45e855c9f53c228be2f4f7289bd797b6e8ed84540c6&token=2069274630&lang=zh_CN#rd