openssl基础
OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
OpenSSL is an open source project that provides a robust, commercial-grade, and full-featured toolkit for the Transport Layer Security (TLS) and Secure Sockets Layer (SSL) protocols. It is also a general-purpose cryptography library.
openssl是https的基础,在TCP与应用http之间增加了一层数据加密(SSL/TLS)。
SSL能使用户/服务器应用之间的通信不被攻击者窃听,并且始终对服务器进行认证,还可选择对用户进行认证。SSL协议要求建立在可靠的传输层协议(TCP)之上。SSL协议的优势在于它是与应用层协议独立无关的,高层的应用层协议(例如:HTTP,FTP,TELNET等)能透明地建立于SSL协议之上。SSL协议在应用层协议通信之前就已经完成加密算法、通信密钥的协商及服务器认证工作。在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性。
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。
SSL和TLS都包含两层协议:记录协议和握手协议。SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。 SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
1. 命令简介
# 生成密钥
$ openssl genrsa ...
# 密钥相关操作,如:查看、去掉密码等
$ openssl rsa ...
# “签名请求证书”相关操作,如:生成、查看等
$ openssl req ...
# “证书”相关操作,如:生成、查看等
$ openssl x509 ...
# 计算哈希值
$ openssl md5 ...
$ openssl sha1 ...
2. 常用场景
创建密钥对
# 创建私钥 $ openssl genrsa -out rsa_1024_priv.pem 1024 # 根据私钥得到公钥 $ openssl rsa -pubout -in rsa_1024_priv.pem -out rsa_1024_pub.pem
自签名证书
# 1.生成私钥 $ openssl genrsa -des3 -out server.key 1024 # 2.从秘钥中删除 Passphrase $ cp server.key server.key.org $ openssl rsa -in server.key.org -out server.key # 3.生成 CSR (Certificate Signing Request) $ openssl req -new -key server.key -out server.csr # 4.生成自签名证书 $ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
自签名CA证书
# 1.创建 CA 私钥 $ openssl genrsa -des3 -out ca.key 4096 # 2.生成 CA 的自签名证书 $ openssl req -new -x509 -days 365 -key ca.key -out ca.crt # 3.生成需要颁发证书的私钥 $ openssl genrsa -des3 -out server.key 4096 # 4.生成要颁发证书的证书签名请求,证书签名请求当中的 Common Name 必须区别于 CA 的证书里面的 Common Name $ openssl req -new -key server.key -out server.csr # 5.用 2 创建的 CA 证书给 4 生成的 签名请求 进行签名 $ openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
计算哈希值
# 计算文件 MD5 值
$ openssl md5 myfile.txt
# 计算文件 SHA1 值
$ openssl sha1 myfile.txt
# 计算文件 SHA256 值
$ openssl sha1 -sha256 myfile.txt
证书校验
验证一个证书是否是某一个 CA 签发,文件格式必须为 PEM
# 验证一个证书是否是某一个CA签发,文件格式必须为 PEM
$ openssl verify -CAfile cafile.pem apache.crt
可通过openssl提供的s_server和s_client验证证书。
服务器端开启ssl测试服务:
openssl s_server -msg -state -cert cert.pem -key key.pem -accept 18444
客户端验证
openssl s_client -msg -state -showcerts -cert client.cert -key client.key -connect localhost:18444
验证服务器是否使用自签名CA颁发的HTTPS证书
openssl s_client -connect test.com:28082 -CAfile ca.crt
AES加解密
1)将要加密的内容输入到plain.txt echo "1234567890abc" > plain.txt 2)使用openssl加密 -p 表示打印出加密用的salt, key, iv. salt就是所谓的加盐, 防止同样的内容产生同样的加密数据。 iv和key是openssl 的cbc模式需要的参数。 openssl enc -aes-128-cbc -in plain.txt -out encrypt.txt -iv f123 -K 1223 -p salt=E0DEB1EAFE7F0000 key=12230000000000000000000000000000 iv =F1230000000000000000000000000000 3)输出加密前和加密后内容的十六进制。这里使用xxd和hexdump都可以。 xxd plain.txt 00000000: 3132 3334 3536 3738 3930 6162 630a 1234567890abc. xxd encrypt.txt 00000000: c5af 18cb ddee 9923 0374 6a21 9bb6 3f99 …#.tj!..?. 4)解密加密后的数据 openssl aes-128-cbc -d -in encrypt.txt -out encrypt_decrypt.txt -S E0DEB1EAFE7F0000 -iv F1230000000000000000000000000000 -K 12230000000000000000000000000000 -S salt Salt to use, specified as a hexidecimal string -salt Use a salt in the key derivation routines (default) 5)查看解密后的数据和原始数据是否一致。 xxd encrypt_decrypt.txt 00000000: 3132 3334 3536 3738 3930 6162 630a 1234567890abc.
其他
# 查看私钥信息 $ openssl rsa -noout -text -in server.key # 查看签名请求信息 $ openssl req -noout -text -in server.csr # 查看ca的私钥信息 $ openssl rsa -noout -text -in ca.key # 查看证书信息 $ openssl x509 -noout -text -in ca.crt # 查看一个证书吊销列表信息 $ openssl crl -text -in xx.crl # 查看一个证书的额外信息 $ openssl x509 -purpose -in cacert.pem # 查看一个公钥的信息 $ openssl rsa -noout -text -pubin -in apache.pub
3. 证书编码格式
目前有以下两种格式:
- PEM - Privacy Enhanced Mail
打开看文本格式,以"-----BEGIN-----"开头, "-----END-----"结尾,内容是Base64编码,查看PEM格式的信息可以用命令
openssl rsa -in my.pem -text -noout
Unix服务器偏向于使用这种编码格式。 -
DER - Distinguished Encoding Rules
打开看是二进制格式,不可读,查看DER格式的信息可以用命令
openssl rsa -in my.der -inform der -text -noout
Java和Windows服务器偏向于使用这种编码格式。
我们平时见到的多种后缀名,都是语义化的后缀,在生成密钥的时候,比如我们私钥的后缀名可以写.pem .key,都是可以的,以下几种为常用后缀
-
CRT - CRT应该是certificate的三个字母,常见于Unix系统,有可能是PEM编码,也有可能是DER编码,大多数应该是PEM编码。
-
CER - 还是certificate,常见于Windows系统,可能是PEM编码,也可能是DER编码,大多数应该是DER编码。
-
KEY - 通常用来存放一个公钥或者私钥,并非X.509证书,编码可能是PEM,也可能是DER。
查看KEY的办法:
openssl rsa -in mykey.key -text -noout
如果是DER格式的话,同理应该这样了:
openssl rsa -in mykey.key -text -noout -inform der
-
CSR - Certificate Signing Request,即证书签名请求,这个并不是证书,而是向权威证书颁发机构获得签名证书的申请,其核心内容是一个公钥(当然还附带了一些别的信息),在生成这个申请的时候,同时也会生成一个私钥,私钥要自己保管好,查看的办法:
openssl req -noout -text -in my.csr
1. openssl,https,ssl,tls百科
3. OpenSSL 的常用方法 简书
5. openssl加解密使用
6. 使用openssl命令加解密 aes-128-cbc的简单示例
8. 了解AES加密算法