OpenSSL简介-程序员宅基地

技术标签: linux  OpenSSL  

基本概念
1. openssl是一个安全套接字层密码库,囊括主要的密码算法、常用密钥、证书封装管理功能及实现ssl协议。OpenSSL整个软件包大概可以分成三个主要的功能部分:SSL协议库libssl、应用程序命令工具以及密码算法库libcrypto。
2. SSL:Secure Socket Layer,安全套接字层协议,分为SSLv2和SSLv3两个版本,TSL在SSL3.0基础之上提出的安全通信标准化版。主要是为了加密传输数据而产生的协议,能使用户/服务器应用之间的通信不被攻击者窃听,并且始终对服务器进行认证,还可选择对用户进行认证。

 SSL协议建立在可靠的传输层协议(TCP,UDP,SCTP)之上,应用层协议(HTTP,FTP,TELNRET)在SSL之上,SSL协议在应用层协议通信之前就已经完成了加密算法、服务器认证等工作。http协议调用了ssl协议,那么他就变成了https(http –>ssl–>https)。主要功能两个:
   a. 加密解密在网络中传输的数据包,同时保护这些数据不被修改和伪造。
    应用层——>ssl解密——>传输层
    传输层——>ssl加密认证——>应用层
   b. 验证网络对话中双方的身份。

3. SSL握手协议:SSL包含两个子协议,一个是包协议,一个是子协议,包协议说明SSL的数据包是如何封装的;握手协议说明通信双方协商通信双方决定使用什么算法及算法使用的key。暂时只讨论握手协议的过程。
 1) Client向服务器发送自己支持的协议版本(如TLS1.2)、client生成的随机数、自己加密算法的一些配置。
 2) Server 收到Client请求后向客户端response:确认使用加密通信协议的版本、生成一个随机数、确认使用加密的方法、server certificate(服务器证书)。
 3) Client 验证服务器证书,在确认无误后取出其公钥,并发送随机数 Pre-Master-Key(用于公钥加密)、编码变更通知(通信双方都用商定好的密钥进行通信;即随后的信息都将用双方商定好的加密方法和密钥发送. )
 4) Server验证完client的身份之后,用自己的私有密钥解密得到pre-master-key后,然后双方利用这个pre-master key来共同协商,得到master secret。返回信息给client
 5) 双方用master一起产生真正的session key,这就是他们在剩下的过程中的对称加密的key了。这个key还可以用来验证数据完整性。双方再交换结束信息。握手结束。

4. 证书Certificate和证书颁发机构CA(certification authority)
 证书是建立公共密钥和某个实体之间联系的数字化的文件。它包含的内容有:版本信息(X.509也是有三个版本的)、系列号、证书接受者名称、颁发者名称、证书有效期、公共密钥、一大堆的可选的其他信息、CA的数字签名。证书由CA颁发,由CA决定该证书的有效期,由该CA签名。每个证书都有唯一的系列号。证书的系列号和证书颁发者来决定某证书的唯一身份。常用的证书是采用X.509结构的,这是一个国际标准证书结构,
 CA是第三方机构,被你信任,由它保证证书的确发给了应该得到该证书的人。CA自己有一个庞大的public key数据库,用来颁发给不同的实体。CA也是一个实体,它也有自己的公共密钥和私有密钥。

5. 加密算法
 1)对称加密:指加密和解密使用相同密钥的加密算法。对称加密算法的优点在于加解密的高速度和使用长密钥时的难破解性
 常见的对称加密算法:DES、3DES、DESX、AES、RC4、RC5、RC6等
 2)非对称加密:指加密和解密使用不同密钥的加密算法,也称为公私钥加密
 常见的非对称加密算法:RSA、DSA(数字签名用)等
 3)Hash算法:Hash算法它是一种单向算法,用户可以通过Hash算法对目标信息生成一段特定长度的唯一的Hash值,却不能通过这个Hash值逆向获得目标信息
 常见的Hash算法:MD2、MD4、MD5、SHA、SHA-1等

OpenSSL基本用法
1. 命令分为三类: 标准命令,消息摘要(dgst子命令),加密命令(enc子命令)
这里写图片描述

2. 对称加密 enc

openssl enc -ciphername [-help] [-ciphers] [-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 digest] [-p] [-P] [-bufsize number] [-nopad] [-debug] [-none] [-engine id]

-in filename:要加密/解密的输入文件,缺省为标准输入。
-out filename:要加密/解密的输出文件,缺省为标准输出。
-pass arg:输入的文件如果有密码保护,在这里输入密码
-salt:自动插入一个随机数作为文件内容加密,默认选项
–nosalt:想和openssl0.9.5以前的版本兼容,就set这个option
–e:一个缺省会set的option,把输入数据加密,可以指明一种加密算法,若不指的话将使用默认加密算法
-d:解密,解密时也可以指定算法,若不指定则使用默认算法,但一定要与加密时的算法一致
-a/-base64:用base64编码处理数据。set了这个option表示在加密之后的数据还要用base64编码捏一次,解密之前则先用base64编码解码。

创建word 文件加密:
这里写图片描述
加密:openssl enc -e -des3 -a -salt -in ./word -out ./encword
这里写图片描述
解密:openssl enc -d -des3 -a -salt -in ./encword -out ./decword
这里写图片描述

3. 单向加密 dgst
   用来哈希某个文件内容的。也能用来进行数字签名和认证。

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…]

-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1:哈希算法的名称,默认值为md5。
-c:打印出哈希结果的时候用冒号来分隔开。
-d:详细打印出调试信息
-hex:以十六进制的形式输出结果,这是默认形式。
–binary:以二进制的形式输出结果。
-out filename:输出文件名,如果没有指定就采用标准输出。
-sign filename:从指定文件中读出私钥来对摘要值签名

word文件
这里写图片描述

4. 生成密码
   用来哈希某个密码,也可以用来哈希文件内容。

openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-quiet] [-table]{password}

-crypt -1 -apr1:这三个option中任意选择一个作为哈希算法,缺省的是-crypt。
-salt string:输入作为salt的字符串
-in file:要哈希的文件名称。
–stdin:对标准输入的内容进行加密

用“12345”作为salt的字符串 分别hash 密码、文件、标准输入内容
openssl passwd -crypt -salt 12345 root
openssl passwd -crypt -in ./word -salt 12345
openssl passwd -1 -in ./word -salt 12345
openssl passwd -1 -salt 12345 -stdin
这里写图片描述

5. 生成RSA私有密钥 genrsa

openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] [-f4] [-3] [-rand file(s)] [numbits]

-out filename:私有密钥输入文件名,缺省为标准输出
-des|-des3|-idea:采用什么加密算法来加密我们的密钥。一般会要你输入保护密码。 如果这三个中一个也没set,我们的密钥将不被加密而输入。
-numbits:指明产生的参数的长度。必须是本指令的最后一个参数。如果没有指明,则产生512bit长的参数

密钥文件的权限一定要控制好,只能自己读写,因此可以使用 umask 命令设置生成的私钥权限

生成密钥文件rsa.txt
openssl genrsa -out ./rsa.txt 1024
这里写图片描述

6. Rsa :专门处理管理RSA密钥,从私钥中提取公钥等。

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]

-inform DER|PEM|NET:指定输入的格式是DEM、DER还是NET
-outform DER|PEM|NET:和上一个差不多,不同的是指定输出格式
-in filename:要分析的文件名称(私钥文件名)。如果文件有密码保护,会要你输入的。
-out filename:指明将提取出的公钥保存至指定文件中
-des|-des3|-idea:指明用什么加密算法对私有密钥进行的加密
-pubout:缺省的来说是打印出私有密钥,这个就可以打印公共密钥。如果上面那个选项有set,那么这个选项也自动被set。
-check:检查RSA的私有密钥是否被破坏了。

从文件rsa.txt中提取公钥:
openssl rsa -in ./rsa.txt -out rsa.pub //保存到文件
openssl rsa -in ./rsa.txt -pubout //打印
这里写图片描述

对私钥进行加密
openssl rsa -in ./rsa.txt -des3 -out rsa.pem
这里写图片描述

7. DSA(与RSA用法基本相同)

openssl gendsa [-out filename] [-des] [-des3] [-idea] [-rand file(s)] [paramfile]

openssl dsa [-inform PEM|DER] [-outform PEM|DER] [-in filename]
[-passin arg] [-out filename] [-passout arg] [-des] [-des3] [-idea]
[-text] [-noout] [-modulus] [-pubin] [-pubout]

DSA与RSA
 DSA是基于整数有限域离散对数难题的,采用对称加密,密钥量短,加/解密速度快,DSA的一个重要特点是两个素数公开,这样,当使用别人的p和q时,即使不知道私钥,你也能确认它们是否是随机产生的,还是作了手脚。RSA算法却做不到。
 RSA算法在网络容易实现密钥管理,方便进行数字签名,算法复杂,加/解速度慢,采用非对称加密。

8. 创建CA和申请证书 req
 在文件/etc/pki/tls/openssl.cnf 中定义的证书名称、存储位置等信息。可以根据自己需求修改。创建自签名证书和证书签名请求文件CSR

openssl req [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-passin arg] [-out filename] [-passout arg] [-text] [-noout] [-verify] [-modulus] [-new] [-rand file(s)] [-newkey rsa:bits] [-newkey dsa:file] [-nodes] [-key filename] [-keyform PEM|DER] [-keyout filename] [-[md5|sha1|md2|mdc2]] [-config filename] [-x509] [-days n] [-asn1-kludge] [-newhdr] [-extensions section] [-reqexts section]

-in filename:要处理的CSR的文件名称,只有-new和-newkey俩个option没有被set,本option才有效
-out filename:要输出的CSR文件名。
–new:本option产生一个新的CSR(Cerificate Signing Request), 它会要用户输入创建CSR的一些必须的信息。至于需要哪些信息,是在config文件里面定义好了的。如果-key没有被set私钥文件,那么就将根据config文件里的信息先产生一对新的RSA私钥文件,通过-keyout指定私钥钥文件。
-newkey arg:同时生成新的私有密钥文件和CSR文件。本option是带参数的。如果是产生RSA的私有密钥文件,参数是一个数字,指明私有密钥bit的长度。如果是产生DSA的私有密钥文件,参数是DSA密钥参数文件的文件名。
-key filename:参数filename指明我们的私有密钥文件名,如果没有指定,那么就将根据config文件里的信息先产生一对新的RSA私钥文件,通过-keyout指定生成的私钥文件路径。
-keyout filename:指明创建的新的私有密钥文件的文件名。如果该option没有被set,将使用config文件里面指定的文件名。
-config filename:使用的config文件的名称。本option如果没有set,将使用缺省的config文件。
-x509:本option将产生自签名的证书。一般用来自己玩下做个Root CA。证书的扩展项在可以在上面提到的config文件里面指定。
-days n:如果-509被set,那么这个option的参数指定我们自己的CA给人家签证书的有效期,缺省是30天。
–verify:检验请求文件里的签名信息。
–noout:不要打印CSR文件的编码版本信息。

(1) 生成自签名证书, -x509选项, 作为RootCA 使用
openssl req -new -x509 -keyout ca.key -out ca.cer -days 3650
这里写图片描述

(2) 生成证书签名请求文件CSR
openssl req -new -keyout test.key -out test.csr -days 3650
这里写图片描述

9. CA服务器根据CSR颁发证书 ca
 模拟CA行为的工具。有了它,你就是一个CA,可以用来给各种格式的CSR签名,用来产生和维护CRL。此外还维护着一个文本数据库,记录了所有经手颁发的证书及那些证书的状态。

openssl ca [-verbose][-config filename][-name section][-gencrl][-revoke file][-crldays days][-crlhours hours][-crlexts section][-startdate date][-enddate date][-days arg][-md arg][-policy arg][-keyfile arg][-key arg][-passin arg][-cert file][-in file][-out file][-notext][-outdir dir][-infiles][-spkac file][-ss_cert file][-preserveDN][-batch][-msie_hack][-extensions section]

-config filename:指定使用的configure文件。
-in filename:要签名的CSR文件。
-ss_cert filename:一个有自签名的证书,需要我们CA签名,就从这里输入文件名。
-infiles:如果你一次要给几个CSR签名,就用这个来输入,但记得这个选项一定要放在最后。这个项后面的所有东东都被认为是CSR文件名参数。
-out filename:签名后的证书文件名。证书的细节也会给写进去
-outdir directory:摆证书文件的目录。证书名就是该证书的系列号,后缀是.pem。
-cert:CA本身的证书文件名。
-keyfile filename:CA自己的私有密钥文件。
-md arg:签名用的哈希算法,比如MD2,MD5等。
-notext:不要把证书文件的明文内容输出到文件中去。

CA颁发证书前需要准备相关文件,否则会报对应文件找不到。或者通过CA.sh -newca创建一个CA,建立好相应的目录,所有需要的文件,包括CA的私有密钥文件,证书文件,系列号文件,和一个空的index文件,免去上面的自签证创建过程。
这里自己准备:
touch /etc/pki/CA/index.txt
echo 01 > /etc/pki/CA/serial

用上面生成的自签名证书ca.cer作为RootCA 颁发证书
openssl ca -in test.csr -out test.cer -cert ca.cer -keyfile ca.key -notext
其中-notext表示不要把证书文件的明文内容输出到文件中去,否则在后面用keytool导入到keystore时会出错。
这里写图片描述

10. X509
X509是一个功能很丰富的证书处理工具,可以用来显示证书的内容,转换其格式,给CSR签名等等

openssl x509 [-inform DER|PEM|NET] [-outform DER|PEM|NET] [-keyform DER|PEM][-CAform DER|PEM] [-CAkeyform DER|PEM] [-in filename][-out filename] [-serial] [-hash] [-subject] [-issuer] [-nameopt option] [-email] [-startdate] [-enddate] [-purpose] [-dates] [-modulus] [-fingerprint] [-alias] [-noout] [-trustout] [-clrtrust] [-clrreject] [-addtrust arg] [-addreject arg] [-setalias arg] [-days arg] [-signkey filename][-x509toreq] [-req] [-CA filename] [-CAkey filename] [-CAcreateserial] [-CAserial filename] [-text] [-C] [-md2|-md5|-sha1|-mdc2] [-clrext] [-extfile filename] [-extensions section]

-in filename:指定输入文件名
-out filename:指定输出文件名
-md2|-md5|-sha1|-mdc2:指定使用的哈希算法。缺省的是MD5
-text:用文本方式详细打印出该证书的所有细节
-noout:不打印出请求的编码版本信息。
-serial:打印出证书的系列号。
-subject:打印出证书拥有者的名字。
-issuer:打印证书颁发者名字
-dates:打印证书起始有效时间和到期时间

这里只是查看证书的内容,而且证书格式要求是PEM格式,就是base64编码格式。除了PEM格式还有DER格式(二进制编码),
openssl x509 -in test.cer -noout -text
这里写图片描述

参考文章:
https://blog.csdn.net/u011456940/article/details/57416526
https://blog.csdn.net/liguangxianbin/article/details/79665100
https://www.cnblogs.com/yangxiaolan/p/6256838.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/naioonai/article/details/80984032

智能推荐

使用nginx解决浏览器跨域问题_nginx不停的xhr-程序员宅基地

文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr

在 Oracle 中配置 extproc 以访问 ST_Geometry-程序员宅基地

文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc

Linux C++ gbk转为utf-8_linux c++ gbk->utf8-程序员宅基地

文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8

IMP-00009: 导出文件异常结束-程序员宅基地

文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束

python程序员需要深入掌握的技能_Python用数据说明程序员需要掌握的技能-程序员宅基地

文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求

Spring @Service生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致)_@service beanname-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname

随便推点

二叉树的各种创建方法_二叉树的建立-程序员宅基地

文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#include<iostream>#include<stack>#include<queue>using namespace std;typed_二叉树的建立

解决asp.net导出excel时中文文件名乱码_asp.net utf8 导出中文字符乱码-程序员宅基地

文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码

笔记-编译原理-实验一-词法分析器设计_对pl/0作以下修改扩充。增加单词-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词

android adb shell 权限,android adb shell权限被拒绝-程序员宅基地

文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限

投影仪-相机标定_相机-投影仪标定-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定

Wayland架构、渲染、硬件支持-程序员宅基地

文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland

推荐文章

热门文章

相关标签