首先我们肯定会问什么是OpneSSL,以及OpenSSL有什么用?当让这不仅是刚接触Linux的我想知道,相信大多数人和我一样也非常想知道,因为OpenSSL是linux上基础的服务之一,了解它的应用可以帮助我们更好的了解linux。那么我们先了解下什么是OpenSSL已经它有什么用。

一、OpenSSL及其应用

        首先我们要了解SSL是什么?SSL是Secure Sockets Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输。Netscape公司在推出第一个Web浏览器的同时,提出了SSL协议标准。其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。已经成为Internet上保密通讯的工业标准。

OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的秘钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。OpenSSL还可在局域网内构建私有CA,实现局域网内的 证书认证和授权,保证数据传输的安全性。如何构建私有CA呢?后面将详细讲述基于OpenSSL实现私有CA构建。

二、了解常用的加密方式

加密方式有对称加密 非对称加密 单向加密

     1、 对称加密:

加密和加密都用同一个对称密钥,但是,这种加密方法存在一定问题,就是密钥传输时,容易被盗窃。还有密钥管理困难,对称加密的方法:DES、AES、Blowfish、Twofish、IDEA、RC6、CAST5。

    2、  非对称加密:
公钥和私钥都可以进行加密,解密是公钥和私钥对应解密的,就好像一把锁对应多把相同的钥匙一样,公钥可以公开的,非对称加密解决了密钥传输时带来的问题,同时还解决了密钥管理的繁杂的问题。但是如果你用非对称加密的方式来加密一段数据,速度会非常慢,比对称加密的速度慢几个数量级。非对称加密的方法:RSA DSA

     3、单向加密:

单向加密是用来提取数据的特征码,为了保证数据传输时的完整性,哪怕数据发生一点的变化,特征码都会引起巨大的改变,单向加密的方法:MD5 SHA


三、数据的安全传输方式

        如上面已经提到了三种加密方式,和一些加密算法。那么在数据的传输过程中如何才能保证数据传输的安全性呢?
对于发送段和接收端,如下阐述

        1、发送端:

(1)、使用单向加密算法提取生成数据的特征码

(2)、使用自己的私钥加密特征码附加在数据后面

(3)、生成用于对称加密的临时密钥

(4)、用此临时密钥加密数据和已经使用私钥加密后的特征码

(5)、使用接收方的公钥加密此临时密钥,附加在对称加密后的数据后方

2、接收端:

(1)、使用自己的私钥解密加密的临时密钥;从而获得对称密钥

(2)、使用对称密钥解密对称加密的数据和私钥加密的特征码密文;从而获得数据和特征码密文

(3)、使用发送方的公钥解密特征码密文,从而获得从计算生成的特征码

(4)、使用与对方同样的单向加密算法计算数据的特征码,并与解密而来的进行比较

注:图片出自  http://www.178linux.com/2704

阐述中提到的公钥,用来加密;私钥用来解密。公钥与私钥的作用的作用是:用公钥加密的内容只能用私钥解密,用私钥加密的内容只能用公钥解密

四、与CA证书创建的一些内容


  如上所述,在数据的传输过程中存在很多不安全因素,因此对数据加密传输成了现在互联网上一个常用手段,那么如何多数据进行加密传输呢,我们这边就来介绍一种关于数据加密的协议,即CA证书。也许我们这边说的不是太准确,我个人的理解CA就是用于加密通信的一种实现方式。那么我们如何去创建一个CA呢,当然我这里所的创建是针对本机来说的,而对于互联网上的CA证书都是有权威机构颁发的。私人是没有权限颁发CA证书的。如果我们要创建私有CA的话,需要了解以下几个内容:

1、PKI:公钥基础设施(Public Key Infrastructure)

        包含以下组成部分:

签证机构:CA

        注册机构:RA

证书吊销列表:CRL

       证书存取库

2、X.509证书的格式:定义了证书的结构以及认证协议标准

版本号

序列号

签名算法ID

发行者名称

有效期限

主体名称

主体公钥

发行者惟一标识

主体的惟一标识

扩展

发行者签名

3、SSL:安全的套接字层(Secure Socket Layer)

        SSL的版本:

1995:SSL 2.0, Netscape

1996: SSL 3.0

1999: TLS 1.0 :改名为TLS

2006: TLS 1.1 RFC 4346

2008:TLS 1.2 :现在常用的是这个版本

2015: TLS 1.3 :这个是现在比较新的版本,还没有普及

    SSL和TCP/IP协议一样也使用了分层设计的结构,下面介绍下它的分层结构

        (1)、最低层:基础算法原语的实现,aes, rsa, md5

        (2)、向上一层:各种算法的实现

        (3)、再向上一层:组合算法实现的半成品

        (4)、用各种组件拼装而成的种种成品密码学协议/软件,如:tls, ssh,

  4、OpenSSL:程序包是开源项目

        有三个组件组成:

openssl: 多用途的命令行工具;

libcrypto: 公共加密库;

libssl: 库,实现了ssl及tls;

        (1)openssl命令详解

        查看当前openssl的版本

 
  

[root@localhost ~]# openssl version

OpenSSL 1.0.1e-fips 11 Feb 2013

        (2)对称加密实现:加密和解密使用同一个秘钥,如:

 
  

[root@localhost tmp]# openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext

#对tmp下fstab这个文件进行des3加密方式加密输出为fstab.ciphertext

enter des-ede3-cbc encryption password:        #输入密码

Verifying - enter des-ede3-cbc encryption password:       #再次输入密码

[root@localhost tmp]# tail -3 fstab.ciphertext         #查看fstab.ciphertext文件,这里就会显示编码的形式

YudNqbvUskrHCcXg6BJqUOQXG0cfxUpz77jQpwKD5F/ASUtOs+zBkKvctWe+bOTs

Az1oGEeUn5gwHp4PBvSQbZJpY+BurIr+pcwXO1lt4M2odWmV7wG1RQDHanukOUAj

EJ2S4jyoOhHO1yzlpqKjypTsGQB3IMs+969n6w4iAio=

[root@localhost tmp]# rm -rf fstab        #删除原文件

[root@localhost tmp]# openssl enc -d -des3 -a -salt -in fstab.ciphertext -out fstab

#把fstab.ciphertext解密输出为fstab文件

enter des-ede3-cbc decryption password:        #输入密码

[root@localhost tmp]# tail -3 fstab        #查看解密后的文件

devpts /dev/pts devpts gid=5,mode=620 0 0

sysfs /sys sysfs defaults 0 0

proc /proc proc defaults 0 0

[root@localhost tmp]#

注:其中的加密算法可以根据自己的需要更改   

    (3)单项加密

dgst命令:

用法:openssl dgst -md5 /PATH/TO/SOMEFILE ,如

 
  

[root@localhost tmp]# openssl dgst -md5 fstab

MD5(fstab)= e83bea7d589639c435390c19b372e89e

      (4) 生成用户密码,passwd命令,如

 
  

[root@localhost tmp]# openssl passwd -1 -salt 12345 deanzhu

$1$12345$I3fdyYvZmTklIOQyuo5HG1

      (5)生成随机数,

openssl rand -base64|-hex NUM

NUM: 表示字节数;-hex时,每个字符4位,出现的字符数为NUM*2; 如

 
  

[root@localhost tmp]# openssl rand -base64 16

ZHTO2YRBGxfKnXqeAcpVtg==

[root@localhost tmp]# openssl rand -base64 24

tZGXdlyo9zRCiLhnPv9YDdrFnd01SYX4

        (6)生成秘钥对

       用法:openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS

提取出公钥:

用法:openssl rsa -in /PATH/FROM/PRIVATEKEY.FILE -pubout

 
  

[root@localhost tmp]# openssl genrsa -out rsakey.privte 2048 #生成2048位的私钥

Generating RSA private key, 2048 bit long modulus

............+++

.......+++

e is 65537 (0x10001)

[root@localhost tmp]# cat rsakey.privte #查看私钥

-----BEGIN RSA PRIVATE KEY-----

MIIEpQIBAAKCAQEAzOE5ObkTYyZeYBJHbNm6qFADp+96Vg2VGHZTWtUO609j+36f

dTBHtIxG9HlRnADVJhDCgGKmBMta3zuHVe4gsVTuCHSFuNETxrV/Z1bZg9EH/vB8

bJ7ML9Jpw+8og0hzix8Vxgd52Bp2KXq02qq2TkJzHeJMoxQF6EAJPrtCsi6fJ6JN

9kDFnu8OKJHj9yBZgLt7lKe+zwcA+hV5Dt6Ca4z1h9ckrBdI4pF6gv6Jk2Yu3Y2W

JZRhXzmRPWIofO3CghDYVLrmqraWvsQb3SYm13IWnfYGAr14eV8W/ONS5BxuNoHA

ZdM+i0fAvf55loKvMPkjD2gkLTy3UY79BIh5BwIDAQABAoIBAAH8/Y0t2p5PtQLB

qqfHxSP1AtQSYuGK6DOAknaDMs3dy16Zb/q3KTr7UYT12HDnISppZznPu0S4pH0e

GsYetXqDFHxIhTOx87st77qVAS9iS+2Rb+Ot9tVP+W7JV19OyLBE8PUnBWuvdg4Y

/sBQf8xqoKtdktjSTOxgErblIlSQUs1nBWfnRf5rXEEvd97/30EUUhFMVF23HEA5

xjgdXnCQdGZjpVxN57OTMKQ/Rj+8StXJYsvunGfYMIoR99ziHyrJF8hgX/mwiHEw

XeUYXxLPUFWcSKDUwO1hYlTap5NB0DNW/zDtj6VF5MtHYUI0fIDuZNgA7/BKirrb

ydnbCIECgYEA+FuLnkxR0deT3w7t1e7ATflJREmTdhcOM0BeBMFi5aoVvjDqOqbD

91kWqy34jina+44weg2N4youXsCQtjxc3bTmVXg1lsUIWsSTU8XMhhAvRkit1Hr8

HPuEB6QTiuu4ZSNydAUyKaaOZp8OvOTB/cjArYJZHm1nXWcZ+6LNFtECgYEA0y8t

tO1IWiQx2yg+MhIjkMgFEzhnVmLZa8dkW2QwhW/MKVB3evJM4DyklZiuCLD5QpLl

uvWlwNdrpYCjliLJOcUC1f5ExJnNk9ZxjYpcx7/cHT5+CNR7aru3wSm5EUOBPCHf

lnh6NZBhk5xzi8EmpZDqdjItowqCBaD9kzxYOFcCgYEAoteLjSingTqjp17njR01

lCq+4nqHqKdnVS2AOAgA62uBRCpYekp8NYOBfI3w6m4BOm251V1ryiYPL2t9ty+P

CIOjfykJoijg2HsJyqTn/INCLAhdifN1uR8lK8lmUvFJ/26ljfMWN/8QYbMq+6nW

lKt7woi0HGJJoxGGFNtjM/ECgYEAzA2eAF/1tQOcGMJ9tivIqbBbFwM89j91DasP

0S6xo30urAzQJb/RgCmYbeOk5Uj6z9TYnRmWGwsLPFNbvUnHXUZ7QwH4uG5UMTDX

b4fttiQwLyGe7jFBPxQ6rS3/YCr1yICCZgXrL65eWh6llrf++6NWqPY7Gnqgv4ea

/JUmOOkCgYEAngIzNp8EBLdNFvnca59GMT4CmVF8Wk/hZGAPBCEeGHnpqBiSfytg

aTwdkwRy1FfCSbqju3tzMkdB57nwKaT0er8uHN9L/5hIgjcaQyHtNlYYKxqsh9gH

Nf1IKJLUIX4JtnDBfWQay4WJO0l9U+WLGlX3WFoZebnhAgJO3LBchfo=

-----END RSA PRIVATE KEY-----

[root@localhost tmp]# openssl rsa -in rsakey.privte -pubout #从私钥中提取公钥

writing RSA key

-----BEGIN PUBLIC KEY-----

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzOE5ObkTYyZeYBJHbNm6

qFADp+96Vg2VGHZTWtUO609j+36fdTBHtIxG9HlRnADVJhDCgGKmBMta3zuHVe4g

sVTuCHSFuNETxrV/Z1bZg9EH/vB8bJ7ML9Jpw+8og0hzix8Vxgd52Bp2KXq02qq2

TkJzHeJMoxQF6EAJPrtCsi6fJ6JN9kDFnu8OKJHj9yBZgLt7lKe+zwcA+hV5Dt6C

a4z1h9ckrBdI4pF6gv6Jk2Yu3Y2WJZRhXzmRPWIofO3CghDYVLrmqraWvsQb3SYm

13IWnfYGAr14eV8W/ONS5BxuNoHAZdM+i0fAvf55loKvMPkjD2gkLTy3UY79BIh5

BwIDAQAB

-----END PUBLIC KEY-----

五、私有CA的搭建

如果要创建CA我们就必须先了解下和CA相关的工作流程,如下图





注:图片出自 http://www.178linux.com/2704

        1、服务器端建立CA

 
  

[root@localhost CA]# (umask 077;openssl genrsa -out /etc/pki/CA/private/ca 2048 -des3) #生成秘钥

Generating RSA private key, 2048 bit long modulus

....................................+++

...............................................+++

e is 65537 (0x10001)

[root@localhost CA]# 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]:beijing

string is too long, it needs to be less than 2 bytes long

Country Name (2 letter code) [XX]:CN

State or Province Name (full name) []:beijing

Locality Name (eg, city) [Default City]:beijing

Organization Name (eg, company) [Default Company Ltd]:mageedu

Organizational Unit Name (eg, section) []:www.mageedu

Common Name (eg, your name or your server's hostname) []:www.mageedu.com

Email Address []:admin@mageedu.com

[root@localhost CA]# ls

cacert.pem certs crl newcerts private

[root@localhost CA]# touch index.txt #初始化工作环境

[root@localhost CA]# echo 01 > serial

        2、客户端申请证书

 
  

[root@localhost CA]# (umask 077; openssl genrsa -out /etc/rsa/my.key 2048 -des3)

#客户端生成秘钥对

Generating RSA private key, 2048 bit long modulus

.......................+++

......................................+++

e is 65537 (0x10001)

[root@localhost CA]# 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) []:beijing

Locality Name (eg, city) [Default City]:beijing

Organization Name (eg, company) [Default Company Ltd]:mageedu

Organizational Unit Name (eg, section) []:www.mageedu

Common Name (eg, your name or your server's hostname) []:www.mageedu.com

Email Address []:admin@mageedu.com

 

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:

An optional company name []:

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

        可以使用命令 scp

        用法:PULL:scp [options] [user@]host:/PATH/FROM/SOMEFILE /PATH/TO/SOMEWHERE

  PUSH: scp [options] /PATH/FROM/SOMEFILE [user@]host:/PATH/TO/SOMEWHERE

        4、服务器签署证书

 
  

[root@localhost CA]# openssl ca -in /etc/pki/CA/my.csr -out /etc/pki/CA/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 6 10:57:27 2015 GMT

Not After : Sep 5 10:57:27 2016 GMT

Subject:

countryName = CN

stateOrProvinceName = beijing

organizationName = mageedu

organizationalUnitName = www.mageedu

commonName = www.mageedu.com

emailAddress = admin@mageedu.com

X509v3 extensions:

X509v3 Basic Constraints:

CA:FALSE

Netscape Comment:

OpenSSL Generated Certificate

X509v3 Subject Key Identifier:

1F:60:5C:7F:76:1E:DC:0D:78:C6:EA:FC:DE:2D:A5:DC:74:69:2E:4B

X509v3 Authority Key Identifier:

keyid:B3:61:4C:47:88:80:44:F2:C7:4C:D6:F2:9D:33:E2:3C:FC:4D:28:1E

 

Certificate is to be certified until Sep 5 10:57:27 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@localhost CA]# cat index.txt

#查看index文件,存放证书subject信息,其中V表示可用证书

V 160905105727Z 01 unknown /C=CN/ST=beijing/O=mageedu/OU=www.mageedu/CN=www.mageedu.com/emailAddress=admin@mageedu.com

        5、发送给请求者

 
  

[root@localhost mysql]# scp /etc/pki/CA/my.crt 192.168.0.13:/tmp

#将证书发送的客户端机器的tmp目录下

The authenticity of host '192.168.0.13 (192.168.0.13)' can't be established.

RSA key fingerprint is ef:3d:22:74:19:4f:5f:70:29:b9:a0:de:0b:db:41:ba.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '192.168.0.13' (RSA) to the list of known hosts.

Address 192.168.0.13 maps to localhost, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!

root@192.168.0.13's password:

my.crt 100% 4659 4.6KB/s 00:00

 

6、吊销证书

 
  

[root@localhost CA]# openssl x509 -in my.crt -noout -serial -subject

#获取证书节点

serial=01

subject= /C=CN/ST=beijing/O=mageedu/OU=www.mageedu/CN=www.mageedu.com/emailAddress=admin@mageedu.com

[root@localhost CA]# cat index.txt

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

V 160905105727Z 01 unknown /C=CN/ST=beijing/O=mageedu/OU=www.mageedu/CN=www.mageedu.com/emailAddress=admin@mageedu.com

[root@localhost CA]# openssl ca -revoke newcerts/01.pem #吊销证书

Using configuration from /etc/pki/tls/openssl.cnf

Revoking Certificate 01.

Data Base Updated

[root@localhost CA]# echo 00 > crlnumber #生成吊销证书的编号

[root@localhost CA]# openssl ca -gencrl -out thisca.crl #更新证书吊销列表

Using configuration from /etc/pki/tls/openssl.cnf

六、总结

关于openssl其中有很多内容还没有讲到,以上的内容只是个人学习的总结,可能有些部分说的不正确,还请指出。谢谢!