linux系统的加密功能及OpenSSL使用
一、密码学简介
据记载,公元前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中主要包含的三个组件:
libcrypto:通用加密库
libssl:TLS/SSL 的实现
openssl 命令行工具
2、OpenSSL作用
生成私有密钥.
生成证书,即数字签名证书,它包含一个公有密钥,可以用来单向的加密和解密数据.即,使用公钥加密的数据,只能使用私有密钥解密.使用私钥加密的数据,可以使用公钥来解密.
计算信息摘要.
SSL/TLS客户端和服务器端测试.
处理S/MIME标记和邮件的加密.
使用密码加解密(Encryption/Decryption with Ciphers)。
3、SSL协议简介
SSL是Secure Sockets Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输。其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。已经成为Internet上保密通讯的工业标准。
安全套接层协议能使用户/服务器应用之间的通信不被攻击者窃听,并且始终对服务器进行认证,还可选择对用户进行认证。SSL协议要求建立在可靠的传输层协议(TCP)之上。SSL协议的优势在于它是与应用层协议独立无关的,高层的应用层协议(例如,HTTP, FTP, TELNET等)能透明地建立于SSL协议之上。SSL协议在应用层协议通信之前就已经完成加密算法、通信密钥的协商及服务器认证工作。在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性。
4、SSL协议提供的安全信道的三个特性:
数据的保密性:信息加密就是把明码的输入文件用加密算法转换成加密的文件以实现数据的保密。加密的过程需要用到密钥来加密数据然后在解密。没有了密钥,就无法解开加密的数据。数据加密之后,只有密钥要用一个安全的方法传送。加密过的数据可以公开地传送。
数据的完整性:加密也能保证数据的一致性。例如,消息验证码(MAC),能够校验用户提供的加密信息,接收者可以用MAC来校验加密数据,保证数据在传输过程中没有被篡改过。
安全验证:加密的另外一个用途是用来作为个人的标识,用户的密钥可以作为他的安全验证的标识。SSL是利用公开密钥的加密技术(RSA)来作为用户端与服务器端在传送机密资料时的加密通讯协定。
四、利用OpenSSL实现私有CA
1、证书简介
公钥证书,通常简称为证书,是一种数字签名的声明,它将公钥的值绑定到持有对应私钥的个人、设备或服务的标识。证书的主要好处之一是主机不必再为单个使用者维护一套密码,这些单个使用者进行访问的先决条件是需要通过身份验证。相反,主机只需在证书颁发者中建立信任。 说得通俗一点就是,证书就是数字化的文件,里面有一个实体(网站,个人等)的公共密钥和其他属性,如名称等。该公共密钥只属于某一个特定的实体,它的作用是防止一个实体假装成另外一个实体。
2、证书结构
我们现在常用的证书是采用 X.509 结构的,这是一个国际标准证书结构。任何遵循该标准的应用程序都可以读写 X.509 结构的证书。包含有下面的信息:
版本信息:X.509 有三个版本(V1,V2,V3)。
系列号:证书颁发机构(CA)分配给证书的唯一序列号。序列号对于给定 CA 颁发的所有证书都是唯一的。
签名算法:CA 用于对证书进行数字签名的哈希算法。
颁发者:有关颁发证书的 CA 的信息
有效期时日期:证书有效期的开始日期
有效终止日期:证书有效期的最终日期
主题:向其颁发证书的个人、计算机、设备或 CA 的名称。如果企业中的域成员服务器上存在颁发 CA,则它在企业中将是可分辨名称。否则,它可以是全名和电子邮件名或其他个人标识符。
公共密钥:与证书关联的公钥类型和长度。
指纹算法:为数字签名生成数据摘要(即指纹)的哈希算法。
指纹:证书数据的摘要(即指纹)。
友好名称:(可选)要使用的显示名称而不是“主题”字段中的名称。
增强型密钥用法:(可选)可以使用此证书的目的。
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