转自:http://www.tuicool.com/articles/aURnim

随着网络技术的发展、internet的全球化,信息共享程度被进一步提高,各种基于互联网的应用如电子政务、电子商务日益增多并愈加被人们工作和 生活依赖。但是,由于互联网的开放性和通用性,网络上的信息是对所有人公开的,这就使网络上的数据传输过程中存在被窃听、篡改等安全隐患,并极有可能给用 户带来不可估量的损失。为此,各种保证数据在互联网上安全传输的机制纷纷出现,而OpenSSL(Sercure Socket Layer)技术就是其中之一。

什么是SSL?

SSL(Sercure Socket Layer)  由于数据在传输层和网络层传送以及封装均已明文方式存在,不能加密,而应用层只能对数据本身加密不能保证数据传过程中的安全,SSL则是工作在 TCP/IP协议与应用层协议之间,实现数据传输的安全和数据完整性的一种协议。该协议能通过多种加、解密方式结合证书机制来完成安全认证、访问控制、数 据保密性、数据完整性和通讯的不可否认性等功能。而OpenSSL则是SSL的开源实现。

数据的加密、解密

根据密码算法和协议,数据的加密、解密方式可以分为四类:

1、对称加密   所谓对称加密是指通信的双方使用同一个密钥来进行加解密。算法使用DES、AES、Blowfish、Twofish、IDEA、RC6、CAST5等, 使用该加密方式的客户端,对每一个通讯对象都要维护一个密钥并且无法保证密钥交换、身份验证和数据完整性验证,并且易于受到基于字典穷举方式攻击。

2、非对称加密 又称公钥加密。使用此种加密方式通讯方会通过算法生成成对存在的私钥和密钥,使用私钥加密的数据只能用自己的公钥解密,反之亦然。因此可以以较为公开的方 式将公钥传送给通讯对方,而对方可以通过是否能使用此公钥来解密相应的数据信息来验证通讯方的身份,完成网络通讯安装的身份验证。该加密方式使用的算法有 RSA(用于加密和身份验证)、DSA(只能实现身份验证)EIGamal等,由于这些算法的密钥位数过长(一般都是2048位及以上),因此一般不用于 加密数据,只是用于身份验证。

3、 单向加密   又称数据完整性校验加密方式,可以利用算法计算数据指纹信息,此种方式得出的数据指纹信息具有定长和雪崩效应(数据中的微小变化将会导致数据指纹信息的巨大变化)的特性,常用来实现数据完整性的验证。

网络数据传输的加密、解密过程

如上图场景,加密解密过程如下:

第一步,用户B向服务器A发起访问请求,并携带自己的证书信息。

第二步,服务器A收到用户B发来的证书后,查找系统内置或通过其它可靠途径获得证书公钥解密(非对称加密)证书的签名信息,完成CA的合法身份验 证,并得到签名信息的特征码,而后使用同样的算法提取签名信息的特征码与之对比,完成签名信息的完整性校验。随后从用户B中发来的证书中提取用户B的公钥 信息,最后将自己的证书发送给用户B。

第三步,用户B收到服务器A发来的证书,使用与之同样的证书验证流程验证证书的合法性以及完整性,提取服务器A的公钥信息。

第四步,服务器A将需要发送给用户B的数据分段后通过以下步骤对其进行加密(以数据段S0为例进行详解):

1、使用单向加密算法,提取数据的SO的特征码信息。 #用到单向加密

2、使用自己的私钥加密上一步提取出来的特征码信息,而后将其附在数据S0后面,组成数据段S1。#用到公钥加密

3、通过算法生成密钥,利用对称加密对数据段S1进行加密,生成加密后的数据段S2。#用到对称加密

4、使用用户B的公钥将上一步生成的密钥加密后将其附在数据段S2后面,生成数据段S3。最后将S3发送给用户B。#用到公钥加密

第五步,用户B收到服务器A发来的数据段S3后通过一下步骤进行解密:

1、使用自己的私钥解密数据段S3,得到服务器A生成的对称加密密钥和数据段S2。#使用公钥加密和对称加密完成密钥交换

2、使用上一步解密得到的密钥解密数据段S2得到加密后的数据特征码(由服务器A通过单向加密基于数据段SO提取而得)和明文数据段S0。

#用到对称加密

3、使用自己的私钥解密上一步得到的数据特征码,然后使用与服务器A相同的单向加密的算法提取明文数据S0的特征码与之比对,比对结果正确则说明数据时完整的。#通过单向加密和公钥加密同时完成整数据完整性认证和身份验证

PKI 公钥基础设施

通过上面的详述,我们已经对网络数据传输加密解密的过程有了清晰的认识,而这个过程中的关键之处即通讯双方公钥(证书)的获取是要依赖于PKI这个服务平台来实现的,下面来详细的了解一下它。

PKI(Public Key Infrastructure) 公共基础设施,是一种提供公钥加密和数字签名的平台,目的是为了管理密钥和证书。一个完整的有效的PKI由如下组成部分:

          1、认证机构CA       数字证书的申请及签发机关,CA必须具备权威的特性。

2、数据证书库        用于存储已签发的数据证书和公钥,用户可由此获得所需的其他用户的证书以及公钥。

3、密钥备份和恢复系统 为防止用户解密密钥丢失造成数据无法解密而存在,此功能必须由可信机构完成,并且密钥备份只备份解密密钥,签名密钥为保证其唯一性不做备份。

4、应用接口(API) 为方便用户使用加密、数字签名等安全服务而提供的良好的应用接口,使得各种应用能以安全、一致可信的方式与PKI交互,确保网络环境的完整性和易用性。

5、证书作废系统    PKI的必备组件,用来作废那些由于于用户密钥丢失、证书过期、以及证书持有者身份变更等导致证书信息已不可用的证书。

CA

通常来说,CA是PKI系统的核心,为实现证书发放、证书更新、证书撤销和证书验证等功能,CA由以下几个部分组成:

1、注册服务器:用于实现客户在网上提出证书申请和填写证书相应的证书申请表。

2、证书申请受理和审核机构:用来接受客户的证书申请并进行审核。

3、认证中心服务器:用于数字证书的生成、发放,提供发放证书的管理、证书吊销列表的生成和处理。

具体实施时,CA要做以下工作:

1、验证并标识证书申请者的身份。

2、确保用于证书签名的公钥加密密钥对的保密性。

3、确保签名过程的安全性,确保签名私钥的安全性。

4、证书资料(证书序列号、CA标识等)的管理。

5、确保并检查证书的有效期。

6、确保数字签名证书的唯一性。

7、及时更新并发布证书吊销列表。

8、维护证书签订过程的日志记录。

9、将证书发送给申请人。

数字证书的通用格式为X509格式,其证书结构如下图:

OpenSSL

在我们的linux平台上, 加密和解密、PKI以及CA等 一系列的保证网络数据安全传输的机制 ,都是通过openssl这个开源的工具来实现的,因此能深刻的了解它对于学习后面的高级相关应用是至关重要的。

执行yum -y install openssl,安装完成后,我么可以通过rpm -ql openssl来查看其安装后生成的、比较常用的路径和文件。如下图

openssl是一个多用途的命令行工具,可以调用子命令分别实现加密、解密,创键私有CA以及CA管理的功能。

openssl的用法

1、查看openssl版本号 使用openssl version

2、对称加密

工具 openssl enc  算法DES 3DES AES Blowfish Twofish RC6 IDEA CAST5等。

用法 openssl enc

-e 加密操作

-d 解密操作

-ciphername 指定算法

-a 指定基于base64编码处理数据

-in /path/from/somefile 指定需要加密的文件的

-out /path/to/somefile 指定文件加密后存储位置

-salt 添加字符串增加密码强度

例:将/var/log/messages拷贝至/tmp/下使用DES算法进行加密解密,并使用cat查看验证。

加密并验证

解密并确认

3、单向加密

工具 openssl dgst,md5sum,sha1sum,chsum

openssl dgst -[md5|sha1] [-out /path/tosomefile] /path/form/somefile

– [md5|sha1] 指定算法

-out /path/to/somefile 将提取的特征码信息保存到指定文件,不指定输出到屏幕

/path/from/somefile 指定需要执行单项加密的文件

例: 将/var/log/messages拷贝至/tmp/下,分别使用openssl dgst -md5 和md5sum对其进行单向加密

4、加密用户密码

openssl passwd -1 -salt SALT SALT一般是8位的字符串 (-1 指定使用md5进行加密,CentOS 6 一般使用sha512)

例:

其中-salt后面的字符串可以使用随机获取字符来替代,

openssl 随机生成字符串

openssl rand [-hex|-base64] number (number指定生成随即字符串的位数)

-hex 指定十六位编码模式

-base64 指定base64编码模式

例:

5、公钥加密

生成密钥 openssl genrsa -out /path/to/keyfile number

例:

提取公钥信息

openssl rsa -in /path/from/privat_keyfile [-out /path/to/pub_keyfile] -pubout 如果-out选项不指定则输出结果到屏幕

     

6、搭建私有CA

由于证书的注册费用相当昂贵,而有时候我们只是需要在公司内部或VPN相连的虚拟内网中利用CA认证来管理服务器资源,这个时候我们就可以利用openssl来搭建私有的CA服务器,用以签名、颁发证书,管理已签名证书和已吊销证书等。

首先,配置服务器端

第一步,配置CA服务器的主配置文件,设定默认私有CA配置信息。

第二步,初始化CA环境,在/etc/pki/CA/下建立证书索引数据库文件index.txt和序列号文件serial,并为证书序列号文件提供初始值。

第三步,生成密钥,生成自签署证书。

生成密钥并保存到/etc/pki/CA/private/cakey.pem

生成根证书

命令 openssl req 常用的选项如下

-new  生成新证书请求

-x509 特指生成根证书 而不是证书请求

-key /path/from/file_key.pem  指定生成的密钥文件(根证书必须是/etc/pki/CA/private/cakey.pem, 主配置文件中已定义)

-out /path/to/file_cert.pem   指定根证书的名字以及存放路径(必须是/etc/pki/CA/cacert.pem,主配置文件中已定义)

-days 证书的有效期限

本CA的根证书创建:

至此,CA搭建完毕。

7、这台虚拟服务器配置了http服务,我们可以来为http服务器申请证书,并在本机签名证书来验证CA。

第一步,创建目录/etc/httpd/ssl用来存放密钥文件和证书申请文件;创建密钥文件和证书申请文件

第二步 签署,证书,由于节点和CA都在同一台主机,因此可以直接签署

证书签署命令openssl ca -in /path/from/somefile.csr -out /path/to/somefile.crt -days -in指定证书请求文件,-out指定证书生成文件以及路径

验证index.txt和serial序列号更新

8、同样以http服务器为例,以一台主机作为节点验证私有CA

第一步,创建目录/etc/httpd/ssl用来存放密钥文件和证书请求文件、证书;创建密钥文件、创建证书请求文件。

第二步,将证书请求文件发送给CA;CA签完证书后将证书发送给节点主机

节点与CA间的文件发送,使用scp (sercure cp)命令

scp /path/from/somefile x.x.x.x:path/ (其中x.x.x.x是主机IP地址)

已发送到CA主机,到CA上去签署证书

CA签署完证书,并将证书发送回节点/root下,节点可以自定义存放至/etc/httpd/ssl/下。

上图验证信息库。

9、吊销证书

把第8部分申请的证书吊销,用来验证吊销列表

第一步,查看证书的序列号

openssl x509 -in /path/from/certficate_file.crt -noout -serial -subject

x509 指定证书类型

-in /path/from/certficate_file.crt 指定需要吊销的证书

-noout 不输出多余信息

-serial 输出序列号

-subject 输出摘要信息

CA上查看index.txt比对subject信息

第一次执行证书吊销要创建吊销列表文件,并传递初始值,然后吊销证书

吊销证书

openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem(SERIAL.pem是需要吊销的证书的序列号对应的证书文件)

更新并生成吊销列表

查看吊销列表

openssl crl -in /path/from/some.crl -noout -text

-in /path/from/somefile.crl 指定吊销列表文件

-noout 不输出额外信息

-text  文本显示

Openssl与私有CA搭建的更多相关文章

  1. 使用 OpenSSL 创建私有 CA:3 用户证书

    OpenSSL 创建私有 CA 三部曲:使用 OpenSSL 创建私有 CA:1 根证书使用 OpenSSL 创建私有 CA:2 中间证书使用 OpenSSL 创建私有 CA:3 用户证书 在前文&l ...

  2. 使用 OpenSSL 创建私有 CA:2 中间证书

    OpenSSL 创建私有 CA 三部曲:使用 OpenSSL 创建私有 CA:1 根证书使用 OpenSSL 创建私有 CA:2 中间证书使用 OpenSSL 创建私有 CA:3 用户证书 本文将在前 ...

  3. 使用 OpenSSL 创建私有 CA:1 根证书

    OpenSSL 创建私有 CA 三部曲:使用 OpenSSL 创建私有 CA:1 根证书使用 OpenSSL 创建私有 CA:2 中间证书使用 OpenSSL 创建私有 CA:3 用户证书 OpenS ...

  4. 如何通过Openssl实现私有CA,并为HTTP服务提供TLS/SLL安全机制

    原文链接:http://guodayong.blog.51cto.com/263451/1181059 Openssl是SSL的开源实现(可以免费下载应用程序),是一种安全机密程序,主要用于提高远程登 ...

  5. 图解openssl实现私有CA

    原文地址:http://xxrenzhe.blog.51cto.com/4036116/1370114 废话不多说,先上图 说明1:蓝色部分为主要流程,黄色箭头指向具体的操作步骤 什么是openssl ...

  6. OpenSSL创建私有CA

    1.编辑/etc/pki/tls/openssl.cnf [ CA_default ] dir             = /etc/pki/CA           # 工作目录certs      ...

  7. 利用openssl自建CA体系

    使用 OpenSSL 创建私有 CA:1 根证书 使用 OpenSSL 创建私有 CA:2 中间证书 使用 OpenSSL 创建私有 CA:3 用户证书 今天跟着上面的三部曲,做了一下openssl的 ...

  8. 搭建私有CA并基于OpenSSL实现双向身份认证

    0x00 前言 互联网上的Web应用由于用户数目广泛,都是采用单向身份认证的,只需要客户端验证服务端的身份.但如果是企业内部的应用对接,客户端数量有限,可能就会要求对客户端也做身份验证,这时就需要一个 ...

  9. 搭建私有CA

    一.实验目的 搭建私有CA并使其可以实现公司内部的的签名服务. 二.实验环境: 系统架构:Centos7(服务器).Centos6(需要申请证书的服务器)需要的软件包:openssl.openssl- ...

随机推荐

  1. Spring事物的属性

    链接:https://www.nowcoder.com/questionTerminal/1c65d30e47fb4f59a5e5af728218cac4?orderByHotValue=2& ...

  2. OpenStack配置串口显示虚机界面

    OpenStack配置串口显示虚机界面 OpenStack的horizon能够显示虚拟机的界面.horizon是web界面,在我们的电脑上,姑且称之为本地,虚拟机运行在远端服务器上,称之为远端.本地显 ...

  3. JavaSE回顾及巩固的自学之路(一)——————前言

    长长的呼出一口气,终于到了末端了,JavaSE,Java入门的基础,历经一个多月,终于细细的学了一遍,大部分的时间都是熬夜到半夜两点钟.本来是一个月的课程,足足让我给学了将近两个月,为什么呢?第一,还 ...

  4. springboot 02-PropertiesFile 自定义配置属性,多环境配置

    application.properties: # 自定义配置 test.hello.world = HelloWorld test.person.name = 哈哈 test.person.sex ...

  5. Docker(五)如何构建Dockerfile

    摘自 https://mp.weixin.qq.com/s/_hq9dPe6390htN8BTkoQeQ 一.Dockerfile的指令集 由于Dockerfile中所有的命令都是以下格式:INSTR ...

  6. Js JSON.stringify()与JSON.parse()与eval()详解及使用案例

    (1)JSON.parse函数 作用:将json字符串转换成json对象. 语法:JSON. parse(text[,reviver]). 参数:text  必须:一个有效的json字符串. revi ...

  7. javascript数据类型和常用内置对象(重要!)

    数据类型:w3c undefind  null  string  number  boolean  Array   object 常用内置javascript对象: Array对象:Date对象:正则 ...

  8. Windows命令查看文件MD5,SHA1,SHA256 文件校验

    certutil -hashfile yourfilename.ext MD5 certutil -hashfile yourfilename.ext SHA1 certutil -hashfile ...

  9. DedeCMS找后台目录漏洞

    参考文章 https://xianzhi.aliyun.com/forum/topic/2064 近期,学习的先知社区<解决DEDECMS历史难题--找后台目录>的内容,记录一下. 利用限 ...

  10. jQuery $.ajax传递数组的traditional参数传递必须true

    起初我认为traditional:true,可有可无,但是后来不用traditional的时候,发现后台无法获取selectUsers的值,那么可以肯定的是traditional默认值是false.当 ...