Openssl、加密、解密和私有CA的实现过程

在互联网数据传输过程中,数据的安全私密性是及其重要的,所以就有数据的加密和解密过程;

加密方式

一、对称加密:

特性:

1、加密方/解密方使用同一个口令

2、将原文分割成固定大小的数据块,对这些块进行加密,数据块前后会有关联关系


缺陷:

1、密钥无法交换

2、无法进行身份验证

3、无法保证数据完整性


加密算法:

DES(56bits):数据加密标准
AES(128):高级加密标准

3DES:相当于对每个数据块应用三次DES加密算法


工具:gpg,openssl enc


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

特性:

1、密钥交换(需要在互联网传输密钥)

2、用户身份认证(对方的私钥加密的只有对方的公钥能解密)


缺陷:

数据加密过程很慢


加密算法:RSA,EIGamal,DSA


密钥交换(IKE: Internet Key Exchange)DH算法:

A,B双方使用一个较大的质数(p)和一个生成器(g),在各自选择一个数字A(x),B(y)

A=g^x%p    B=g^y%p;二者交换结果后再对各自选定的数字进行次方取值

(g^y%p)^x = (g^x%p)^y;至此完成了密钥交换,并且没有直接传输密钥。


工具:gpg,openssl rsautl


三、单向加密

特性:抽取数据特征码

1、One-Way

2、Collision-free


缺陷:

无法保证数据私密性


加密算法:

MD5,SHA1,SHA512,CRC-32(无法保证数据完整性)


工具:sha1sum, md5sum, chsum, openssl dgst


CA和PKI以及证书申请验证

CA(Certificate Authority):是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。

PKI(Public Key Infrastructure):又称公开密钥基础设施,PKI体系结构采用证书管理公钥,通过第三方的可信机构CA,把用户的公钥和用户的其他标识信息捆绑在一起,在Internet网上验证用户的身份,PKI体系结构把公钥密码和对称密码结合起来,在Internet网上实现密钥的自动管理,保证网上数据的机密性、完整性。

wKiom1McJf2C-tI0AAFF1HaWefo216.jpg

上述图片大致描述了证书申请与验证的过程;其中申请证书方申请证书时,需要按规定填写申请表以及生成密钥提交申请,CA签署后发回给申请者;CA的证书是属于自签证书。

在互相得到了证书后,到CA获取公钥进行解密,解密成功可证实对方身份,之前还需要进行核实证书的有效期限和是否被吊销等信息。


OpenSSL实现私有CA

OpenSSL是一款功能强大的加密工具包。为网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。

openssl主要包括:

libcrypto:通用功能的加密库
libssl:用于实现TLS/SSL的功能
openssl:多功能命令工具(生成密钥、创建数字证书、手动加密解密数据...)

openssl具体的命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[X.X.X. 73 ] #openssl -h
openssl:Error:  '-h'  is  an invalid command.
Standard commands
asn1parse         ca                ciphers           cms        
crl               crl2pkcs7         dgst              dh         
dhparam           dsa               dsaparam          ec         
ecparam           enc               engine            errstr     
gendh             gendsa            genpkey           genrsa     
nseq              ocsp              passwd            pkcs12     
pkcs7             pkcs8             pkey              pkeyparam  
pkeyutl           prime             rand              req        
rsa               rsautl            s_client          s_server   
s_time            sess_id           smime             speed      
spkac             ts                verify            version    
x509       
Message Digest commands (see the `dgst' command  for  more details)
md2               md4               md5               rmd160     
sha               sha1       
Cipher commands (see the `enc' command  for  more details)
aes - 128 - cbc       aes - 128 - ecb       aes - 192 - cbc       aes - 192 - ecb
aes - 256 - cbc       aes - 256 - ecb       base64            bf         
bf - cbc            bf - cfb            bf - ecb            bf - ofb     
camellia - 128 - cbc  camellia - 128 - ecb  camellia - 192 - cbc  camellia - 192 - ecb
camellia - 256 - cbc  camellia - 256 - ecb  cast              cast - cbc   
cast5 - cbc         cast5 - cfb         cast5 - ecb         cast5 - ofb  
des               des - cbc           des - cfb           des - ecb    
des - ede           des - ede - cbc       des - ede - cfb       des - ede - ofb
des - ede3          des - ede3 - cbc      des - ede3 - cfb      des - ede3 - ofb
des - ofb           des3              desx              idea       
idea - cbc          idea - cfb          idea - ecb          idea - ofb   
rc2               rc2 - 40 - cbc        rc2 - 64 - cbc        rc2 - cbc    
rc2 - cfb           rc2 - ecb           rc2 - ofb           rc4        
rc4 - 40             seed              seed - cbc          seed - cfb   
seed - ecb          seed - ofb          zlib       
#给了一个错误参数,能显示出具体命令


用openssl实现私有CA

先查看下openssl的配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[X.X.X. 15 ] #vi /etc/pki/tls/openssl.cnf
[ CA_default ]
dir              =  / etc / pki / CA            # 工作目录
certs            =  $ dir / certs             # 签署文件证书目录
crl_dir          =  $ dir / crl               # 吊销列表
database         =  $ dir / index.txt         # 数据库索引文件
#unique_subject = no                    #
                                         #
new_certs_dir    =  $ dir / newcerts          # 当前签署的证书目录
certificate      =  $ dir / cacert.pem        # CA自身的证书
serial           =  $ dir / serial            # 当前签署的证书编号
crlnumber        =  $ dir / crlnumber         # 吊销列表编号
                                         #
crl              =  $ dir / crl.pem           # 当前使用的crl
private_key      =  $ dir / private / cakey.pem # CA的私有KEY
RANDFILE         =  $ dir / private / .rand     # private random number file
x509_extensions  =  usr_cert               # The extentions to add to the cert

配置文件中可以看到定义了CA默认的属性;了解到上述属性后就可以手动配置CA了:

1、切换到CA的目录下,生成密钥对

1
2
3
4
5
6
7
8
9
10
[X.X.X. 15 ] #(umask 077;openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key,  2048  bit  long  modulus
................................................ + + +
............................................................................ + + +
is  65537  ( 0x10001 )
[X.X.X. 15 ] #ll -l private/cakey.pem
- rw - - - - - - -  1  root root  1679  Mar   9  14 : 48  private / cakey.pem
[X.X.X. 15 ] #
#括号是在子SHELL中执行命令,变量不会影响到父进程,由于是私有key,所以权限很重要,故;在括号内设置了umask值
#密钥生成的只有私钥,公钥是通过特定格式从私钥中提取的

2、生成自签证书

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[X.X.X. 15 ] #openssl req -new -x509 -key private/cakey.pem -out 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) []:HN
Locality Name (eg, city) [Default City]:ZZ
Organization Name (eg, company) [Default Company Ltd]:Linux
Organizational Unit Name (eg, section) []:Centos
Common Name (eg, your name  or  your server's hostname) []:ca.mage.com       #这项很重要;一般是主机名
Email Address []:[email protected]
[X.X.X. 15 ] #ls
cacert.pem  certs  crl  newcerts  private

3、在CA下创建index.txt等文件

1
2
3
4
5
6
[X.X.X.15] #touch index.txt serial crlnumber
[X.X.X.15] #ls
cacert.pem  certs  crl  crlnumber  index.txt  newcerts  private  serial
[X.X.X.15] #echo 00 > serial #给一个初始号码;否则签署证书时会报错
[X.X.X.15] #
#这几个文件默认是没有的,需要手动创建,否则签署证书时会报错



用openssl实现证书申请

1、在主机上生成密钥,保存至应用此证书的服务的配置文件目录下

下面以httpd作为实例实验

1
2
3
4
5
6
7
8
9
10
11
#在httpd目录新建一个专门存储的目录ssl
[X.X.X. 73 ] #pwd
/ etc / httpd / ssl
[X.X.X. 73 ] #(umask 077;openssl genrsa -out httpd.key 1024)
Generating RSA private key,  1024  bit  long  modulus
.................. + + + + + +
........ + + + + + +
is  65537  ( 0x10001 )
[X.X.X. 73 ] #ll
total  4
- rw - - - - - - -  1  root root  887  Mar   9  11 : 32  httpd.key

2、生成证书签署请求文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[X.X.X. 73 ] #openssl req -new -key httpd.key -out httpd.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) []:HN
Locality Name (eg, city) [Default City]:ZZ
Organization Name (eg, company) [Default Company Ltd]:Linux
Organizational Unit Name (eg, section) []:Linux
Common Name (eg, your name  or  your server's hostname) []: 73.soul .com
Email Address []: 73 @soul.com
Please enter the following  'extra'  attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[X.X.X. 73 ] #ls
httpd.csr  httpd.key
[X.X.X. 73 ] #
#与CA上证书生成是差不多的,区别在于主机名和多了个密码,密码这里留空
#由于是内部使用,前面的信息填写必须一致

3、请求文件发送给CA

1
2
3
4
5
6
7
8
9
#在CA的主机/etc/pki下新建一个文件专门存储审核文件
[X.X.X. 15 ] #pwd
/ etc / pki / sign
#
#
[X.X.X. 73 ] #scp httpd.csr X.X.X.15:/etc/pki/sign
[email protected] 15 's password:
httpd.csr                                                   100 %   676      0.7KB / s    00 : 00
[X.X.X. 73 ] #


CA签署证书

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[X.X.X. 15 ] #openssl ca -in httpd.csr -out httpd.crt -days 3655
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: Mar   9  07 : 19 : 50  2014  GMT
             Not After : Mar  11  07 : 19 : 50  2024  GMT
         Subject:
             countryName                =  CN
             stateOrProvinceName        =  HN
             organizationName           =  Linux
             organizationalUnitName     =  Linux
             commonName                 =  73.soul .com
             emailAddress               =  73 @soul.com
         X509v3 extensions:
             X509v3 Basic Constraints:
                 CA:FALSE
             Netscape Comment:
                 OpenSSL Generated Certificate
             X509v3 Subject Key Identifier:
                 B1: 4A : 39 : 93 :C1: 9A : 10 :C7: 81 : 67 : 74 :E2: 4D : 97 :C3:A1: 0A :AD: 1F : 62
             X509v3 Authority Key Identifier:
                 keyid:B5: 12 : 83 : 5A : 54 :B0: 1B : 98 : 34 : 4E :D9:A6: 31 : 95 : 5F : 14 :BB: 61 :D9:EF
Certificate  is  to be certified until Mar  11  07 : 19 : 50  2024  GMT ( 3655  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
#
#
[X.X.X. 15 ] #scp httpd.crt X.X.X.73:/etc/httpd/ssl
[email protected] 73 's password:
httpd.crt                                                   100 %  3803      3.7KB / s    00 : 00
[X.X.X. 15 ] #
#
[X.X.X. 73 ] #ls
httpd.crt  httpd.csr  httpd.key   #对方主机以收到

至此一个简单的CA以及申请和签署步骤已完成。

还有一个可以吊销证书的命令:

1
openssl ca  - revoke  / path / to / somefile.crt

这里就不在测试。证书吊销需要在用户申请或者用户未付款的情况下。

正常状态下是不能操作的。

这种CA一般应用于内部局域网,如大范围使用或专业使用,建议使用OpenCA或者购买专业公司提供的。



本文转自Mr_陈 51CTO博客,原文链接:http://blog.51cto.com/chenpipi/1371371,如需转载请自行联系原作者