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

智能推荐

分布式光纤传感器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告_预计2026年中国分布式传感器市场规模有多大-程序员宅基地

文章浏览阅读3.2k次。本文研究全球与中国市场分布式光纤传感器的发展现状及未来发展趋势,分别从生产和消费的角度分析分布式光纤传感器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的市场份额。主要生产商包括:FISO TechnologiesBrugg KabelSensor HighwayOmnisensAFL GlobalQinetiQ GroupLockheed MartinOSENSA Innovati_预计2026年中国分布式传感器市场规模有多大

07_08 常用组合逻辑电路结构——为IC设计的延时估计铺垫_基4布斯算法代码-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏12次。常用组合逻辑电路结构——为IC设计的延时估计铺垫学习目的:估计模块间的delay,确保写的代码的timing 综合能给到多少HZ,以满足需求!_基4布斯算法代码

OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版-程序员宅基地

文章浏览阅读3.3k次,点赞3次,收藏5次。OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版

关于美国计算机奥赛USACO,你想知道的都在这_usaco可以多次提交吗-程序员宅基地

文章浏览阅读2.2k次。USACO自1992年举办,到目前为止已经举办了27届,目的是为了帮助美国信息学国家队选拔IOI的队员,目前逐渐发展为全球热门的线上赛事,成为美国大学申请条件下,含金量相当高的官方竞赛。USACO的比赛成绩可以助力计算机专业留学,越来越多的学生进入了康奈尔,麻省理工,普林斯顿,哈佛和耶鲁等大学,这些同学的共同点是他们都参加了美国计算机科学竞赛(USACO),并且取得过非常好的成绩。适合参赛人群USACO适合国内在读学生有意向申请美国大学的或者想锻炼自己编程能力的同学,高三学生也可以参加12月的第_usaco可以多次提交吗

MySQL存储过程和自定义函数_mysql自定义函数和存储过程-程序员宅基地

文章浏览阅读394次。1.1 存储程序1.2 创建存储过程1.3 创建自定义函数1.3.1 示例1.4 自定义函数和存储过程的区别1.5 变量的使用1.6 定义条件和处理程序1.6.1 定义条件1.6.1.1 示例1.6.2 定义处理程序1.6.2.1 示例1.7 光标的使用1.7.1 声明光标1.7.2 打开光标1.7.3 使用光标1.7.4 关闭光标1.8 流程控制的使用1.8.1 IF语句1.8.2 CASE语句1.8.3 LOOP语句1.8.4 LEAVE语句1.8.5 ITERATE语句1.8.6 REPEAT语句。_mysql自定义函数和存储过程

半导体基础知识与PN结_本征半导体电流为0-程序员宅基地

文章浏览阅读188次。半导体二极管——集成电路最小组成单元。_本征半导体电流为0

随便推点

【Unity3d Shader】水面和岩浆效果_unity 岩浆shader-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏18次。游戏水面特效实现方式太多。咱们这边介绍的是一最简单的UV动画(无顶点位移),整个mesh由4个顶点构成。实现了水面效果(左图),不动代码稍微修改下参数和贴图可以实现岩浆效果(右图)。有要思路是1,uv按时间去做正弦波移动2,在1的基础上加个凹凸图混合uv3,在1、2的基础上加个水流方向4,加上对雾效的支持,如没必要请自行删除雾效代码(把包含fog的几行代码删除)S..._unity 岩浆shader

广义线性模型——Logistic回归模型(1)_广义线性回归模型-程序员宅基地

文章浏览阅读5k次。广义线性模型是线性模型的扩展,它通过连接函数建立响应变量的数学期望值与线性组合的预测变量之间的关系。广义线性模型拟合的形式为:其中g(μY)是条件均值的函数(称为连接函数)。另外,你可放松Y为正态分布的假设,改为Y 服从指数分布族中的一种分布即可。设定好连接函数和概率分布后,便可以通过最大似然估计的多次迭代推导出各参数值。在大部分情况下,线性模型就可以通过一系列连续型或类别型预测变量来预测正态分布的响应变量的工作。但是,有时候我们要进行非正态因变量的分析,例如:(1)类别型.._广义线性回归模型

HTML+CSS大作业 环境网页设计与实现(垃圾分类) web前端开发技术 web课程设计 网页规划与设计_垃圾分类网页设计目标怎么写-程序员宅基地

文章浏览阅读69次。环境保护、 保护地球、 校园环保、垃圾分类、绿色家园、等网站的设计与制作。 总结了一些学生网页制作的经验:一般的网页需要融入以下知识点:div+css布局、浮动、定位、高级css、表格、表单及验证、js轮播图、音频 视频 Flash的应用、ul li、下拉导航栏、鼠标划过效果等知识点,网页的风格主题也很全面:如爱好、风景、校园、美食、动漫、游戏、咖啡、音乐、家乡、电影、名人、商城以及个人主页等主题,学生、新手可参考下方页面的布局和设计和HTML源码(有用点赞△) 一套A+的网_垃圾分类网页设计目标怎么写

C# .Net 发布后,把dll全部放在一个文件夹中,让软件目录更整洁_.net dll 全局目录-程序员宅基地

文章浏览阅读614次,点赞7次,收藏11次。之前找到一个修改 exe 中 DLL地址 的方法, 不太好使,虽然能正确启动, 但无法改变 exe 的工作目录,这就影响了.Net 中很多获取 exe 执行目录来拼接的地址 ( 相对路径 ),比如 wwwroot 和 代码中相对目录还有一些复制到目录的普通文件 等等,它们的地址都会指向原来 exe 的目录, 而不是自定义的 “lib” 目录,根本原因就是没有修改 exe 的工作目录这次来搞一个启动程序,把 .net 的所有东西都放在一个文件夹,在文件夹同级的目录制作一个 exe._.net dll 全局目录

BRIEF特征点描述算法_breif description calculation 特征点-程序员宅基地

文章浏览阅读1.5k次。本文为转载,原博客地址:http://blog.csdn.net/hujingshuang/article/details/46910259简介 BRIEF是2010年的一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出,BRIEF是对已检测到的特征点进行描述,它是一种二进制编码的描述子,摈弃了利用区域灰度..._breif description calculation 特征点

房屋租赁管理系统的设计和实现,SpringBoot计算机毕业设计论文_基于spring boot的房屋租赁系统论文-程序员宅基地

文章浏览阅读4.1k次,点赞21次,收藏79次。本文是《基于SpringBoot的房屋租赁管理系统》的配套原创说明文档,可以给应届毕业生提供格式撰写参考,也可以给开发类似系统的朋友们提供功能业务设计思路。_基于spring boot的房屋租赁系统论文