- 参考文章:
- https://www.jianshu.com/p/15b1d935a44b
- https://www.cnblogs.com/gordon0918/p/5363466.html
- 生成root CA及签发证书
1. 什么是OpenSSL
OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
2. 基本功能
openssl是一个开源程序的套件、这个套件有三个部分组成:一是libcryto,这是一个具有通用功能的加密库,里面实现了众多的加密库;二是libssl,这个是实现ssl机制的,它是用于实现TLS/SSL的功能;三是openssl,是个多功能命令行工具,它可以实现加密解密,甚至还可以当CA来用,可以让你创建证书、吊销证书
2.1、非对称加密算法概述
非对称加密算法也称公开密钥算法,其解决了对称加密算法密钥分配的问题,非对称加密算法基本特点如下:
1、加密密钥和解密密钥不同
2、密钥对中的一个密钥可以公开
3、根据公开密钥很难推算出私人密钥
根据非对称加密算法的特点,可用户数字签名、密钥交换、数据加密。但是由于非对称加密算法较对称加密算法加密速度慢很多,故最常用的用途是数字签名和密钥交换。
目前常用的非对称加密算法有RSA, DH和DSA三种,但并非都可以用于密钥交换和数字签名。而是RSA可用于数字签名和密钥交换,DH算法可用于密钥交换,而DSA算法专门用户数字签名。
openssl支持以上三种算法,并为三种算法提供了丰富的指令集,本章主要介绍RSA算法及相关指令
2.2、RSA算法相关指令及用法
RSA虽然可以数字签名、密钥交换和数据加密,但是RSA加密数据速度慢,通常不使用RSA加密数据。所以最常用的功能就是数字签名和密钥交换,抛开数字签名和密钥交换的概念,实质上就是使用公钥加密还是使用私钥加密的区别。所以我们只要记住一句话:“公钥加密,私钥签名”。
公钥加密:用途是密钥交换,用户A使用用户B的公钥将少量数据加密发送给B,B用自己的私钥解密数据
私钥签名:用途是数字签名,用户A使用自己的私钥将数据的摘要信息加密一并发送给B,B用A的公钥解密摘要信息并验证
opessl中RSA算法指令主要有三个,其他指令虽有涉及,但此处不再详述。
指令 | 功能 |
genrsa | 生成并输入一个RSA私钥 |
rsa | 处理RSA密钥的格式转换等问题 |
rsautl | 使用RSA密钥进行加密、解密、签名和验证等运算 |
2.3 生成私钥 加解密
~ » openssl genrsa -out my.key -des3
/*
Generating RSA private key, 512 bit long modulus
...++++++++++++
.++++++++++++
e is 65537 (0x10001)
# 因为指定了des3算法,并且没指定密码,所以会要求我输入密码
Enter pass phrase for my.key:
Verifying - Enter pass phrase for my.key:
------------------------------------------------------------
*/
~ » cat my.key
/*
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,21A9C0CD76DFBF27
i1h8ZmZxOZxDHigtXs0tAIWNs7THoN4t00F4xmYP7gDEU8vwWXltZisUqMJ2KHgZ
ME70Tm2XvhEAwu3OLhCaV6Url+DJ/G6sMFpnvkebrW51Ndph87ZCRdhaOrXN2WVg
+/KNRv2dMh4c98zgoJqYiN6qqdY9Sztj0DMtjn2f9k7mU8l2oN5bmlO6dy+mX2ZB
Qaupx9PV2DZH7Yd5tcKLudCa44lJ9cJscnvIyzLhDHcrGytCsTeHNeVMx9gefd0p
DzMBruiNhmXSe8a067OT5mWMi7++4WOYYWfIj2bat/pxsBNo0gOxqcuV0G1RFEDA
uX0vk1ma3+hB01p51bPCjc2HF/nvs2s/YeYgJR/E3zuxQGMvi6G0uxVY10i5xhtb
mIXi1J5RSoVcj2gMXD3GasGANNG3hdTWC+g6hfq+DczmGl8uR9lXwg==
-----END RSA PRIVATE KEY-----
*/
我们可以指定私钥长度,命令最后就是指定私钥长度,默认512bit
openssl genrsa -out my.key -des3 1024
另外我们需要用到 openssl rsa
命令,我们会用它生成公钥,先看下帮助文档
$ openssl rsa -h
/*
-inform arg 输入文件编码格式,只有pem和der两种
-outform arg 输出文件编码格式,只有pem和der两种
-in arg input file 输入文件
-sgckey Use IIS SGC key format
-passin arg 如果输入文件被对称加密过,需要指定输入文件的密码
-out arg 输出文件位置
-passout arg 如果输出文件也需要被对称加密,需要指定输出文件的密码
-des 对输出结果采用对称加密 des算法
-des3 对输出结果采用对称加密 des3算法
-seed
-aes128, -aes192, -aes256
以上几个都是对称加密算法的指定,生成私钥的时候一般会用到,我们不让私钥明文保存
-text 以明文形式输出各个参数值
-noout 不输出密钥到任何文件
-modulus 输出模数值
-check 检查输入密钥的正确性和一致性
-pubin 指定输入文件是公钥
-pubout 指定输出文件是公钥
-engine e 指定三方加密库或者硬件
*/
我们利用刚才生成的私钥my.key
,以此生成一个公钥
~ » openssl rsa -in my.key -pubout -out my_pub.key
/*
Enter pass phrase for my.key: # 因为私钥有密码,我们需要输入
writing RSA key
------------------------------------------------------------
*/
~ » cat my_pub.key
/*
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAN4QWx/qPoOllcE8ZcR5zBzrSVFh7NXY
4SJHB8+IM3Wv2aYi7F3GlZjpt6EP3vdd4x4cJnuPFnZ5mZ5wFPQ8xD0CAwEAAQ==
-----END PUBLIC KEY-----
*/
另外:因为刚刚生成的私钥(my.key)是des3算法加密后的密文,转化为明文如下:
openssl rsa -in my.key -out my_private.key
因为openssl genrsa 采用RSA算法,所以解密也是openssl rsa
openssl enc -d -base64 -des-ede3-cbc -in my.key -out mykey.pem
-d 解密过程 ,默认-base64 -des-ede3-cbc算法
下方杂乱
openssl rsa -in alexprivate.key -pubout -out alex_pub.key
openssl rsautl -decrypt -in alexprivate.key -inkey test_pub.key -out alexend.pem
openssl rasutl -encrypt -in <原始文件> -inkey -pubin < RSA 公共 密码 文件> -out <输出文件>
openssl enc -d -des3 -passout pass:123456 -a -salt -in alexprivate.key -out alexkey.pem #对称解密密的格式
openssl enc -base64 -d -des-ede3-cbc -pass pass:p@=p? -in alexprivate.key -out alexkey.pem
openssl genrsa -out my.key -des3
---test
加密 openssl genrsa -des3 -passout pass:123456 -out my.key 2048
解密1: openssl enc -d -base64 -des-ede3-cbc -in alexprivate.key -out alexkey.pem
openssl rsautl -decrypt -base64 -des-ede3-cbc -in alexprivate.key -out alexkey.pem
解密:openssl enc -base64 -des-ede3-cbc -in alexprivate.key -out private.key
/*使用RSA密钥进行验证,实际上使用公钥进行解密*/
$ openssl rsautl -verify -in sign.txt -inkey RSA.pem -passin pass:123456 -out replain.txt
openssl rsa -in alexprivate.key -out private4.key