linux系统的加密功能及OpenSSL使用

时间:2015-07-30 23:39:00   收藏:0   阅读:3213

一、密码学简介

        据记载,公元前400年,古希腊人发明了置换密码。1881年世界上的第一个电话保密专利出现。在第二次世界大战期间,德国军方启用“恩尼格玛”密码机,密码学在战争中起着非常重要的作用。 随着信息化和数字化社会的发展,人们对信息安全和保密的重要性认识不断提高,于是在1997年,美国国家标准局公布实施了“美国数据加密标准(DES)”,民间力量开始全面介入密码学的研究和应用中,采用的加密算法有DES、RSA、SHA等。随着对加密强度需求的不断提高,近期又出现了AES、ECC等。 使用密码学可以达到以下目的: 

保密性:防止用户的标识或数据被读取。

数据完整性:防止数据被更改。

身份验证:确保数据发自特定的一方。


二、常用的加密算

        根据密钥类型不同将现代密码技术分为两类:对称加密算法(秘密钥匙加密)和非对称加密算法(公开密钥加密)。还有另外我们常用的加密算法单向散列算法也称 Hash(哈希)算法,不管哪种加密它们的作用都是依赖某种算法(算法都是公开的这点要知道)将明文的数据转变成密文的形式。关于算法被破解的问题,密码学上有著名的柯克霍夫原则:即使密码系统的任何细节已为人悉知,只要密钥未泄漏,它也应是安全的。下面就三种加密算法做下简要介绍:

1、对称加密算法

        对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的密钥,即加密密钥也可以用作解密密钥,这种方法在密码学中叫做对称加密算法,对称加密算法优点是:加密和解密的速度快,很适合对大段数据加密。问题是:通信者需要对每一个通信维护一个密钥,且通信双方在密钥交换时无法验证对方身份的真实性。

常见的对称加密算法有 DES(密钥太短,容易被破解),AES,3DES,Blowfish,twofish等;


2、非对称加密算法

        非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。其优点是:可用于密钥的交换和数字签名,问题是:不适合加密数据因速度太慢;此机制无法解决的难题是无法确定得到的公钥就是对方的。

        常见的非对称加密算法有:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)


3、单向散列算法

        单向散列算法也称 Hash(哈希)算法,是一种将任意长度的消息压缩到某一固定长度(消息摘要)的函数,该过程是不可逆的,即不可能通过散列加密后的的结果逆向得出原始的信息。常见的散列加密算法有 MD1,MD5,SHA1,SHA512,CRC-32 等。

Hash 函数有下面的特性: 

        单向加密通常用于验证数据的完整性,在数据发送之前,对数据进行单向加密得出特征码,然后接受者再次对接收的数据使用同样的单向加密,如果得到的特征码相同,则说明数据是完整的。 但是单纯的使用单向加密,无法保证数据被篡改,因此还需要借助其他加密算法(如数字签名)。

       

三、工具包软件OpenSSL简介

1、什么是OpenSSL

        OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。

 OpenSSL中主要包含的三个组件:


2、OpenSSL作用


3、SSL协议简介

        SSL是Secure Sockets Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输。其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。已经成为Internet上保密通讯的工业标准。 

        安全套接层协议能使用户/服务器应用之间的通信不被攻击者窃听,并且始终对服务器进行认证,还可选择对用户进行认证。SSL协议要求建立在可靠的传输层协议(TCP)之上。SSL协议的优势在于它是与应用层协议独立无关的,高层的应用层协议(例如,HTTP, FTP, TELNET等)能透明地建立于SSL协议之上。SSL协议在应用层协议通信之前就已经完成加密算法、通信密钥的协商及服务器认证工作。在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性。


4、SSL协议提供的安全信道的三个特性:


四、利用OpenSSL实现私有CA

1、证书简介

        公钥证书,通常简称为证书,是一种数字签名的声明,它将公钥的值绑定到持有对应私钥的个人、设备或服务的标识。证书的主要好处之一是主机不必再为单个使用者维护一套密码,这些单个使用者进行访问的先决条件是需要通过身份验证。相反,主机只需在证书颁发者中建立信任。 说得通俗一点就是,证书就是数字化的文件,里面有一个实体(网站,个人等)的公共密钥和其他属性,如名称等。该公共密钥只属于某一个特定的实体,它的作用是防止一个实体假装成另外一个实体。 


2、证书结构

        我们现在常用的证书是采用 X.509 结构的,这是一个国际标准证书结构。任何遵循该标准的应用程序都可以读写 X.509 结构的证书。包含有下面的信息:


3、可信第三方证书颁发机构CA

        CA 被称为可信第三方(TRUSTED THIRED PARTY,简称TTP),被用户所信任,由它保证证书签发给了应该得到该证书的人。CA 自己有一个庞大的 PUBLIC KEY 数据库,用来颁发给不同的实体。 CA 也是一个实体,它也有自己的公共密钥和私有密码,它也有自己的证书,使用者可以从它的站点下载得到它的公共密码。一般 CA 证书都内嵌在应用程序中,比如 IE 在 INTERNET 选项中“内容”,点击“证书”,里面的“中级证书办法机构”。 

        CA 的数字签名证书由 CA 颁发,由 CA 决定该证书的有效期,由该 CA 签名。每个证书都有唯一的系列号。证书的系列号和证书颁发者来决定某证书的唯一身份。当用户接受到对方证书的时候,会首先去看该证书的 CA,然后查找自己的 CA 证书数据库,如果找不到就表示自己不信任该 CA,则本次连接终端。找到了的话就用该 CA 证书里面的公共密钥去检查 CA 在证书上的签名。


4、openssl 实现私有 CA


在CA的服务端做以下操作:

私有 CA 先要生产 CA 自己的证书,CA 证书的路径在 /etc/pki/tls/openssl.conf 中配置, 下面列举下常用的关于CA配置文件信息:

[root@hpf-linux ~]# cat /etc/pki/tls/openssl.cnf
[ CA_default ]
dir             = /etc/pki/CA           # 工作目录
certs           = $dir/certs            # 客户端证书保存目录
crl_dir         = $dir/crl              # 证书吊销列表的位置
database        = $dir/index.txt        # 证书发证记录数据库
new_certs_dir   = $dir/newcerts         # 新生成证书存放目录
certificate     = $dir/cacert.pem       # CA的证书文件
serial          = $dir/serial           #签发证书的序列号,一般从01开始
crlnumber       = $dir/crlnumber        # 帧数吊销列表的序列号
crl             = $dir/crl.pem          # 证书吊销列表文件
private_key     = $dir/private/cakey.pem# CA的私钥文件
RANDFILE        = $dir/private/.rand    # 随机数生产文件,会自动创建
default_days    = 365                   # 默认签发有效期



创建私有CA的私钥:

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

小括号内的命令表示实在当前shell环境中子shell中执行,这样做并不会影响父shell的环境,同时设置umask 077是为了不让生成的私钥让别人有读写执行权限,-out为指定私钥生成的位置,2048为私钥的长度常用的有1024,2048,4096。


生成自签署证书:

[root@hpf-linux ~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650
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) []:Henan
Locality Name (eg, city) [Default City]:Xinyang
Organization Name (eg, company) [Default Company Ltd]:XXX   
Organizational Unit Name (eg, section) []:linux
Common Name (eg, your name or your server‘s hostname) []:ca.XXX.com   
Email Address []:ca@XXX.com

解释:req 生成证书签署请求,-new 新请求 -x509 生成自签署证书结构,-key /etc/pki/CA/private/cakey.pem指定私钥的位置,-out /etc/pki/CA/cacert.pem  指定生成的证书, -days 3650有效天数。


创建需要的目录,序列号和数据库文件:

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


在需要申请CA证书的客户端做以下操作:

[root@localhost ~]# mkdir  /etc/httpd/ssl
[root@localhost ~]# cd /etc/httpd/ssl
[root@localhost ssl]# (umask 077; openssl genrsa -out httpd.key 1024 )
Generating RSA private key, 1024 bit long modulus
...........................................................++++++
..............................................++++++
e is 65537 (0x10001)
[root@localhost ssl]# ls
httpd.key
[root@localhost ssl]# openssl req -new -key httpd.key -out http.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) []:Henan
Locality Name (eg, city) [Default City]:Xinyang
Organization Name (eg, company) [Default Company Ltd]:XXX
Organizational Unit Name (eg, section) []:linux
Common Name (eg, your name or your server‘s hostname) []:www.XXX.com
Email Address []:www@XXX.com

Please enter the following ‘extra‘ attributes
to be sent with your certificate request
A challenge password []:redhat
An optional company name []:redhat
[root@localhost ssl]# ls
http.csr  httpd.key
[root@localhost ssl]# scp http.csr 192.168.1.8:/etc/pki/CA/tmp
root@192.168.1.8‘s password: 
http.csr                                      100%  745     0.7KB/s   00:00

解释:上面操作首先生成个私钥,然后在生成个需要签署的证书文件http.csr,生成的最后为了保险建议可以设置密码redhat。最后用scp命令将需要CA签署的证书发送到CA服务端,远程复制时双方机器都要安装openssh、和openssh-clients软件包。


在CA的服务端做以下操作:

[root@hpf-linux CA]# openssl ca -in tmp/http.csr -out tmp/http.crt -days 3650
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: Jul 30 12:06:40 2015 GMT
            Not After : Jul 27 12:06:40 2025 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = Henan
            organizationName          = XXX
            organizationalUnitName    = linux
            commonName                = www.XXX.com
            emailAddress              = www@XXX.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                7E:FE:BB:01:D0:D5:02:DB:E9:D2:A3:A9:BC:BB:72:92:14:8B:05:29
            X509v3 Authority Key Identifier: 
                keyid:A0:D8:86:88:B3:63:1E:22:DD:BC:CB:1F:1B:C4:70:51:A6:22:7F:A5

Certificate is to be certified until Jul 27 12:06:40 2025 GMT (3650 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@hpf-linux CA]# scp tmp/http.crt 192.168.1.20:/etc/httpd/ssl
root@192.168.1.20‘s password: 
http.crt                                      100%    0     0.0KB/s   00:00

通过上面的步骤就可以成功的签署CA证书了先介绍下如何吊销CA证书。


5、CA证书的吊销

客户端获取证书serial:

[root@localhost ssl]# openssl x509 -in httpd.crt -noout -serial -subject
serial=01
subject= /C=CN/ST=Henan/O=XXX/OU=linux/CN=
www.XXX.com/emailAddress=www
www
www@XXX.com

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

[root@hpf-linux CA]# cat index.txt
V250727120640Z 01unknown/C=CN/ST=Henan/O=XXX/OU=linux/CN=
www.XXX.com/emailAddress=www
www

CA吊销证书 :

[root@hpf-linux CA]# openssl ca -revoke newcerts/01.pem 
Using configuration from /etc/pki/tls/openssl.cnf
Revoking Certificate 01.
Data Base Updated
[root@hpf-linux CA]# cat index.txt
R250727120640Z150730124101Z01unknown/C=CN/ST=Henan/O=XXX/OU=linux/CN=
www.XXX.com/emailAddress=www
www
www@XXX.com

五、OpenSSL工具简单使用举例

1、对称加密

对 /etc/issue 使用 3des 加密,存放于 /tmp 目录中,并解密还原回原来的文件:

[root@hpf-linux ~]# openssl enc -des3 -a -salt -in /etc/issue -out /tmp/issue.ciper
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:
[root@hpf-linux ~]# cat /tmp/issue.ciper
U2FsdGVkX19e01wFqw7iMlO82/jrmAUJ8x9IJ3aZ4xbZ2VpvWE8NNSuGNN8s5e+5
KRgQa/EuMDuvBh1niCl/MA==
[root@hpf-linux ~]# openssl enc -d -des3 -a -salt -in /tmp/issue.ciper -out /tmp/issue.txt
enter des-ede3-cbc decryption password:
[root@hpf-linux ~]# cat /tmp/issue.txt
CentOS release 6.6 (Final)
Kernel \r on an \m


2、单向加密

提取/tmp/issue.txt 文件的md5校验码:

[root@hpf-linux ~]# openssl dgst -md5 /tmp/issue.txt 
MD5(/tmp/issue.txt)= 1799bba46035c7a7ef10649b6a6f30a0
[root@hpf-linux ~]# md5sum /tmp/issue.txt
1799bba46035c7a7ef10649b6a6f30a0  /tmp/issue.txt


3、测试当前系统上的加密算法的性能,可以指定测试的加密算法:

[root@hpf-linux ~]# openssl speed


4、生成随机数

使用rand -hex可以生成16进制的随机数,rand -base64 生成base64编码格式字符。

[root@hpf-linux ~]# openssl rand -hex 4
5dc28c28
[root@hpf-linux ~]# openssl rand -base64 4
6alnHg==


5、生成非对称密钥

生成 RSA 私钥对,这里可以指定密钥文件路径和密钥位数,位数通常为 1024,2048,4096 位。:

[root@hpf-linux ~]# (umask 077;openssl genrsa -out /tmp/xxx.key 1024)
Generating RSA private key, 1024 bit long modulus
..................++++++
.......................................++++++
e is 65537 (0x10001)
[root@hpf-linux ~]# ls -lh /tmp/xxx.key 
-rw------- 1 root root 887 7月  30 18:28 /tmp/xxx.key
从私钥中提取公钥:
[root@hpf-linux ~]# openssl rsa -in /tmp/xxx.key -pubout 
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDFUSuBrR+Wz5hkcfXGXvEyAE+o
b/zGsUbcR7dMDSgt/sq0DWCS7tjwzNDvYxWOJokALIrsyXqyFORZLSLFujm2i9nL
ZUZWcThpreXLYwgVYaE/cuL1MWXRKJye03N/pqIiDrtYystwz4pcv6/8sFASRdCx
F6F6S1xKhGpl6N7ZRwIDAQAB
-----END PUBLIC KEY-----






本文出自 “粗茶淡饭” 博客,请务必保留此出处http://cuchadanfan.blog.51cto.com/9940284/1680216

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!