【网络】openssl及其使用

安稳与你 提交于 2020-01-11 06:42:36

介绍

OpenSSL是面向TLS和SSL协议的全能工具,同时也是一个通用的加解密工具。
此博客参考:

常用选项

  • -noout 不打印base64编码的key,在某些情况下,会省略输出相关信息
  • -modulus 显示用于计算公钥和私钥的模(见RSA)
  • -new 创建
  • -nodes 不加密
  • -config file 指定额外的配置文件
  • -x509 在req命令中,用于创建自签名的证书而不是证书签名请求(CSR)
  • -in file 从file读取内容
  • -inform FORM 指定输入的文件格式
  • -out file 将生成内容写到文件
  • -outform FORM 指定输出的文件格式

常用命令

  • 生成RSA密钥
openssl genrsa -out private.key 2048
  • 生成一个证书签名请求(CSR)
openssl req -out CSR.csr -new -newkey rsa:2048 -nodes -keyout privateKey.key
  • 检查RSA私钥
openssl rsa -in privateKey.key -check
  • 输出证书细节
openssl x509 -in certificate.crt -text -noout
  • 显示连接中TLS相关的细节
# 显示所有细节
openssl s_client -connect www.baidu.com:443
# 显示证书
openssl s_client -showcerts -connect www.baidu.com:443	
  • 将ANS.1 DER文件转换成PEM文件
openssl x509 -inform der -in certificate.cer -out certificate.pem
  • 将PEM文件转换成ANS.1 DER文件
openssl x509 -outform der -in certificate.pem -out certificate.der
  • 校验一个证书是否由某个CA颁发
openssl verify -verbose -CAfile ca.crt server.crt
  • 生成带签名的摘要
# 使用SHA256算法生成签名,并使用private.key加密
openssl dgst -sha256 -sign private.key data.bin -out signature
  • 解密RSA公钥加密的数据

生成https的X509v3证书

为了生成一个可用于https协议的证书,需要:

  • 1.指定一个CA证书,如果没有可用的CA证书,可以自己生成一个
  • 2.生成RSA公钥和私钥(假定使用RSA加密)
  • 3.生成证书,指定CA根证书和RSA公钥
  • 4.配置服务器,指定私钥和证书,令其在HTTS协议中使用该证书
  • 5.配置客户端,令其信任生成的CA根证书

生成自签名证书(Root):

openssl req -new -x509 -days 1000 -key Root_CA.key -out Root_CA.crt

生成证书并使用根证书签名:

# 生成证书签名请求
openssl req -new -key Tectia_Server_passwordless_private.key -out Tectia_Server_request.csr

# 使用根证书签名生成最终证书
openssl x509 -req -days 1000 -in Tectia_Server_request.csr -CA Root_CA.crt -CAkey Root_CA.key -set_serial 00001 -out Tectia_Server_certificate.crt

附录

基础命令格式

# 执行子命令
openssl cmd [-help | ARGS]
# 查看帮助手册
man openssl-cmd

genrsa命令

生成RSA私钥,生成过程中,.代表素数通过初始测试, + 代表通过Miller-Rabin测试,*代表该数字重新生成,即不是素数,换行代表成功

示例:

  • 生成2048位密钥
openssl genrsa -out rsa.key 2048

注意:生成的密钥文件中包含私钥和公钥以及生成所使用的大素数等所有RSA算法需要的信息。因此该密钥文件可用于提取公钥。

注意2048这个参数必须在命令的末尾。

rsa命令

该命令用于处理RSA密钥,可以转换到不同的格式,输出key的组成部分。

  • -inform DER|PEM,DER使用ANS.1定义的RSAPrivateKey或SubjectPublicKeyInfo结构;PEM使用BASE64编码加上额外头部和尾部DER数据
  • -outform DER|PEM 含义同-inform
  • -modulus 输出key的模
  • -pubout 指定输出公钥,默认情况下输出私钥;如果输入是公钥,则该选项自动设置;
  • -text 输出详细的信息,包括公钥和私钥的各个组成

示例:

  • 从密钥文件中提取公钥信息(-outform可选择PEM)
openssl rsa -in key.pem -pubout -out pubkey.pem -outform PEM
  • 从密钥文件中提供公钥信息,以ASN.1 RSAPublicKey格式输出
openssl rsa -in key.pem -RSAPublicKey_out -out pubkey.der -outfrom DER
  • 打印密钥文件包含的算法信息(素数,模等)
openssl rsa -in rsa.key -text -noout
  • 将密钥文件从PEM格式转换成DER格式
openssl rsa -in key.pem -outform DER -out keyout.der

req

[dn]
CN = www.feistyduck.com
emailAddress = webmaster@feistyduck.com
O = Feisty Duck Ltd
L = London
C = GB

s_client

s_client类似于nc工具自动建立tcp连接,s_client能够自动建立TLS连接,然后使用任何上层协议发送数据,它不局限于https。

用法:openssl s_client -connect HOST:PORT [选项]
选项:

  • -connect HOST:PORT 连接到指定端口,-connect选项可由命令行位置参数指定
  • -bind LOCAL:PORT 使用本地地址
  • -servername val 指定SNI
  • -CApath dir CA的目录
  • -CAfile file CA文件
  • -ssl_config FILE指定配置文件
  • -named_curve val ECDHE加密套件的参数
  • -cipher val TLSv1.2的加密套件
  • -ciphersuites val TLSv1.3的加密套件
  • -min_protocol val指定最低TLS版本
  • -max_protocol val指定最高TLS版本
  • -tls1_2 仅使用TLSv1.2
  • -no_tls1_2 不使用TLSv1.2
  • -alpn val 指定上层协议

例子:

  • 测试百度
 openssl s_client -connect www.baidu.com:443
  • 测试nginx,并指定使用最简单的加密套件
 openssl s_client  -CAfile my-ssl.test.crt -cipher AES128-SHA -tls1_2 -servername my-ssl.test -bind localhost:12443 -connect my-ssl.test:443

ciphers

用于列出所有的加密套件,

openssl加密套件与标准套件名称的映射,参考:https://ciphersuite.info/cs/TLS_RSA_WITH_AES_128_CBC_SHA/

rsautl

加密/解密RSA密钥加密的数据,使用私钥解密,指定-decrypt选项;使用公钥解密,指定-encrypt选项。

注意,RSA算法通常用于加密不太长的数据,因此主要用来做签名验证。

例子:

  • 私钥解密
openssl rsautl -decrypt -inkey private.key -in data.bin -out data-decrypt.bin
  • 私钥加密
openssl rsautl -encrypt -inkey private.key -in data.bin -out data-decrypt.bin
  • 公钥加密(必须加上-verify参数指定是验证签名)
openssl rsautl -verify -inkey public.key -pubin -in data.bin -out data-decrypt.bin
  • 使用私钥生成签名
 openssl rsautl -sign -in file -inkey key.pem -out sig
  • 使用公钥验证签名
 openssl rsautl -verify -in sig -inkey key.pem
  • 使用公钥验证签名,输出为asn1格式(X509证书签名格式)
openssl rsautl -verify -inkey pubkey.pem -pubin -in certificate_signature_encrypted.bin -asn1parse

dgst

示例:

  • 使用SHA256产生32字节(256位)的hash,并输出二进制文件
openssl dgst -sha256 -binary -out tmp file

X509

从证书中提取公钥

 openssl x509 -in x509.pem -pubkey -noout >pubkey.pem

asn1parse

示例

  • 解析DER文件
openssl asn1parse -inform DER 
  • X509证书的签名验证
openssl rsautl -verify -inkey pubkey.pem -pubin -in certificate_signature_encrypted.bin |openssl asn1parse -inform DER
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!