在现代互联网中,安全是一个不容忽视的问题,说到安全就不得不涉及到加密,解密。现在只要我们数据在互联网上传播就避免不了一些有恶意企图的人窥探,所以在网络中传播数据时首先要考虑几个因素,对方的身份,数据的完整性,数据的私密性。

 

常用的密码算法:对称加密,公钥加密,单向加密。

 

    对称加密是加密和解密使用同一个秘钥,将原始数据分块进行加密。优点是加密速度快,常用于加密数据比较大的时候。其缺点是秘钥无法安全的送到对方。如果密码遗漏数据安全不复存在。常用的加密算法:DES3DESAESBlowfishTwofishIDEARC6CAST5

使用工具:openssl

    举例:把qq.txt文件加密。

openssl enc -a -salt -des3 -in /tmp/qq.txt -out /tmp/qqs.txt   然后输入2次自己定义的密码。

-a : 表示已base64的方式加密。

-des3:加密算法。

wKiom1YN7TuDFpYGAAGfXm-b-Wk575.jpg

此时查看加密后的qqs.txt

wKioL1YN7ViDFGPeAAGUbO5_xsk194.jpg

解密:openssl enc -d -salt -des3 -a -in /tmp/qqs.txt -out /tmp/qqj.txt

wKioL1YN7XCxC3QXAAG9NnDFgDg520.jpg

-d:解密。

在例子中可见,对称加密和解密使用的同样的方式,而且如果在网络传输中传输密码或密码泄露数据也是不安全的。

 

单向加密:

    单向加密即加密运算后的数据是不可逆的,不能反向运算出原数据。一般通过散列函数计算,散列函数的主要任务用于计算数据的完整性。常用算法有:MD5SHA-1SHA256SHA384SHA512。其特点是输入一样输出也是一样。如果输入发生任何改变,结果将引起巨大改变。无法通过输出结果还原原来的数据,无论输入多大,输出结果都是相同的大小。

举例:使用MD5算法计算qq.txt的结果。openssl dgst -md5 qq.txt

[root@localhost tmp]# openssl dgst -md5  qq.txt

MD5(qq.txt)=  cd7257236da80701dd11ce383644e213

[root@localhost tmp]# vim qq.txt

151515252:13523452345

455667678:45767687877

567787881:13456566767

667788931:15667676833

234457890:15899865663

567787881:13778798888

667788931:15678789904

234457890:15467689909

567791246:18755653256

234457890:15467685229

567791246:18758944576

d

                                                                                                                                   

"qq.txt" 12L, 244C written                                                                                        

[root@localhost tmp]# openssl dgst -md5  qq.txt

MD5(qq.txt)= c8fcbdb073a0381a8d2d9542dfc64800

[root@localhost tmp]#

由此可见,在文本中末尾添加了一个字符d,其结果与上一次大不相同。由于具备不可逆的特性所以常用于验证文件是否发生过改变。而输出的结果我们通常称之为数据的指纹,或特征码。

 

公钥加密:

    公钥加密也称为非对称加密,与对称加密不同的是它有两个秘钥,即公钥和私钥,这两个秘钥成对出现如果使用公钥加密数据解密必须用私钥。用私钥加密的数据解密要用其公钥。因为它加密和解密使用不同的秘钥所以称之为非对称加密。常结合其他加密方式组合使用。

生成自己的秘钥对:

在当前目录中生成一个2048位的秘钥保存到mykey中,注意默认生成权限出属主外账户有读权限,要禁止其他用户读取需修改权限或者直接使用:(umask 077;openssl genrsa 2048 >mykey)

[root@localhost tmp]# openssl genrsa 2048  >mykey

Generating RSA private key, 2048 bit long  modulus

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

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

e is 65537 (0x10001)

[root@localhost tmp]# ll

-rw-r--r-- 1 root root 1679 Sep 26 03:51  mykey

-rw-r--r-- 1 root root  242 Sep 26 02:54 qqj.txt

-rw-r--r-- 1 root root  358 Sep 26 02:49 qqs.txt

-rw-r--r-- 1 root root  244 Sep 26 03:31 qq.txt

提取公钥:

[root@localhost tmp]# openssl rsa -in /tmp/mykey  -pubout

writing RSA key

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

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1CZOG8YAJ81strW7T9Sx

cdsdD9tc0wNk5Qv7qE2PyNAthCuQdernyWYbf0on6uOGVfiHu0djLc9mfbDlXV2q

Bu5WDS8Kh4RCFbTjeA35h+YGni16foQxa/U1QjijBK9Ju0BNQt/fblRsbjHR3W3g

0eUd5gJBgFf+p3W9FjR5S063ACIprVZF0u1Eu5lrOkKdtcHAXqSGQje70DCxJA3y

iMtcTxSwBl3YRTuu37GMYot5KVBKzxAfcs7xjB34qxremBZlrLB3Wv8mG1bFf3GH

siQjPtQ3gSig5spovPVccc5w4LglYE94OOa++hjf0btbBAqB9hET928cWZSGOuH+

9wIDAQAB

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

[root@localhost tmp]#  

以上步骤完成公钥和私钥已创建完成。并且私钥一定要保证其安全性。

 

以上三种加密方式各有特点,但也有各自的缺陷。如果单独用于网络数据加密仍然不可靠。但把他们组合在一起使用安全就有保障了。

 

首先发送方:

1、 把要发送的原文数据使用单向加密抽取出原文的特征码,用来保证数据的完整性。

2、 发送方使用非对称加密,即用自己的私钥把原文的特征码加密,加到原文后面。这样一来就保证身份,接收方有发送方的公钥收到数据后能正常用对方的公钥解密得到特征码即证明了数据发送方的身份。

3、 发送方再选择一个密码,用对称加密方式对原文和加密过的特征码一起再次进行加密。因为对称加密方式比较快如果数据过大也不太影响。

4、 发送方把选择的密码用接收方的公钥加密后一并把数据发给接收方。

 

接收方:

1、 接收方收到数据后首先使用自己的私钥得到了一个密码就是发送方打包的原数据和特征码。

2、 使用得到的密码打开发送方打包加密的原数据和特征码。此时得到了原数据,只有了原数据并不能确定数据没有被修改或替换过。此时要验证数据的完整性

3、 接收方用发送方的公钥解密加密过的特征码,而后得到了原数据的特征码。

4、 接收方用通样的方式对原数据计算特征码把得到的特征码和解密后的特征码进行比对如果一致说明数据没有被修改过。如果不一致说明此信息不可靠。

总结整个过程:

    在过程中使用了三种加密方式组合,双方通过非对称加密验证了彼此的身份,因为发送方的数据密码使用了接收方的公钥加密了,这个数据只能是接收方的私钥才能解密,其他人得到了这些数据也是没有用处。使用对称加密对原数据进行加密使得原文得到加密。又通过单向加密的方式进行了特征码的比对验证了信息的可靠性。

下面用一张图表示过程:

 wKiom1YN7XXzksgkAAHUpJRFhrA722.jpg

在以上的过程当中接收方和发送方都事前有对方的公钥且互相信任,但在互联网当中我们又怎么保证对方公钥的可信度,如果对方是一个冒名顶替的呢我们将无从获知,所以我们需要一个可信的机构来保证,就好比我们生活当中一个人说他是张三住在甲街1号,我怎么知道他说的是真是假呢,我去派出所查一下,派出所说确实有个人叫张三住在甲街1号。那么我就认为他就是张三否则就不是。而在互联网中这个派出所就是CA,它负责给互联网上的主机签发证书。而如果你想在互联网上得到“信任就要先到CA那里注册,CA核实你的身份信息然后提取信息的特征码用CA自己的私钥加密后发给你而这就是你的数字签名。

有了签名之后当我们需要与一个主机通讯的时候对方会发给我它的证书,这时我首先去用CA的公钥解密证书,如果能够解密说明证书是CA给颁发的,CA已经核实过他的身份和信息了我们认为对方是可靠的,但我们需要进一步证明证书是否在有效期内和是否是已经吊销的证书,这个查询就需要到CA那里查询。当整个确认过程没有问题之后通信才真正的开始。而以上的整个加密解密过程和CA的这种验证机制行程了一个新的技术规范就是:PKIPublic.Key.Infrastructure)。

 

CA证书的这种机制不是一定要应用于大型互联网中在自己的私有范围内也可以使用,其中使用的工具就是openssl

建立私有CA

1、 生成秘钥:

(umask077; openssl genrsa –out /etc/pki/CA/private/cakey.pem 2048)

[root@localhost  private]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)

Generating  RSA private key, 2048 bit long modulus

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

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

e  is 65537 (0x10001)

[root@localhost  private]#

 

2、 签署请求:

[root@localhost  private]# 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

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

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

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

Organizational Unit Name (eg, section)  []:FF

Common Name (eg, your name or your  server's hostname) []:ops

Email Address []:admin@admin.com

[root@localhost private]# ls  /etc/pki/CA/cacert.pem

/etc/pki/CA/cacert.pem

[root@localhost private]# ls /etc/pki/CA/

cacert.pem  certs   crl  newcerts  private

[root@localhost private]#

使用命令:openssl req-new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem –days365,发起证书签署请求,然后会提示你填写一些信息。

req:生成证书签署请求;-news:新请求;-key  /path/to/keyfile:指定私钥文件;                    -x509:生成自签署证书; -days 365:有效天数,可自定义。

然后在CA目录下新建2个文件,index.txt serial

然后:~]# echo 00 > seria

3、 签署证书:

签署请求生成的方法在文中提到过。不在重复说明,签署证书命令:

openssl ca -in /tmp/mykey.csr -out /tmp/ff.com.crt -days 365

   -in:指明请求文件位置

   -out:指明输出文件名和位置。

   -days:指明签署有效期限。

 

 

[root@localhost CA]# openssl ca -in  /tmp/mykey.csr -out /tmp/ff.com.crt -days 365

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

Check that the request matches the  signature

Signature ok

Certificate Details:

         Serial Number: 0 (0x0)

         Validity

            Not Before: Sep 26 12:22:03 2015  GMT

            Not After : Sep 25 12:22:03 2016  GMT

         Subject:

            countryName               = CN

            stateOrProvinceName       = PEK

            organizationName          = FF

             organizationalUnitName    = OPS

            commonName                = OPS

            emailAddress              = admin@ff.com

         X509v3 extensions:

            X509v3 Basic Constraints:

                CA:FALSE

            Netscape Comment:

                 OpenSSL Generated  Certificate

            X509v3 Subject Key Identifier:

                 12:2C:F0:DF:C1:99:08:88:73:BA:04:8E:C4:2F:26:20:52:F5:A2:13

            X509v3 Authority Key Identifier:

                 keyid:84:C4:2E:4A:ED:A6:9D:26:A1:80:BE:D2:47:7F:CC:D9:85:97:4D:19

 

Certificate is to be certified until Sep  25 12:22:03 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]#

[root@localhost CA]# cat serial

01

[root@localhost CA]# cat index.txt

V   160925122203Z       00  unknown    /C=CN/ST=PEK/O=FF/OU=OPS/CN=OPS/emailAddress=admin@ff.com

[root@localhost CA]

上图中看到在index.txt.生成了签署记录.其他主机签署是同样的方式,只不过需要把请求通过一些途径发送给CA

吊销证书:当有主机秘钥丢失或泄露为保证安全需要向CA申请吊销证书。

1、 获取要吊销证书的序号和信息。

[root@localhost CA]# openssl x509 -in  /tmp/ff.com.crt -noout -serial -subject

serial=00

subject=  /C=CN/ST=PEK/O=FF/OU=OPS/CN=OPS/emailAddress=admin@ff.com

[root@localhost CA]#

2、 核实要吊销证书是否与申请吊销主机提供的信息是否一致。

3、 吊销证书:openssl ca -revoke /etc/pki/CA/newcerts/00.pem

如果是第一次吊销需生成吊销证书的编号: echo 01 > /etc/pki/CA/crlnumber

4、 更新吊销证书列表:openssl ca -gencrl -out ff.com.crl

查看crl文件:openssl crl -in /path/to/crl_FILE.crl -noout -text

 

[root@localhost crl]# openssl crl -in  ff.com.crl -noout -text

Certificate Revocation List (CRL):

         Version 2 (0x1)

     Signature Algorithm: sha1WithRSAEncryption

         Issuer:  /C=CN/ST=PEK/L=PEK/O=FF/OU=FF/CN=ops/emailAddress=admin@admin.com

         Last Update: Sep 26 12:45:50 2015 GMT

         Next Update: Oct 26 12:45:50 2015 GMT

         CRL extensions:

            X509v3 CRL Number:

                1

Revoked Certificates:

     Serial Number: 00

         Revocation Date: Sep 26 12:40:47 2015 GMT

     Signature Algorithm: sha1WithRSAEncryption

          b5:f4:9c:ec:3d:4a:e4:d1:1b:48:d4:a0:5e:06:4f:a0:ab:e6:

          76:de:62:f6:88:8e:cc:ec:b9:de:39:db:8c:a0:00:3e:57:41:

          73:09:90:e9:64:4c:0a:01:70:0b:ac:43:f2:28:0a:1a:77:c9:

          b2:20:ef:30:d6:3d:5b:7b:a0:5a:5d:dc:1a:95:63:4b:e8:11:

          e9:f6:53:8b:42:83:cb:34:cc:cc:25:94:de:f9:54:77:a4:1f:

          6a:12:27:77:e2:fc:48:3b:56:58:08:f2:47:0c:f2:4d:52:ed:

          0e:ba:e6:76:47:d5:d5:6f:de:44:5d:73:3d:ff:14:13:b1:d0:

          aa:da:ee:6e:4d:84:d7:34:e9:4f:0f:fe:aa:9f:da:6e:a9:bd:

          2b:aa:3e:82:2b:91:f4:37:bd:38:08:99:94:95:0b:98:3b:93:

          81:bf:cc:6a:80:31:f5:73:4f:45:e3:5f:53:25:a3:d9:95:03:

          c7:27:e8:44:c1:97:9d:cb:8d:26:9d:69:d3:0d:ba:6d:a8:1b:

          6f:47:e9:fb:9e:ad:9c:f5:e9:9c:b0:50:be:e2:35:44:2b:c5:

          6b:c6:36:3d:52:e5:d1:5a:6c:56:13:57:6f:67:e5:5b:ba:1d:

          5c:d4:5b:81:9b:e7:c2:9e:99:c7:7b:ea:48:ff:3c:70:5d:96:

          50:20:18:1a

[root@localhost crl]#

crt证书文件可以配置到http服务器当中,这样就可以用https的访问站点,实现交换数据的全。

至此私有CA搭建和证书签署已经完成。此文只为个人知识总结便于以后查阅用。