一、SSL协议
现代信息流通中web占了巨大的一部分,但是实际上web除了https协议支持的web服务器,信息对外都是透明的,现在流行的https全栈设计就是要摆脱信息泄漏的危险。传统的服务如http都是成熟已久的服务,为了减少不必要的麻烦,SSL(Secure Socket Layer)协议就应运而生了--在TCP/IP的应用层和网络层之间添加协议SSL子层(如下图),程序员调用协议子层协议实现数据加密和传输。
二、SSL协议会话会话过程
三、openssl基础
单向加密:只能加密,不能解密。
工具:openssl dgest,mdsum,sha1sum,sha224sum等等
dgst命令:单向加密可以选定加密方法
openssl dgst -md5 /tmp/fstab MD5(/tmp/fstab)= 85301c14005a7d9eae19ddfc3475131d# md5sum /tmp/fstab 85301c14005a7d9eae19ddfc3475131d /tmp/fstab
公钥加密:三种功能:加密解密,密钥传送,数字认证
1加密解密:
算法:RSA,ELGamal
工具:openssl,rsautl,gpg
2.数字签名:
算法:RSA,DSA,ELGamal
工具:openssl,rsautl,gpg
3.密钥交换:
算法:DH
生成密钥:
生成私钥:~]#(umask 077;openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE NUM_BITS )
提出公钥:~]#openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -pubout
# (umask 077;openssl genrsa -out /tmp/a.private 1024) Generating RSA private key, 1024 bit long modulus...........................................................++++++....................++++++e is 65537 (0x10001) # cat /tmp/a.pr -----BEGIN RSA PRIVATE KEY----- MIICXgIBAAKBgQC5cLbUjCv9MELyHAndxltipdmvvtnMem6E9JZ7ymifMnggFHwbcRO3q03S6pTbdDKaBnMRulw9OQdvCOexm3Ym9P1jNLM6vNgGnROyWxWUoXZWd/YRG4WP0Lo2yvTdzXkNAwFL9S0wZTKfsFI3FYtV/432XA5vuI3olwgG8IJWhwIDAQABAoGBAKFf/TsqYH2NKjUXQV7F53EJc08FfvP694KsduhzVGh1uyPvr7ERzl7frHIHwlLX49E2G50p2GtO3bE6xqZA66euq8W4TefCVmKZm2P3c2Aj6HuRhVyKkFdZ7bZSjYDtGYjksTlzmHzC8g6Wzs3B3AHifuNU8oazqxINPObz5hABAkEA7P9oSBfhu8wm42r95UFqxWlwSRaYHyWSN4KQyM6IIWzjGFTSt4+DX4AUDGc9PpoB4l2HcnRctdU/RHn/54DxhwJBAMhPC2NzmGtiG1XW0uYfCXjmqF+iU79zQ/ikfVJRoEfZN4jPdTurCFxssbyQSJYnWxZTtM+4eS6F7mlKUabgswECQQDYwfB6n30R6fJXZW+50k75JypPbp7LPe2xX3VUc7EGATTi+BGRWWzqV5X+kh3tt6Wph6luAQcaN2OaGYr4DXLZAkBwVfQbGC74uhJ+d3XbXLihNypiR9UT337VKNqnmeN7p9Q/Q6mJhwevXb3n9DrhCr1IrjUO8XP0pWPpZKaaIhYBAkEAja39oNrqbvmBbmaanMfACTkf9CTgpjbfau63lArey1e0QJRz8I4wOZA/EEm9twvvNyYnUiiDJbTIwuY7xHwTyA==-----END RSA PRIVATE KEY----- # openssl rsa -in /tmp/a.private -puboutwriting RSA key-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5cLbUjCv9MELyHAndxltipdmvvtnMem6E9JZ7ymifMnggFHwbcRO3q03S6pTbdDKaBnMRulw9OQdvCOexm3Ym9P1jNLM6vNgGnROyWxWUoXZWd/YRG4WP0Lo2yvTdzXkNAwFL9S0wZTKfsFI3FYtV/432XA5vuI3olwgG8IJWhwIDAQAB -----END PUBLIC KEY-----
Linux系统上的随机数生成器
/dev/random:仅从熵池返回随机数;随机数用尽,阻塞;
/dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞;
伪随机数不安全;
熵池中随机数的来源:
硬盘IO中断时间间隔;复制大文件到磁盘会有大量磁盘IO中断
键盘IO中断时间间隔;
五、 CA
CA分为公共信任的CA,私有CA两种,公有CA是外部机构建立的,申请即可,费用也不低。私有CA范围有限,可以在公司内部建立,当然只能在公司内部使用,因为你的证书别人并不认可,缺乏权威。
搭建私有CA:以下两种实现
openssl
OpenCA:开源CA
这里讲解openssl搭建私有CA:
openssl命令:
openssl的配置文件:/etc/pki/tls/openssl.cnf ;其中部分配置定义了CA的配置。
[ca]段定义ca特性:ca怎么管理ca,ca 工作环境
dir = /etc/pki/CA # Where everything is kept 工作目录 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.各个已经颁发的证书索引,包含序列号 new_certs_dir = $dir/newcerts # default place for new certs.对应certs目录中的证书的 SERIAL.crtserial = $dir/serial # 用于为ca提供证书序列号存储位置 certificate = $dir/cacert.pem # 指定CA 自签证书 private_key = $dir/private/cakey.pem # The private key.CA自身私钥 default_days = 365 # 默认的证书有效期
[req]段是request请求配置段,需要的认证单位个人向CA发出注册签署请求,这里定义怎么生成配置请求。
在确定配置为CA的服务上生成一个自签证书,并为CA提供所需要的目录及文件即可:
步骤:
(1)生成私钥;
~]#(umask077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
(2)生成自签证书;man req即可
~]#openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655 #命令自动抽取公钥再生成req,在签署过程中生成公钥。证书申请填写的是组织信息。
# openssl req -key -new -x509 /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) []:BeiJing Locality Name (eg, city) [Default City]:BeiJing Organization Name (eg, company) [Default Company Ltd]:MagEdu # 私建CA,那么用于公司内部,就用公司名 Organizational Unit Name (eg, section) []:Ops Common Name (eg, your name or your server‘s hostname) []:ca.magedu.com #要服务器或主机名字 Email Address []:[email protected] # ls /etc/pki/CA/cacert.pem /etc/pki/CA/cacert.pem [[email protected] ~]# ls /etc/pki/CA/cacert.pem -al -rw-r--r--. 1 root root 2065 4月 7 02:06 /etc/pki/CA/cacert.pem
-new:生成新证书签署请求;
-x509:生成自签格式证书,专用于创建私有CA时;不是自签就不要加了,自动签署证书;
-key:生成请求时用到的私有文件路径;
-out:生成的请求csr文件路径;如果自签操作将直接生成签署过的证书;
-days:证书的有效时长,单位是day;
(3)为CA提供所需的目录及文件;
~]#mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
~]#touch /etc/pki/CA/{serial,index.txt} #序列号,数据库文件
~]#echo 01 > /etc/pki/CA/serial # 给定一个需要起始号码
请求签署证书:要用到证书进行安全通信的服务器,需要向CA请求签署证书;
步骤:(以httpd为例,前三步骤在请求主机上做,第四步在CA主机上做)
(1)用到证书的主机生成私钥;
~]#mkdir /etc/httpd/ssl
~]#cd /etc/httpd/ssl
~]#(umask 077;openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)#不要在CA配置目录下创建,那是作为CA主机并自建CA才用到的路径。
(2)生成证书签署请求
~]#openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 365 # 不要写-x509
(3)将请求通过可靠方式发送给CA主机;
(4)在CA主机上签署证书;
~]#openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
~]#cat /etc/pki/CA/index.txt
#cat /etc/pki/CA/index.txt V 170105083250Z 01 unknown /C=CN/ST=Beijing/U=Magedu/OU=Ops/CN=www.magedu/[email protected]
主识标标:
/C=CN/ST=Beijing/U=Magedu/OU=Ops/CN=www.magedu/emailaddress[email protected]
查看证书中的信息:
~]#openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject # 只显示serial subject
吊销证书:
步骤:
(1)客户端获取要吊销的证书的serial(在使用证书的主机执行):
~]#openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject
(2)在CA主机吊销证书
先根据客户提交的serial和subject信息,对比其与本机数据库index.txt中存储的是否一致;
如果一致,那么吊销:
#openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem,其中的SERIAL要换成证书真正的签署序列号;
(3)生成吊销证书的吊销编号(第一次吊销证书时执行)
#echo 01 > /etc/pki/CA/crlnumber # 吊销序列号
(4)更新证书吊销列表
#openssl ca -gencrl -out /etc/pki/CA/CA_NAME.crl
查看crl文件:
#openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text