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

智能推荐

Oracle弃用Nashorn JavaScript引擎_糖糖糖糖糖糖糖糖糖糖糖糖糖糖糖糖糖糖的博客-程序员ITS304

Oracle通过JDK增强提案(JEP)355宣布弃用Nashorn JavaScript引擎,最终将从未来所有的JDK中删除。ECMAScript的语言结构变化太快,Oracle发现,维护Nashorn JavaScript引擎变得非常困难。\\Nashorn最初是在JDK 8中引入的,用于取代Rhino脚本引擎。当其发布时,Nashorn是ECMAScript-262 5.1的完整实现,增强了...

pajek06-09:中心度_qq_34322002的博客-程序员ITS304

1、局部中心度2、整体中心度3、Network>Create Vector>Centrality>Degre>All4、中心度:点的中心度中心势:网络的中心度

7.(开发工具篇kibana)Kibana安装与启动_地图之家家长的博客-程序员ITS304_kibana开发工具

听老人家说:多看美女会长寿前言:Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana,可以通过各种图表进行高级数据分析及展示。Kibana让海量数据更容易理解。它操作简单,基于浏览器的用户界面可以快速创建仪表板(dashboard)实时显示Elasticsearch查询动态。1、Kibana官方下载地址https://www.elastic.co/cn/downloads/kibana一定要装与El

性能优化——内存泄漏(3)代码分析篇_GitLqr的博客-程序员ITS304

一、简述在上一篇《性能优化——内存泄漏(2)工具分析篇》中,介绍了如何使用工具帮助我们检查APP中是否存在内存泄漏、及如何定位到内存泄漏,但项目并不能完全依赖工具来检查,毕竟定位内存泄漏比较麻烦,还不如在开发时就考虑到内存泄漏问题,尽可能减少内存泄漏,后续优化才不会那么痛苦。下面就来看看开发中,哪些代码可能造成内存泄漏,及避免内存泄漏的对应解决方案。二、代码分析1、静态变量引起的内存泄露1)错误示例

正则校验金额_程序原SpringCloud的博客-程序员ITS304_正则校验金额

只能正数金额:(^[1-9](\d+)?(\.\d{1,2})?$)|(^0$)|(^\d\.\d{1,2}$)允许负数金额:(^-?[1-9](\d+)?(\.\d{1,2})?$)|(^-?0$)|(^-?\d\.\d{1,2}$)@ApiModelProperty(value = "最高收取的手续费(单位 元)")@NotNull(message = "最高收取的手续费不能为空")@Digits(integer = 5, fraction = 2, message = "amo

linux mint下安装hostapd并配置802.1X认证_代码狙击者的博客-程序员ITS304

        本实验的目的是在Linux Mint18的环境下安装hostapd来实现802.1x,其中mint作为路由的功能,即将hostapd设置为radius客户端。而要入网的是一部android手机,认证的radius服务器是运行在centos6.8上的freeradius。【hostapd简介】         hostapd 是用户控件的守护进程用于无线接入点(AP)和授权服...

随便推点

ffmpeg代码分析(1)--编译裁剪_茜茜她老爹的博客-程序员ITS304_ffmpeg 裁剪编译

我们很少使用到ffmpge完整的功能库,大部分时候,只需要特定的编解码 传输协议,那么该怎么裁剪ffmpeg呢?答案就是configure命令。configure 是一个文本文件,打开以后我们会发现它有很多命令,如下Help options:  --help                   print this message  --list-decoders        

Unity项目常见Lua解决方案性能比较_weixin_33946605的博客-程序员ITS304

测试说明Unity不支持热更新这事情一直是谜一样的痛点,特别是在作者第一个项目上线之后,发现每次更新代价实在太大,可惜官方Roadmap上迟迟没有出现这个功能。UWA之前分享过 Android平台热更新解决方案,直接替换dll是一种解决方式(但iOS上因为使用IL2CPP故而无法实现,而且这事本质上为商业原因而非技术问题)。除此之外还有一个比较常见的...

使用Git连接Gitee进行Unity开发项目_funny囧t的博客-程序员ITS304_gitee unity

将项目上传到Gitee进行协同开发如图建立一个仓库下载并安装Git,可看网上的教程在所需上传到Gitee的项目文件目录右键并选择Git Bash输入git init,将该文件目录作为本地git库,此时会生成两个隐藏文件,目录出现master分支输入git.remote add Project https://gitee.com/rookiestudios/Project(这个Project是你在Gitee新建的仓库名称).git,将git关联到仓库并且命名输入git pull Project

算法竞赛入门经典——高效算法——巨人与鬼_qq_27559181的博客-程序员ITS304

巨人与鬼:题目:一组n个巨人正与n个鬼进行战斗,每个巨人的武器是一个质子炮, 它可以把一串质子流射中鬼而把鬼消灭。质子流沿直线行进,在击中鬼时就终止。巨人决定采取下述策略。他们寻找鬼配对,以形成n个巨人─鬼对,。然后每个巨人同时向他选取的鬼射出一串质子流。我们知道,让质子流互相交叉是很危险的。因此巨人选择的配对方式应该使质子流都不会交叉。假定每个巨人和每个鬼的位置都是平面上的一个固定点,并且没有三...

ofbiz项目编译及idea启动_东泽312的博客-程序员ITS304_ofbiz启动

idea2021版启动ofbiz项目1 进入项目根目录2 通过ant清理项目3 通过ant编译项目4 需要确保编译成功5 idea引入ofibz项目记录下来idea是如何导入和启动ofbiz项目的1 进入项目根目录2 通过ant清理项目3 通过ant编译项目4 需要确保编译成功5 idea引入ofibz项目确认下根路径没有问题几个要修改的地方添加vm选项-server -XX:PermSize=512M -XX:MaxPermSize=1024m编译完成后

推荐文章

热门文章

相关标签