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中pga指什么,oracle中pga内存分配原则-程序员宅基地

文章浏览阅读1.8k次。pga_aggregate_target 通常缩写为P_A_T,该参数同时限制全局pga分配和私有工作区内存分配在oracle9i以及10gr1中,单个sql操作内存使用存在如下限制:对于串行操作,单个sql操作能够使用的pga内存按照一下原则分配:MIN(5%*PGA_AGGREGATE_TARGET,100MB)此处的5%*PGA_AGGREGATE_TARGET实际上是由_smm_nax_s..._19c pga分配原则

c语言编译优化原则,KEIL编译器【C语言编译选项优化等级说明】-程序员宅基地

文章浏览阅读272次。参考:https://blog..net/chengdong1314/article/details/53463183KEIL编译器C语言编译选项优化等级说明摘录于:http://blog..net/conquerwave/article/details/10450721原文0Minimum optimization. Turns off most optimizations.It gives t..._c语言代码请将优化级别设置为默认

数学建模算法python源码_如何使用python完成数学建模常见算法-程序员宅基地

文章浏览阅读997次。在数学建模中主流的编程语言是MATLAB,但随着python/R中数学软件包的不断完善,熟悉这两种编程语言的同学也可以快速数学建模的编程环节。后面我们将介绍几种常见数学建模算法的python实现,旨在展示python在本领域的强大威力。1问题描述你希望通过几种常见算法的实现,了解python在数学建模中的能力。2解决方案python除了丰富的原生数据结构外,拥有强大的第三方软件包支持,例如矩阵运算..._数模源码

三、防火墙配置(1)---防火墙常规配置_配置防火墙最后一步-程序员宅基地

文章浏览阅读7.2k次,点赞8次,收藏77次。一、实验内容1、在GNS中创建如下图所示的网络拓扑结构。2、给路由器和防火墙按照拓扑图中的规划,配置好IP地址和路由表。给R1、R2、R4、R6开启远程连接。3、验证防火墙默认安全规则,高安全级别接口(inside)可主动访问低安全级别接口(outside);低安全级别接口(outside)不能主动访问高安全级别接口(inside)。4、在防火墙上配置ACL,使R1和R2可以ping通..._配置防火墙最后一步

linux下程序启动后后台运行实现-程序员宅基地

文章浏览阅读369次。关于linux下的程序运行很简单,将源码编译成二进制(假设为proram)文件后直接在命令行运行即可,root#./program如果需要后台运行,即不占用当前终端,这在嵌入式linux显得十分有必要,因为一般嵌入式linux只有一个终端,通过rs232连接到电脑上,使用SercureCRT或者其他软件来与linux交互,如果当前终端被程序占用,那么就不能进行其他操作(此处不考虑可以通过..._正点原子linux的出厂程序为什么后台可以正常使用

DLS平台 : 跨境支付新篇章数字人民币将如何改变游戏规则?-程序员宅基地

文章浏览阅读331次,点赞8次,收藏9次。文章还将分析中新两国间数字货币直接兑换的可能性、香港“转数快”系统与数字人民币的互通,以及基于货币桥的央行数字货币跨境支付模式在中国与阿联酋之间的应用。通过分析数字人民币在新加坡旅游零售场景中的应用挑战、香港“转数快”系统与数字人民币的互通,以及基于货币桥的央行数字货币跨境支付模式,我们可以看到数字人民币在国际金融市场中扮演的角色越来越重要。未来,随着技术的进一步完善和国际合作的深入,数字人民币在全球范围内的应用将成为推动国际金融市场创新和发展的重要力量。3. 基于货币桥的央行数字货币跨境支付模式。

随便推点

EBS R12.2新特性:弹性域值集安全策略_ebs 值集 安全性-程序员宅基地

文章浏览阅读1.8k次,点赞3次,收藏8次。EBS R12.2新特性:弹性域值集安全策略弹性域值集安全策略允许系统管理员限制用户访问、添加或者更新特定的值集里的值。值集安全策略使基于角色的分类职责分离键弹性域,描述性弹性域和report参数。举例来说,你可以设置值集安全性策略,比如特定用户可以查看、插入值到任何值集,这些值集被用来做账户弹性域。一些其他用户可以访问、更新Oracle Human Capital Management applications模块下的所有弹性域值集的值。你也可以通过OU、角色、职责等来实现隔离访问。值集安全策略使用一种_ebs 值集 安全性

uniapp使用scroll-view组件实现下拉刷新跟上拉加载_scroll-view 下拉刷新-程序员宅基地

文章浏览阅读5.7k次,点赞2次,收藏12次。以上就是uniapp 使用scroll-view上拉加载跟下拉刷新功能的实现方法。_scroll-view 下拉刷新

MySQL主从复制与读写分离-程序员宅基地

文章浏览阅读843次,点赞14次,收藏25次。读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。

java 怎么读书?读不懂怎么办?读书累怎么办?不想读书怎么办?_看java书总是困-程序员宅基地

文章浏览阅读1.0k次。java 怎么读书?怎么读书?读不懂怎么办?读书累怎么办?不想读书怎么办?怎么读书?“死读书”法:用眼看,动手做,用脑理解思考总结,学以致用加工创新。读不懂怎么办?“不求甚解”式(时间充足,不懂的占少数):眼手脑过一遍,不懂就先做好标志,放一放,继续下面的阅读。“迎难而上”式(时间紧迫,不懂的占多数):遇到问题,解决问题,遇到困难,克服困难。一遍不懂,读第二遍,第三遍。这本书读不懂,我读..._看java书总是困

shader 渐变半透明效果_android shader 半透明渐变-程序员宅基地

文章浏览阅读5.1k次。// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'Shader "Custom/zhengshuang" { Properties { _MainTex ("Texture", 2D) = "white" {} _AlphaLX("RangeAlphaLX",Float) = 0 ..._android shader 半透明渐变

oracle操作字符串:拼接、截取、查找、替换_oracle拼接字符串函数-程序员宅基地

文章浏览阅读3w次,点赞19次,收藏91次。1、拼接字符串格式一:可以使用"||"来拼接字符串select '拼接'||'字符串' as str from dual 格式二:通过concat()函数实现select concat('拼接', '字符串') as str from dual 注:oracle的concat函数只支持两个参数的方法,即只能拼接两个参数,如要拼接多个参数则嵌套使用concat可实现,如:select concat(concat('拼接', '多个'), '字符串') from dual 2.1、截取字符串_oracle拼接字符串函数

推荐文章

热门文章

相关标签