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 []:caadmin@linux.com
[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
root@X.X.X. 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
root@X.X.X. 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,如需转载请自行联系原作者

相关文章
|
5月前
|
安全 数据安全/隐私保护
使用openssl 模拟ca进行证书的申请和颁发,并使用证书部署网站的安全连接访问,即https的加密通信
使用openssl 模拟ca进行证书的申请和颁发,并使用证书部署网站的安全连接访问,即https的加密通信
46 0
|
5月前
|
存储 算法 安全
20.5 OpenSSL 套接字RSA加密传输
RSA算法同样可以用于加密传输,但此类加密算法虽然非常安全,但通常不会用于大量的数据传输,这是因为`RSA`算法加解密过程涉及大量的数学运算,尤其是模幂运算(即计算大数的幂模运算),这些运算对于计算机而言是十分耗时。其次在`RSA`算法中,加密数据的长度不能超过密钥长度减去一定的填充长度。一般情况下,当RSA密钥长度为`1024`位时,可以加密长度为`128`字节,密钥长度为`2048`位时,可以加密长度为`245`字节;当密钥长度为`3072`位时,可以加密长度为`371`字节。因此,如果需要加密的数据长度超过了密钥长度允许的范围,可以采用分段加密的方法。我们可以将数据包切割为每个`128`
33 1
20.5 OpenSSL 套接字RSA加密传输
|
5月前
|
算法 数据安全/隐私保护
20.4 OpenSSL 套接字AES加密传输
在读者了解了加密算法的具体使用流程后,那么我们就可以使用这些加密算法对网络中的数据包进行加密处理,加密算法此处我们先采用`AES`算法,在网络通信中,只需要在发送数据之前对特定字符串进行加密处理,而在接收到数据后在使用相同的算法对数据进行恢复即可,读者如果有了套接字编程的基础,那么理解这段代码将变得很容易。
26 0
20.4 OpenSSL 套接字AES加密传输
|
7月前
|
数据安全/隐私保护 C++ Python
Qt RSA OpenSSL C++ Qt加密解密签字通信系统窗体源码
Qt RSA OpenSSL C++ Qt加密解密签字通信系统窗体源码
128 0
Qt RSA OpenSSL C++ Qt加密解密签字通信系统窗体源码
|
11月前
|
安全 Shell Linux
使用OpenSsl加密反弹shell
当我们使用nc等工具进行反弹shell时,流量都是没经过加密,直接传输的,管理员很容易就能发现我们的异常流量
199 0
|
安全 Java API
【Android 安全】DEX 加密 ( 代理 Application 开发 | 项目中配置 OpenSSL 开源库 | 使用 OpenSSL 开源库解密 dex 文件 )(二)
【Android 安全】DEX 加密 ( 代理 Application 开发 | 项目中配置 OpenSSL 开源库 | 使用 OpenSSL 开源库解密 dex 文件 )(二)
296 0
|
安全 算法 Java
【Android 安全】DEX 加密 ( 代理 Application 开发 | 项目中配置 OpenSSL 开源库 | 使用 OpenSSL 开源库解密 dex 文件 )(一)
【Android 安全】DEX 加密 ( 代理 Application 开发 | 项目中配置 OpenSSL 开源库 | 使用 OpenSSL 开源库解密 dex 文件 )(一)
196 0
【Android 安全】DEX 加密 ( 代理 Application 开发 | 项目中配置 OpenSSL 开源库 | 使用 OpenSSL 开源库解密 dex 文件 )(一)
|
安全 编译器 Android开发
【Android 安全】DEX 加密 ( 代理 Application 开发 | 交叉编译 OpenSSL 开源库 )(二)
【Android 安全】DEX 加密 ( 代理 Application 开发 | 交叉编译 OpenSSL 开源库 )(二)
157 0
【Android 安全】DEX 加密 ( 代理 Application 开发 | 交叉编译 OpenSSL 开源库 )(二)
|
安全 算法 Java
【Android 安全】DEX 加密 ( 代理 Application 开发 | 交叉编译 OpenSSL 开源库 )(一)
【Android 安全】DEX 加密 ( 代理 Application 开发 | 交叉编译 OpenSSL 开源库 )(一)
166 0
【Android 安全】DEX 加密 ( 代理 Application 开发 | 交叉编译 OpenSSL 开源库 )(一)
|
Java PHP 数据安全/隐私保护
关于php的aes加密,openssl和mcrypt一些想说的话
关于php的aes加密,openssl和mcrypt一些想说的话
495 0