openssl基础应用

参考http://www.178linux.com/2704

http://www.williamlong.info/archives/837.html

一、前言

什么是openssl?讲openssl之前我们先了解下什么是ssl?ssl是secure socket layer的简称,其使用对称加密解密,非对称加密解密(公钥加密解密),单向加密解密结合证书实现数据传输安全。openssl默认是在系统安装时就安装上去的。

二、加密解密基础

2.1.1、对称加密

对称加密解密使用同一个口令,它将明文分割成固定大小的块,逐个进行加密解密。对称加密可以使用加密算法实现,如DES,3DES,AES,RC6等。基本上基于口令加密都容易遭到暴力破解,特别是弱口令。

对称加密过程示意图

blob.png

解析:1.hostA中有一段明文plain text,它使用对称加密算法加密,加密后的结果是一段密文,假设密文内容为cipher text

   2.密文cipher text在网络中传输到达hostB

   3.hostB使用对称解密开这段密文得到内容为plain text

2.1.2对称加密演示

[root@vm tmp]# openssl enc -des3  -a -in /tmp/fstab  -out /tmp/testEnc2 -salt      #通过子命令enc生成一个被加密的文件
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:
[root@vm tmp]# ls
fstab  testEnc2
[root@vm tmp]# tail -3 testEnc2                    #tail被加密的文件发现其是一大段意义不明的字符串
3GQbP7EL/w/XGGweQ7Xb+ekahJ3+BJ5yJcLaBmXolyK/iYNhrOkGvuYQ4yeHEyNi
/YZwVVWWO+5CwD+C4ex+bMX/r9ZATyB1r1Cs99t00pELe2OfJq4zI1kg2f2nBn6O
heakkClQGYE=
[root@vm tmp]# openssl enc -d -des3 -a -salt -in /tmp/testEnc2 -out /tmp/lookEnc2   #使用-d参数解密被加密的文件
enter des-ede3-cbc decryption password:
[root@vm tmp]# tail -3 /tmp/lookEnc2
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0

2.2.1、非对称加密(公钥加密)

非对称加密使用一组密钥来进行加密,启动公钥通过某种方式从私钥中取出。当使用公钥加密时只有对应的私钥可以解密,当使用私钥加密时,只有对应的公钥可以解密。非对称加密常用的加密算法有RSA,DSA,EIGamal等。

非对称加密过程示意图

使用公钥加密

公钥加密.jpg

解析:1.alice与bob通信,alice使用bob的公钥对plaintext加密

   2.然后把加密的数据传输给bob

   3.bob使用自己的私钥解密这段密文,得出plaintext

使用私钥加密

私钥加密.jpg

解析:1.alice与bob通信,alice使用自己的私钥加密plaintext

   2.加密的数据传输给bob

   3.bob使用alice的公钥解密,得出plaintext

2.2.2、非对称加密演示

[root@vm tmp]#(umask 077;openssl genrsa -out /tmp/mykey  1024)   #小括号中的内容只对子shell有效,对当前shell无效,
Generating RSA private key, 1024 bit long modulus
........++++++
...................++++++
e is 65537 (0x10001)
[root@vm tmp]# tail -3 /tmp/mykey
R6petXjJEm0jx7ROMQJBAI8kzvCsVSciokdgQbKTVhxAvkPO09655EUnSl0g+7o0
gpIIdCDCZPq12wlWr4rTtbyr1SCIQgnCTpLbhaeOwiI=
-----END RSA PRIVATE KEY-----
[root@vm tmp]# openssl rsa -in /tmp/mykey -out /tmp/pubkey -pubout  #通过rsa子命令从私钥中提前公钥
writing RSA key
[root@vm tmp]# tail -3 /tmp/mykey
R6petXjJEm0jx7ROMQJBAI8kzvCsVSciokdgQbKTVhxAvkPO09655EUnSl0g+7o0
gpIIdCDCZPq12wlWr4rTtbyr1SCIQgnCTpLbhaeOwiI=
-----END RSA PRIVATE KEY-----

2.3、单向加密

单向加密是一个定长输出一段特征码,当数据改变时,那么其特征码也变了。无法再还原回去,即雪崩效应。常用的单向加密算法有MD5,SHA1,SHA256,SHA512等等。

[root@vm tmp]# openssl dgst -md5 -out /tmp/testDgst /tmp/fstab       #通过dgst子命令提取fstab的指纹信息
[root@vm tmp]# echo 1 >> /tmp/fstab                                    #修改fstab文件
[root@vm tmp]# openssl dgst -md5 -out /tmp/testDgst2 /tmp/fstab      #再次提前指纹信息
[root@vm tmp]# cat /tmp/testDgst*
MD5(/tmp/fstab)= b3aaa48b658b3ef180665b40ccb438f8                          #发现fstab指纹信息不一致
MD5(/tmp/fstab)= b26bf7c4625b7aee995ffacaa086f95a

2.4、数据包在网络中安全传输过程

如下图

blob.png

三、基于证书的认证

由于在网络上传输公钥,很容易被别有用心的人莫名顶替,从而造成一些麻烦事。如果我们不直接传送公钥,而是证书,并且可以通过第三方认证机构来验明证书是否有效,那么就安全多了。PKI正是(Publick Key Infrastructure)公钥基础设施提供公钥加密和数字签名,目的是为了了管理密钥和证书,一个机构通常采用PKI架构管理密钥和证书可以建立一个安全的网络环境。提到PKI,我们不得不提下X.509定义了证书的格式,大体如下图

 blob.png

3.1、自建CA

在内网环境中,我们如果对数据传输安全性要求较高,又不想投入大量的金钱。那么自建一个CA是一个不二的选择。

CA工作过程如下图

blob.png

实际过程可能比图中所示更复杂,这里这个给出个大概,下面将讲解自建CA的基本过程,对于需要CA实地考察公司之类,发送文件给CA或者CA把证书发送给客户端中这些过程由于是做实验,这些一笔带过。

3.1.1、服务器端建立CA

1.生成密钥

(umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048 -des3)    #生成ca的私钥,长度2048
Generating RSA private key, 2048 bit long modulus
.................+++
..........................................+++
e is 65537 (0x10001)

2.自签证书

[root@vm ~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN                                   #所填的信息中包含一部分x.509定义证书的一部分信息
State or Province Name (full name) []:SZ   
Locality Name (eg, city) [Default City]:SZ
Organization Name (eg, company) [Default Company Ltd]:LEON
Organizational Unit Name (eg, section) []:LEON
Common Name (eg, your name or your server's hostname) []:vm
Email Address []:

3.初始化工作环境

[root@vm ~]# touch /etc/pki/CA/{index.txt,serial}
[root@vm ~]# echo 01 >/etc/pki/CA/serial

3.1.2、客户端申请证书

1.生成密钥对及证书请求

[root@vm ~]# mkdir /etc/rsa && (umask 077 ;openssl genrsa -out /etc/rsa/my.key 2048 -des3)   #客户端生成密钥对
Generating RSA private key, 2048 bit long modulus
.......+++
.........................+++
e is 65537 (0x10001)
 
[root@vm ~]# openssl req -new -key /etc/rsa/my.key -out /etc/rsa/my.csr            #生成证书请求
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:SZ
Locality Name (eg, city) [Default City]:SZ
Organization Name (eg, company) [Default Company Ltd]:LEON
Organizational Unit Name (eg, section) []:LEON
Common Name (eg, your name or your server's hostname) []:vm
Email Address []:
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

3.把签署请求文件发给CA服务器

由于我们是同一台主机上做实验,故不需要把my.csr证书请求文件发送给ca服务器

3.2、服务器签署证书

3.2.1 服务器签署证书

[root@vm ~]# openssl ca -in /etc/rsa/my.csr -out /etc/rsa/my.crt -days 365   #签署证书,有效期为365天
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Sep 19 20:59:44 2015 GMT
            Not After : Sep 18 20:59:44 2016 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = SZ
            organizationName          = LEON
            organizationalUnitName    = LEON
            commonName                = vm
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                05:86:66:D3:31:06:06:2F:B4:E0:60:F3:42:E1:95:2B:BA:33:40:F7
            X509v3 Authority Key Identifier:
                keyid:72:50:29:0A:4B:D9:9B:A0:BF:E0:D1:7F:8E:3B:E0:F5:B9:40:30:69
 
Certificate is to be certified until Sep 18 20:59:44 2016 GMT (365 days)
Sign the certificate? [y/n]:y
 
 
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
 
[root@vm CA]# cat index.txt     #查看index文件,存放证书subject信息,其中V表示可用证书
V       160918205944Z                01     unknown  /C=CN/ST=SZ/O=LEON/OU=LEON/CN=vm
[root@vm CA]# cat serial        #查看下一个预将生成的版本号
02

3.2.2发送给请求者

由于在一台主机上操作,服务器端和客户端都是自己,故不需要发送给请求者

3.3、证书吊销

1.获取证书节点

[root@vm CA]# openssl x509 -in /etc/rsa/my.crt -noout -serial -subject   #获取证书节点信息(serial和subject)
serial=01
subject= /C=CN/ST=SZ/O=LEON/OU=LEON/CN=vm

2.CA根据节点提交的serial和subject信息来验证inxex.txt文件中信息是否一致

[root@vm CA]# cat index.txt     
V       160918205944Z                01     unknown  /C=CN/ST=SZ/O=LEON/OU=LEON/CN=vm

3.吊销证书

[root@vm CA]# openssl ca -revoke /etc/pki/CA/newcerts/01.pem              #吊销证书
Using configuration from /etc/pki/tls/openssl.cnf
Revoking Certificate 01.
Data Base Updated

4.生成吊销证书的编号(如果是第一次吊销)

echo 00 > /etc/pki/CA/crlnumber

5.更新证书吊销列表

[root@vm crl]# openssl ca -gencrl -out thisca.crl
Using configuration from /etc/pki/tls/openssl.cnf

四、总结

对称加密、非对称加密、单向加密这三个算法需要了解其加密过程,对于了解如何在网络上安全传输数据有很大的帮助,openssl是个强大的工具,但是其命令也非常多。故我们使用过程中可能会忘记这个命令的使用方法,这个时候只有man下这个命令。由于本人画图技术水平太烂,故一不小心去copy了下其他人的图片,文章开头已指明参考文档。

 

原创文章,作者:成吉思汗,如若转载,请注明出处:http://www.178linux.com/8379

赞 (0)
成吉思汗成吉思汗
上一篇 2015-09-27 15:54
下一篇 2015-09-28 15:37

相关推荐

  • N26 第六周博客作业

    请详细总结 vim 编辑器的使用并完成以下练习题 ## VIM 使用总结 首先 VIM 是 VI IMproved 的缩写,是 vi 编辑器的增强型。它与 sed awk 并称为文本处理三剑客。其主要作者 Bram Moolenaar 也是个非常有爱心的人,在 vim 的[官网](http://www.vim.org/) 和 在命令行中直接输入 vim 的命…

    Linux干货 2017-03-11
  • 磁盘管理之文件系统

    一,概述 文件系统是操作系统用于明确存储设备或分区上的文件的方 法和数据结构;即在存储设备上组织文件的方法。操作系统 中负责管理和存储文件信息的软件结构称为文件管理系统, 简称文件系统。  从系统角度来看,文件系统是对文件存储设备的空间进行组 织和分配,负责文件存储并对存入的文件进行保护和检索的 系统。具体地说,它负责为用户建立文件,存入、读出、修…

    Linux干货 2016-09-05
  • Linux操作系统发展史

    内容摘要:Linux操作系统的诞生,Linux 的发展,Linux的特性决定其迅猛发展,Linux的应用领域与发展前景 关键词:Linux的发展  前景   1.  Linux操作系统的诞生 在1981年到1991年十年间,微软公司的MS-DOS系统一直主宰操作系统的市场,其价格十分昂贵,另一个操作系统UNIX的经销商为了高利润…

    Linux干货 2016-10-14
  • iptables/netfilter入门到进阶

    防火墙的概念 Firewall:工作于主机或网络边缘,对于进出本主机或网络的报文根据事先定义的规则作匹配检测,对于更改被规则匹配到的报文做出相应处理的组件 网络层防火墙(包过滤防火墙): 优点:对用户来说透明,处理速度快且易于防护 缺点:一旦黑客突破防火墙,就可以请以伪造数据包源地址、目的地址和IP端口号 代理服务型防火墙(Proxy Service) 优点…

    2017-06-17
  • N25_第六周

    1、复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#; %s@^[[:space:]]+@#&@g 2、复制/boot/grub/grub.conf至/tmp目录中,删除/tmp/grub.conf文件中的行首的空白字符; %s@^[[:spac:]]+@@g…

    Linux干货 2017-02-13
  • 用“逐步排除”的方法定位Java服务线上“系统性”故障

    一、摘要 由 于硬件问题、系统资源紧缺或者程序本身的BUG,Java服务在线上不可避免地会出现一些“系统性”故障,比如:服务性能明显下降、部分(或所有)接口超 时或卡死等。其中部分故障隐藏颇深,对运维和开发造成长期困扰。笔者根据自己的学习和实践,总结出一套行之有效的“逐步排除”的方法,来快速定位Java 服务线上“系统性”故障。 二、导言 Java 语言是广…

    2015-02-28

评论列表(1条)

  • Vicky
    Vicky 2015-09-27 16:02

    内容很实用~