一、加密方式
1、对称加密
使用“加密算法 + 口令”将明文转化为密文,算法可能是公开的,加密不依赖于算法,依赖于口令
加密、解密使用同一个口令(密钥),效率高
将原文分割成固定大小的数据块,对这些块进行加密
常用加密算法:
DES:Data Encryption Standard (56bits) 数据加密标准
3DES
AES:Advanced Encryption Standard (128bits,192bits,256bits,384bits) 高级加密标准
Blowfish,IDEA,RC6
密钥交换(IKE):
常用算法:
DH算法:密钥交换时,没有发送任何密钥,这个机制的巧妙在于需要安全通信的双方可以用这个方法确定对称密钥。然后可以用这个密钥进行加密和解密
私密性:保证
用户(身份)认证:无法验证 #数据来源
数据完整性:无法验证
缺点:
密钥过多
密钥分发困难
数据来源和完整性无法确认
2、非对称加密(公钥加密)
使用密钥对儿,公钥产生于私钥之中,用对方的公钥加密,私钥解密,反之亦然,公钥是公开的,私钥(secret key),通过工具创建,使用者自己留存必须保证其私密性;
常用加密算法:
RSA(加密,数字签名),EIGamal,DSA(DSA 只用于数字签名和认证),
密钥交换:
与被通信方之前,首先获取到对方的公钥,用对方的公钥加密自己的私钥,并发送给对方,完成密钥交换(安全性不高);
私密性:保证
用户(身份)认证:
私钥拥有者用自己的私钥加密的数据,只要用其公钥能解密,即可认证其身份;私钥加密的这个过程为数字签名。
但是用私钥加密,只要有公钥就可以解密,私密性就无法保证
完整性:无法验证
缺点:
密钥长,加密解密效率低下(比对称加密要慢3个数量级),适合加密较小数据
实现加密过程:
发送者使用接收者的公钥加密,接受者使用私钥解密
实现数字签名:
发送者使用自己的私钥加密,接受者使用发送者的公钥解密
3、单向加密
单项加密也称哈希(Hash),是将目标文本转换成具有相同长度的、不可逆的杂凑字符串(或叫做消息摘要),而加密(Encrypt)是将目标文本转换成具有不同长度的、可逆的密文。
只能从明文产生密文,反之不成,严格意义上来讲,它实现的是提取数据特征码
同一个数据,使用同一个算法,多次计算得到的结果一定相同,所以常用于验证数据完整性
定长输出,无论原数据大小是什么,加密后结果输入长度相同
输出格式:$加密算法$8位随机字符$加密后的密码
算法:
MD5:(centos5),SHA1 ,SHA512:(centos6,7采用)
4、如何实现加密通信?
了解了常用的三种加密方式后,我们到底使用哪种方式才可以安全地通信呢?
安全地通信需要保证私密性,完整性,身份认证,可用性
一次加密通信过程:
发送者:
1)使用单向加密算法提取生成数据的特征码; #保证完整性
2)使用自己的私钥加密特征码附加在数据后面; #身份验证,保证来源合法性
3)生成用于对称加密的临时密钥;
4)用此临时密钥加密数据和已经使用私钥加密后的特征码
#保证私密性,同时保证了可用性(效率)
5)使用接收方的公钥加密此临时密钥,附加在对称加密后的数据后方; #保证私密性
接收方:
1)使用自己的私钥解密加密的临时密钥;从而获得对称密钥;
2)使用对称密钥解密对称加密的数据和私钥加密的特征码密文;从而获得数据和特征码密文;
3)使用发送方的公钥解密特征码密文,从而获得从计算生成的特征码;
4)使用与对方同样的单向加密算法计算数据的特征码,并与解密而来的进行比较;
上面的方法看似能完美解决问题,但有没有漏洞呢?
漏洞在发送者和接受者需要获取彼此的公钥,如果有人在中间用自己的公钥冒充,我们怎样认证?从第三方机构获取对方的证书(公钥+)
二、加密解密技术常用的算法及工具
1、对称加密
算法:
DES,3DES,AES,Blowfish,Twofish,RC6,CAST5
工具:
gpg,opensll enc
[root@Note3 ~]# openssl --help openssl:Error: '--help' 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 enc -ciphername [-in filename] [-out filename] [-pass arg] [-e]
[-d] [-a/-base64] [-A] [-k password] [-kfile filename] [-K key] [-iv IV]
[-S salt] [-salt] [-nosalt] [-z] [-md] [-p] [-P] [-bufsize number]
[-nopad] [-debug] [-none] [-engine id]
-K key:指定使用的口令,不指定的话,命令执行后会询问 #(使用对称加密时)
-e:加密,默认
-d:解密
加密:
openssl enc -ciphername -e -a -salt -in /path/to/input_file -out /path/to/cipher_file
-des3 指定加密算法
-a 指定使用base64编码,默认输出是二进制的编码成文本格式
-in /path/to/input_file 指定加密哪个文件
-out /path/to/cipher_file 指定加密后保存在哪个文件
-salt 加盐
解密:
openssl enc -d -des3 -a salt -in /path/to/cipher_file -ouut /path/to/clear_file
[root@Node4 ~]# openssl enc -des3 -a -salt -in /etc/fstab -out /tmp/fstab.cipher -k 123456 [root@Node4 ~]# cat /tmp/fstab.cipher U2FsdGVkX1+MXasD/pdUrxnuhwGfQhLJdDXYejkVp6fZn8KiT9Q/lhWJiAr+Pc2O MDbIhJshEoTfTvhvB1J0dHTyO1C4C9RleZX0EQoxggRb1tqh2Y37dYwIOGXf/WWe itNRsa54ay0SRoBnNsM/wyYopbKYYdEJTj8LEXBmAnsA6CVRh2LRFB9WsRFTcDc/ N8qVJGR2Ov/ioyS1PV/ZiHNjkPR4wyGyz8Mu+RZB1/i4hdyWtVQf4BhcglCNNkh6 8AyU0CGMqk7t1ZPFY1Q3J0jE3JJ1uSI4f+Tkgzuq24VOwPUOvwlwP4MVTInElLjO CrL39CZVoTvU47bzVbQ70HXQb3yLzujBD+Kzz74W7AKY4Mn/V7uUroIT/aosUNhs vQtKkLAJyTbzMlwfkpQ6Xs4xbuK4ZPQ5hg8Edtpo3vZ84G04fe6BS4D9ATAvhiuu 9DbLrEiB6rlfZA6noaafWNG+7JtO9LicoNeC8y74kb1Gzxh4ff3RV16sskosm6IW hj8cEb7fruzuwKO8azGUeKjZMhRSpng/O+hBXSUGpNWruylW7SSI81VOWmCm8/ns V5uFDWa+WmMNIEhXLmp5Y4+bZILEgl7MvSwMyfvfjBBusGfwHDPJXuZUUb9WBTn2 xi4vA4shNdxrr44YPoWiSZ0eOe8U/6UwFuIQwIH39/LbZ3e75idYgGDuVnlEhbXz b1M0/W8DkyDQ4ybBOAm5J18KkrCgaA3xlbygRsIM7DqpnH1HIYHHs5+jKvmhItQ8 RoB9wsbeVX9zrvCWvzJ9J+ga9s1z2jA7mn6yZJVdLs77UknFunw8r1i3qtQJvs5M G7A+tvlYnxjjI6FpJEvPx0mK62ymW4x6NctOFdW7kvlzMnbI2qkxUT04jTCj9h4q O3++H8hgyCojWftVNTz77VFNLhpgacQ3GVzGBAO47XT5fxiqFWinOfj8zhqrI4pE UBSKPq8HsFnjuX5W1xoJ1M8FiRcdLmTQCWHttxnXSgSCqQhsaw11bH8L8NO34WS9 9PHKxS+yWl2sBagmH/ajDKIcInritY4CTPNRLFPZp5frVYafTV0De3sdiMs4zSzB ABM5cNNO69c= [root@Node4 ~]# openssl enc -d -des3 -a -salt -in /tmp/fstab.cipher -out /tmp/fstab.cleart -k 123456 [root@Node4 ~]# cat /tmp/fstab.cleart # # /etc/fstab # Created by anaconda on Fri Aug 5 17:32:21 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=e0c0bc25-62e5-4896-8749-fce761bc3af7 / ext4 defaults 1 1 UUID=970e070d-b49f-439b-8bbb-11ef49ee95ce /boot ext4 defaults 1 2 UUID=7e6bc97d-be6d-4ac9-bc26-8be3d80e715d swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0
2、单向加密 One-Way
算法:
md5:定长输出,128bits
sha1:160bits
sha512:512bits
工具:sha1sum,md5sum,cksum,openssl dgst
openssl dgst [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] [-out filename] /path/to/filename
[root@BAIYU_110 ~]# sha1sum /etc/fstab
4c0f1460d21e1141fcd3f93182cb87128702091f /etc/fstab
[root@BAIYU_110 ~]# openssl dgst -sha1 /etc/fstab
SHA1(/etc/fstab)= 4c0f1460d21e1141fcd3f93182cb87128702091f
单项加密的延伸应用:
MAC:消息摘要码
用于实现在网络通信中保证所传输的数据完整性
机制:
CBC-MAC:
HMAC:使用MD5和SHA1算法实现
用户认证:
工具:passwd,openssl passwd
openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify] [-quiet] [-table] {password}
[root@BAIYU_110 ~]# openssl passwd -1 # -1(数字1)表示使用MD5加密(提前特征码)
Password:
Verifying - Password:
$1$xOAnQ50H$Fzkdh.P7I20vOD94LJl6B/
[root@BAIYU_110 ~]# openssl passwd -1 #会自动随机加盐,相同的密码2次的结果不同
Password:
Verifying - Password:
$1$DbZWmzRR$RBP9WNYeTya9Zc9IcShvg/
[root@BAIYU_110 ~]# openssl passwd -1 -salt 123abc
Password:
$1$123abc$rlOkS30UBZu06DOR0wEQd/
[root@BAIYU_110 ~]# openssl passwd -1 -salt 123abc "123456"
$1$123abc$rlOkS30UBZu06DOR0wEQd/
3、公钥加密
加密速度慢,主要用于:身份认证,秘钥交换
公钥:pkey
私钥:skey
算法:
RSA,EIGmal
工具:
gpg,openssl rsautl #用的很少,速度太慢
数字签名:私钥加密,公钥解密
算法:
RSA,EIGmal
DSA:Digital Signature Algorthm 只能用于签名
DSS:Digital Signature Standard
三、PKI
1、PKI简介
PKI:Public Key Infrastucture 公钥基础设施(架构)
PKI包括:
端实体(申请者)
注册机构:RC
签证机构:CA(Certificate Authority)
证书吊销列表(CRL)发布机构
证书存取库:
PKI的开源实现:openssl,gpg
2、openssl
openssl是一个套件,开源程序
上面我们说到了很多的算法,那真正将这些算法予以实现那就需要一些软件来负责这些相关操作,而真正能够完成这些操作的常用软件分别是gpg,openssl;
什么是OpenSSL呢?
OpenSSL是一个强大的安全套接字层密码库,Apache使用它加密HTTPS,OpenSSH使用它加密SSH,但是,你不应该只将其作为一个库来使用,它还是一个多用途的、跨平台的密码工具。作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。
openSSL整个软件包由三个部分组成:
libcrypto:通用功能的加密库
libssl:用于实现TLS/SSL功能的库
openssl:多功能命令行工具
能生成密钥,创建数字证书,手动加密解密数据
常用的openssl标准命令:
openssl speed:加密解密速度测试
openssl version:openssl版本查看
openssl rand:生成伪随机数
[root@Node4 ~]# openssl rand Usage: rand [options] num where options are -out file - write to file -engine e - use engine e, possibly a hardware device. -rand file:file:... - seed PRNG from files -base64 - base64 encode output -hex - hex encode output [root@Node4 ~]# openssl rand -hex 6 83ab37421d51 [root@Node4 ~]# openssl rand -hex 128 f4f604e8378a67e692dec25abcf279641734a522cba234ddcafe467d3f8bf4d3bf8e867bc57e1cd2b81f5097b6f2dc180433afa62fc4358dbe651537b3487542b1ce1e395935b33e8388dfb496528f53fc60c645dbfcf5b780ad9887cf3c1b9e9e9e38edf569f0588653f9ddba74f545ec321d3661aaefe226193b05a26f9f9b [root@Node4 ~]# openssl rand -base64 32 HQ3If85wa4fNV5am7j5PZNKu6X4gjaGCJOYbl4nLeAQ= [root@Node4 ~]# openssl rand -base64 8 jCP005GFg7w=
openssl s_client:SSL_TSL客户端测试工具
基于文本的协议(如http),可以使用telnet作访问测试,openssl s_client(https)
3、数字证书
让第三方机构,能够使用一种可靠的手段,将申请者的公钥安全的分发出去
证书格式:x509标准,pkcs标准
x509.3证书格式:
证书格式的版本号
证书序列号
证书签名算法
证书颁发者
有效期
持有者的名称
持有者的公钥
CA的ID(可选的)
持有者的ID(可选的)
其它扩展信息
基本约束
证书策略
密钥的使用限制
CA签名
公钥和有效期限
持有者的个人合法身份信息:主机名
证书的使用方式:
CA的信息:
CA的数字签名:(CA使用自己的私钥加密前面4项信息的特征码)
谁给CA发证:自签署证书
4、申请数字证书的步骤
申请者:
1)生成一对儿密钥
2)把所需信息和公钥按固定格式制作成证书申请(签署请求)
CA:
1)生成一对儿密钥
2)自签证书
3)收到签署请求后,签署申请者的证书
四、用openssl实现私有PKI
1、环境
OS:CentOS 6.5 x86_64
CA:192.168.10.3/24
申请者:192.168.10.4/24
2、使用openssl实现私有CA
CA的配置文件:/etc/pki/tls/openssl.conf
默认配置即可,定义了CA工作目录和相关文件名
[ CA_default ] dir = /etc/pki/CA # Where everything is kept #CA的工作目录 certs = $dir/certs # Where the issued certs are kept #证书存放目录 crl_dir = $dir/crl # Where the issued crl are kept #吊销列表存放目录 database = $dir/index.txt # database index file. #索引文件数据库 #unique_subject = no # Set to 'no' to allow creation of # several ctificates with same subject. new_certs_dir = $dir/newcerts # default place for new certs. #刚签署好的证书存放目录 certificate = $dir/cacert.pem # The CA certificate #CA自己的证书 serial = $dir/serial # The current serial number #当前要使用的序列号 crlnumber = $dir/crlnumber # the current crl number #吊销要使用的序列号 # must be commented out to leave a V1 CRL crl = $dir/crl.pem # The current CRL #当前正在使用的证书吊销文件 private_key = $dir/private/cakey.pem# The private key #CA自己的私钥 RANDFILE = $dir/private/.rand # private random number file #随机数文件 x509_extensions = usr_cert # The extentions to add to the cert # Comment out the following two lines for the "traditional" # (and highly broken) format. name_opt = ca_default # Subject Name options cert_opt = ca_default # Certificate field options
查看CA工作目录:
[root@Note3 CA]# cd /etc/pki [root@Note3 pki]# ls CA ca-trust java nssdb rpm-gpg rsyslog tls [root@Note3 pki]# cd CA [root@Note3 CA]# ls certs crl newcerts private [root@Note3 CA]# ls private/ [root@Note3 CA]# ls newcerts/ [root@Note3 CA]# ls crl [root@Note3 CA]# ls certs/
生成私钥:
openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] [-f4] [-3] [-rand file(s)] [-engine id] [numbits]
(umask 077; openssl genrsa -out private/cakey.pem 2048) #()表示在子shell中运行
numbits:表示使用多长的密钥,默认1024
[root@Note3 CA]# openssl genrsa -out private/cacert.pem 2048 Generating RSA private key, 2048 bit long modulus ..+++ ................................................+++ e is 65537 (0x10001) [root@Note3 CA]# ls certs crl newcerts private [root@Note3 CA]# ls private/ cacert.pem [root@Note3 CA]# cat private/cacert.pem -----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEAwEUo8Sm7VlDhE4CDGclh7Brozz4QlNKAuLBkydurA+fsyNOv l6iznDKkGqnimX/FRK851N5jCIwe1ON7IPYNyy+IiejOUBxPYfeaUadEMXB2CdLT X1EpgEbGsW7WzxFdvVNEGvuC1A/wG2O8SZDA4x3Ymuubr18MuCksPY03WgRNXPNm QiCNA/tq5Qna0eNCOIGttHrYbJqRzLyBOWBEiCz1edVeG/7PrpfDz6MWswYijbK1 ONhqh17YiCPsPcXdD30Wey4D90qqjebiKO9EyHvtar45mMaxeE5snLWBvbnZH2Af Eb10VdSnVkexsHmt23nwemiSmFhu/I+dUSGYBQIDAQABAoIBAF7+zKe6srCG7W2x RRTshtEcyoH6bD7bcnXN0T5apjgb0sW2sT8BPxyheKsj3K1yj4jL+orOBagncuRE MIWsjEwjhBZ/S9AQ7Le+miRVvD+hDPD1lTG27AZQ8cKgvMk6D1KHXVLniVA1P7CI qnK+bk7IZEjGt/kBwUsMLKuMphh2xCHeNyafko5srFgZt0HYI5PZsWhBFuRxmmA9 7dbuFI18TSJpU14vGoKQk6fOFfQGGyyy6amThx6Nz2KXFlQBrDdCii3E2QqDWkc/ T8T6KbNkRcTzMFYexLAanmTSad16Z9pW/naDQkLrzfaoYKS1jC4V8eEZCFf9X5RU SfI7EoECgYEA6m9oKCDDmIwxhiS7srJl8OSgNuAVj1Ztm/YKd3NaReHsCQvEkWMP Zb9tBXmXDIatwzK0rBlMvcZZUV2y+J4xxKc+uJtNv98PcoCcSyUdZ2OICgiwr3aN d2WbR4PesYITzGYTnZiJlyp2ezllVuSc/Q+kY/PH7r90m7ROdliJpSkCgYEA0fTU opAfPw3iaYlDMCi6iAm+MWYJxWPnleg2hziRXiiibsO3goDwvI5G3yjHVmcypp1j HtBRIef5v5Sl8m3FHIrp8xufUZp1LioezDySBoaFsw0aHa7dVelXKUaf/KqNsDdl CjzBMAIc/MBlUSyFTiF87/4M0N9T5+NPbbHvu30CgYAxMkngSefiBmGKLgE5odhk sgWxHltH5jJATWSq5okmKx/2UgLhI7Gif4ZoZLi/BzBFy0lA6FpDZPFvcsNRCxmU lChEY0rwneXG+JhT6Kj//lIZEPPLDoznZmosms7L32k6Np2dL9qH34BXoZbTokwT iwnLc+gcAQ9+cVsZ2MCh6QKBgQDLz9J2eFeMuyq17kRlxLPGiUay523GywOttvzv 6Q7ci6+avK0wp4CKWcccrJZNHuLBcPkemXSY6Hq96kvpeXumCIewsnjHG5xzEvpQ ot/SK9YwCSD3/Z7o3hn5fJCkEuB2Vl/kPzP+KZ8AELiJwyEoxkNlKYZBYPovma6q OtgQdQKBgBr3RauBRhUjIms1vMgTnKh9TPboVAPyAhXN4d2DJf9rgB3wPggn2BP7 MFgr48+8Cs1/xUxB1FFYVy2uY6shYT03P2z0ggR5n7e3j0nlMJIb4NUDxWWNoEfx b9H6pRpd7mOb3sfgZr6VscE4Svi5OS9zL8Eyo6lAkHYA5M+ks4IN -----END RSA PRIVATE KEY----- [root@Note3 CA]#
从私钥中提取公钥:非必要步骤,openssl会自动从私钥中提前公钥来签署证书
openssl rsa -in private/cakey.pem -pubout [-text]
[-out /pathto /filename] #不用text,text会显示提前信息
[root@Note3 CA]# openssl rsa -in private/cacert.pem -pubout writing RSA key -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwEUo8Sm7VlDhE4CDGclh 7Brozz4QlNKAuLBkydurA+fsyNOvl6iznDKkGqnimX/FRK851N5jCIwe1ON7IPYN yy+IiejOUBxPYfeaUadEMXB2CdLTX1EpgEbGsW7WzxFdvVNEGvuC1A/wG2O8SZDA 4x3Ymuubr18MuCksPY03WgRNXPNmQiCNA/tq5Qna0eNCOIGttHrYbJqRzLyBOWBE iCz1edVeG/7PrpfDz6MWswYijbK1ONhqh17YiCPsPcXdD30Wey4D90qqjebiKO9E yHvtar45mMaxeE5snLWBvbnZH2AfEb10VdSnVkexsHmt23nwemiSmFhu/I+dUSGY BQIDAQAB -----END PUBLIC KEY-----
生成自签证书:
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
-key:指定私钥文件,会自动抽取公钥来自签
-x509:表示是自签证书,默认365天,可以在配置文件中修改默认设置
-days:表示有效期限
-new:表示生成一个新的签署请求
[root@Note3 CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655 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 #国家的2位代码 State or Province Name (full name) []:fujian #省份或州 Locality Name (eg, city) [Default City]:xiamen #城市 Organization Name (eg, company) [Default Company Ltd]:Anyfish #公司名 Organizational Unit Name (eg, section) []:Linux Operation #部门 Common Name (eg, your name or your server's hostname) []:Node3 #CA的主机名 Email Address []:anyfish@anyfish.com [root@Note3 CA]# ls cacert.pem certs crl newcerts private
创建签署证书时所需的文件:否则签署时会报错
[root@Note3 CA]#touch index.txt serial crlnumber [root@Note3 CA]# echo 01 > serial #签署证书序号从01开始计数
CA已经创建完毕,就等客户上门了。
3、使用openssl实现证书申请
私有CA默认要求国家,省份,城市,公司名,域名相同才能签署成功,不同时要签署成功需要修改CA的配置文件
在主机上生成密钥,保存至应用此证书的服务的配置文件目录下:
[root@Node4 tmp]# (umask 077;openssl genrsa -out httpd.key 1024) Generating RSA private key, 1024 bit long modulus .....................................++++++ ....................++++++ e is 65537 (0x10001) [root@Node4 tmp]#
生成证书签署请求:
openssl req -new -key httpd.key -out httpd.csr
[root@Node4 tmp]# 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) []:fujian Locality Name (eg, city) [Default City]:xiamen Organization Name (eg, company) [Default Company Ltd]:Anyfish Organizational Unit Name (eg, section) []:linux Operation Common Name (eg, your name or your server's hostname) []:Node4 #主机名,这里一定要是使用的主机名 Email Address []:xie_xie@anyfish.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: #申请签署证书加密存放,默认为空,不加密 An optional company name []:
将证书签署请求发给CA:
4、CA签署证书
openssl ca -in /tmp/httpd.csr -out /tmp/httpd.crt -days 365
[root@Note3 CA]# openssl ca -in /tmp/httpd.csr -out /tmp/httpd.crt -days 365 # -out 指定输出一份,在CA的工作目录下也会生成一份,使用序号.pem为文件名 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: Jan 6 09:12:59 2017 GMT Not After : Jan 6 09:12:59 2018 GMT Subject: countryName = CN stateOrProvinceName = fujian organizationName = Anyfish organizationalUnitName = linux Operation commonName = Node4 emailAddress = xie_xie@anyfish.com X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 22:13:8A:B6:0D:FD:B9:D9:89:60:3F:E1:D8:1D:F4:90:0D:AD:37:2D X509v3 Authority Key Identifier: keyid:66:80:23:FE:07:5C:62:DA:C6:A3:F5:48:6A:B7:B0:3F:5F:D7:6A:B2 Certificate is to be certified until Jan 6 09:12:59 2018 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@Note3 CA]# ls cacert.pem crl index.txt index.txt.attr.old newcerts serial certs crlnumber index.txt.attr index.txt.old private serial.old [root@Note3 CA]# cat serial 03 [root@Note3 CA]# ls certs/ [root@Note3 CA]# ls newcerts/ 01.pem 02.pem [root@Note3 CA]# ls crl [root@Note3 CA]# ls cacert.pem crl index.txt index.txt.attr.old newcerts serial certs crlnumber index.txt.attr index.txt.old private serial.old [root@Note3 CA]# cat crlnumber
将证书传回请求者:
[root@Note3 CA]# scp /tmp/httpd.crt 192.168.10.4:/tmp The authenticity of host '192.168.10.4 (192.168.10.4)' can't be established. RSA key fingerprint is c2:00:8e:68:4c:f1:65:a6:00:14:c0:7a:49:1b:fc:2b. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.10.4' (RSA) to the list of known hosts. root@192.168.10.4's password: httpd.crt 100% 3880 3.8KB/s 00:00
5、吊销证书
openssl ca -revoke /path/to/somefile.crt
[root@Note3 CA]# openssl ca -revoke /tmp/httpd3.crt Using configuration from /etc/pki/tls/openssl.cnf Revoking Certificate 04. Data Base Updated [root@Note3 CA]# cat index.txt R 180106091259Z 170106094907Z 01 unknown /C=CN/ST=fujian/O=Anyfish/OU=linux Operation/CN=Node4/emailAddress=xie_xie@anyfish.com R 180106092316Z 170106094745Z 02 unknown /C=CN/ST=fujian/O=Anyfish/OU=network/CN=node4/emailAddress=123 R 180106095446Z 170106095753Z 03 unknown /C=CN/ST=jiangxi/L=fuzhou/O=anyfish/OU=network/CN=node4/emailAddress=112 R 180106095917Z 170106100230Z 04 unknown /C=CN/ST=fujian/L=xiamen/O=abc/OU=network/CN=node4/emailAddress=11
五、ssl
1、ssl简介
SSL:Secure Socket Layer 安全套接字层,位于可靠的面向连接的传输层协议和应用层协议之间的一种协议层。应用层数据不再直接传递给传输层,而是传递给SSL层,SSL层对从应用层收到的数据进行加密,并增加自己的SSL头。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。
该协议由两层组成:SSL记录协议和SSL握手协议。
TLS:Transport Layer Security 传输层安全协议 国际标准化组织借鉴SSL开发的协议
SSL是Netscape开发的专门用户保护Web通讯的,目前版本为3.0。最新版本的TLS 1.0是IETF(工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。两者差别极小,可以理解为SSL 3.1,它是写入了RFC的。
ssl通常是库,其它程序可以调用ssl库,实现安全通信
http --> https
ldap --> ldaps
ftp --> ftps
smtp --> smtps
pop3 --> pop3s
互联网的通信安全,建立在SSL/TLS协议之上
3、作用
不使用SSL/TLS的HTTP通信,就是不加密的通信。所有信息明文传播,带来了三大风险:
窃听风险(eavesdropping):第三方可以获知通信内容。
篡改风险(tampering):第三方可以修改通信内容。
冒充风险(pretending):第三方可以冒充他人身份参与通信。
SSL/TLS协议是为了解决这三大风险而设计的,希望达到:
所有信息都是加密传播,第三方无法窃听。
具有校验机制,一旦被篡改,通信双方会立刻发现。
配备证书,防止身份被冒充。
3、历史
互联网加密通信协议的历史,几乎与互联网一样长。
1994年,NetScape公司设计了SSL协议(Secure Sockets Layer)的1.0版,但是未发布。
1995年,NetScape公司发布SSL 2.0版,很快发现有严重漏洞。
1996年,SSL 3.0版问世,得到大规模应用。
1999年,互联网标准化组织ISOC接替NetScape公司,发布了SSL的升级版TLS 1.0版。
2006年和2008年,TLS进行了两次升级,分别为TLS 1.1版和TLS 1.2版。最新的变动是2011年TLS 1.2的修订版。
目前,应用最广泛的是TLS 1.0,接下来是SSL 3.0。但是,主流浏览器都已经实现了TLS 1.2的支持。TLS 1.0通常被标示为SSL 3.1,TLS 1.1为SSL 3.2,TLS 1.2为SSL 3.3。
4、SSL/TLS基本的运行过程
SSL/TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。
SSL具有保密性、真实性、完整性和不可否认性,广泛使用在重要高度安全场景。
这些特性具体怎么体现呢?
SSL协议的客户端服务器连接握手过程大致如下:
4.1 客户端发出请求(ClientHello)
首先,客户端(通常是浏览器)先向服务器发出加密通信的请求,这被叫做ClientHello请求。
在这一步,客户端主要向服务器提供以下信息:
1)支持的协议版本,比如TLS 1.0版。
2)一个客户端生成的随机数,稍后用于生成"临时对话密钥"。
3)支持的加密方法,比如RSA公钥加密。
4)支持的压缩方法。
这里需要注意的是,客户端发送的信息之中不包括服务器的域名。也就是说,理论上服务器只能包含一个网站的url,否则会分不清应该向客户端提供哪一个网站的数字证书。这就是为什么通常一台服务器只能有一张数字证书的原因。
对于虚拟主机的用户来说,这当然很不方便。2006年,TLS协议加入了一个Server Name Indication扩展,允许客户端向服务器提供它所请求的域名。
4.2 服务器回应(SeverHello)
服务器收到客户端请求后,向客户端发出回应,这叫做SeverHello。
服务器的回应包含以下内容:
1)确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
2)一个服务器生成的随机数,稍后用于生成"临时对话密钥"。
3)确认使用的加密方法,比如RSA公钥加密。
4)服务器证书。
除了上面这些信息,如果服务器需要确认客户端的身份,就会再包含一项请求,要求客户端提供"客户端证书"。比如,金融机构往往只允许认证客户连入自己的网络,就会向正式客户提供USB密钥,里面就包含了一张客户端证书。
4.3 客户端回应
客户端收到服务器回应以后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。如果证书没有问题,客户端就会从证书中取出服务器的公钥。
然后,向服务器发送下面三项信息:
1)生成一个随机数。该随机数用服务器公钥加密,防止被窃听。
2)编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
3)客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验。
上面第一项的随机数,是整个握手阶段出现的第三个随机数,又称"pre-master key"。有了它以后,客户端和服务器就同时有了三个随机数,接着双方就用事先商定的加密方法,各自生成本次会话所用的同一把"临时会话密钥"。
至于为什么一定要用三个随机数,来生成"会话密钥"?
"不管是客户端还是服务器,都需要随机数,这样生成的密钥才不会每次都一样。由于SSL协议中证书是静态的,因此十分有必要引入一种随机因素来保证协商出来的密钥的随机性。
对于RSA密钥交换算法来说,pre-master-key本身就是一个随机数,再加上hello消息中的随机,三个随机数通过一个密钥导出器最终导出一个对称密钥。
pre master的存在在于SSL协议不信任每个主机都能产生完全随机的随机数,如果随机数不随机,那么pre master secret就有可能被猜出来,那么仅适用pre master secret作为密钥就不合适了,因此必须引入新的随机因素,那么客户端和服务器加上pre master secret三个随机数一同生成的密钥就不容易被猜出了,一个伪随机可能完全不随机,可是是三个伪随机就十分接近随机了,每增加一个自由度,随机性增加的可不是一。"
此外,如果前一步,服务器要求客户端证书,客户端会在这一步发送证书及相关信息。
4.4 服务器的最后回应
服务器收到客户端的第三个随机数pre-master key之后,计算生成本次会话所用的"会话密钥"。然后,向客户端最后发送下面信息:
1)编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
2)服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。
至此,整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用"会话密钥"加密内容。