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协议的优势在于它是与应用层协议独立无关的,高层的应用层协议(例如:HTTPFTPTELNET等)能透明地建立于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百科

2. www.openssl.org

3. OpenSSL 的常用方法 简书

4.  openssl 工具进行 SSL 故障分析

5. openssl加解密使用

6. 使用openssl命令加解密 aes-128-cbc的简单示例

7. Openssl-AES加密

8. 了解AES加密算法

posted @ 2017-06-11 22:04  yuxi_o  阅读(496)  评论(0编辑  收藏  举报