一 现在的加密/解密技术主要有三种:对称加密,公钥加密,和单向加密
对称加密:指的是加密方和解密方使用的是同一个密钥
特性:
1 加密。解密使用同一个秘钥;
2 将原始数据分割成固定大小的块,逐个进行加密
算法:DES 3DES AES
公钥加密:秘钥是成对出现
公钥:公开给所有人; pubkey
私钥:自己留存,必须保证去私密性;secret key
特点:用公钥加密的数据只能用与之配对的私钥解密,反之亦然;
特性:
数字签名:用于接收方确认发送方的身份
秘钥交换:发送方用对方的公钥加密一个对称秘钥,并发送给对方;
数据加密
算法:RSA DSA ELgamal
单项加密:单向加密就是用来计算一段数据的特征码的
功能:保证数据的完整性:
特性:定长输出
算法:
md5:128bit sha1:160 sha224 sha256 sha384 sha512
通过图解来说明一次完整的通信过程
加密过程:
第一步:用单向加密算法提取数据(黑框A)的特征值
第二步:用自己的私钥加密这段特征值形成黑框B
第三步:用对称加密算法,对黑框A和黑框B来加密,得到红框A
第四步:用ALICE的公钥来加密第三步所用的密钥,得到红框B
解密过程:
第一步:ALICE用自己的私钥解密红框B得到对称加密的密钥
第二步:用这个密钥解密红框A内容第三步:用BOB的公钥解密黑框B,如果能成功,说明发送方确实是BOB,这就完成了身份验证(解密后会得到一串数据的特征值)
第四步:用同样的单项加密算法来对这段数据提取特征值,如果和第三步的特征值一样,说明这段数据是完整的,这就完成了数据完整性的校验
二 openssl使用详解
上面我们说到了很多的算法,那真正将这些算法予以实现那就需要一些软件来负责这些相关操作,而真正能够完成这些操作的常用软件分别是gpg,openssl;
本文的重点是openssl的应用.
2.1、什么是OpenSSL呢?
OpenSSL是一个强大的安全套接字层密码库,Apache使用它加密HTTPS,OpenSSH使用它加密SSH,但是,你不应该只将其作为一个库来使用,它还是一个多用途的、跨平台的密码工具。作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。
2.2、OpenSSL的基本功能:
OpenSSL整个软件包由三个套件组成:
1).libcrypto:通用功能密码算法库
2).libssl:SSL协议库,用于实现TLS/SSL的功能
3).OpenSSL:多功能命令行工具(能够实现生成密钥、创建数字证书、手动加密解密数据)
OpenSSL的目录结构自然也是围绕这三个套件功能部分进行规划的。
openssl是多用途的加密组件,命令行工具,其可以实现对称加密算法、非对称加密算法、单向加密算法、作为一个简单的CA(OpenCA),其依赖的配置文件默认在/etc/pki/tls/openssl.cnf中,也可以自己定义;openssl作为简单的CA其颁发的证书格式有x509(比较通用,定义了证书的格式,类似于pkcs#10),pkcs#12和pkcs#17定义了如何将证书存诸的格式;openssl也可以实现证书格式的转换。
3.1、利用openssl工具加密、解密的基本使用方法以及算法:
对称加密:
工具:open enc,gpg
[root@www1 tmp]# openssl enc -e -des3 -a -salt -in services -out services.ciphertext
#-e 表示加密
#-des3 表示加密算法,可以更换算法
#-a 基于文本加密
#-salt 自动加些杂质进来
#-in 表示加密哪个文件(services)表示加密的文件
#-out 加密后的文件,后接文件
[root@www1 tmp]# rm services #删除原文件 是否能恢复出来 [root@www1 tmp]# openssl enc -d -des -a -salt -in services.ciphertext -out services
[root@www1 tmp]# ls 解密后的文件 services services.ciphertext test
单项加密:
工具md5sum sha1sum sha224sun ....openssl dgst
[root@www1 tmp]# openssl dgst -md5 -hex services MD5(services)= 35435ea447c19f0ea5ef971837ab9ced
MAC:消息认证码,单项加密的
延伸应用,用于实现在网络通信中保证所传输入的数据的完整性;
生成用户密码:
openssl passwd
[root@www1 tmp]# openssl passwd -1 -salt 123456 #随机生成密码验证码 -1表 示md5 -salt添加杂质 Password: #要是输入的密码 $1$123456$wWKtx7yY/RnLiPN.KaX.z.
生成随机数:
[root@www1 tmp]# openssl rand -base64 8 #8表示字节数 b2HAoy66zm4= #做密码时=不需要 [root@www1 tmp]# openssl rand -hex 4 #hex时,每个字符4位,出现的自己 数为NUM*2 271bd612
公钥加密:
加密:
算法:RSA,elgamal
工具:gpg openssl
数字签名:
算法:RSA,DSA ,elgamal
生成秘钥对:
[root@www1 tmp]# openssl genrsa -out rsakey.private 2048 #生成私钥 Generating RSA private key, 2048 bit long modulus ........................................................+++ ...............................................................+++ e is 65537 (0x10001) [root@www1 tmp]# openssl rsa -in rsakey.private -pubout #提取公钥 writing RSA key -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA08Q4TFh8TKeYUw1NPk03 vYgPXvX89gK1xhUIFCVvJ6NerL49avIlyFiJGmhHEcOKQ+ksKqEX0lwkOzq9+Lji piAcPb1GHte4ZUEu8DLRysbsfJjtDvkKFpxWHvIZQTEBE5xxtmbik6jt9YToFyUQ xYdI14i23YcNgg3bXf2KQu+9M8cyh7ZVj/Wi42iADFG6mFRabFWN05rKoan02jER R89T5QPazi7kO0OV/Ju3sYIQ9GPPxvUCl/B2WDvxvEb9mv81dyGxu7DrcTAS6wuG fk2mrRrRzsONNsHFnaRcgIs98L128YtU401AYs5zQCCo9CeYfrpSKpN8ym/Q7q2T iQIDAQAB -----END PUBLIC KEY-----
[root@www1 tmp]# chmod og= rsakey.private #其他人不能有访问权限 [root@www1 tmp]# ll total 1484 -rw------- 1 root root 1675 Sep 17 20:46 rsakey.private
也可以另外一个命令
[root@www1 tmp]# (umask 077;openssl genrsa -out key.pri 2048) #这样,其他用户就没访问权限
随机数生成器:
/dev/random:仅从熵池返回随机数;随机数用尽,会发生阻塞
/dev/urandom:从熵池返回随机数:随机数用尽,会利用软件生成伪随机数,非阻塞
OpenSSH:
C/S
C: ssh scp sftp
S:sshd
客户端组件;
ssh 配置文件:/etc/ssh/ssh_config
ssh [user@host] #如果没有指用户名,则用当前登陆的用户作为登陆远程主机
ssh -p port
基于秘钥的认证:
1 ssh-keygen -t rsa 客户端生成秘钥对
[root@localhost .ssh]# ssh-keygen -t rsa -P ‘‘ -f /root/.ssh/id_rsa
2 把公钥传输至远端服务器的家目录下
[root@localhost .ssh]# ssh-copy-id -i id_rsa.pub root@192.168.1.112
3 需确保秘钥文件的权限是600
[root@centos6 .ssh]# ll -rw-------. 1 root root 408 Sep 16 20:29 authorized_keys
4 scp命令:
scp [options] SRC...DEST/
[root@yangbb .ssh]# scp root@192.168.1.112:/root/nohup.out /root/
# 从远端服务器复制文件到本地
[root@yangbb ~]# scp abc.txt root@192.168.1.112:/root/ #复制本地文件到远端服务器 常用选项: -r:递归 -p:保持原文件的属性信息 -q:静默模式 -P:port:指明远程主机的监听端口
服务器端:
生产环境应该注意:
1 不要使用默认端口:
2 禁止使用protocal version 1;
3 限制可登录用户:
4 设定空闲回话超时时长
5 利用防火墙来设定SSH访问策略:
6仅监听特定的IP地址:
7使用强密码策略
8基于秘钥的认证
9禁止使用空密码
10禁止root用户直接登录
11限制ssh的访问频率和并非在线数
12做好日志,经常分析
/etc/ssh/sshd_config 的设置
#Port 22 #默认监听端口需重新设置 #ListenAddress 0.0.0.0 #默认是本机所有的IP地址 监听的IP地址,最好是内网网卡的IP #PermitRootLogin yes #可设置禁止root登录 #MaxAuthTries 6 #登录次数,可以设置更小 #MaxSessions 10 #最大并行登录个数 #UseDNS yes #改为no 绕过反解
可用随机数生成密码:
[root@www1 tmp]# tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30 | xargs m7HSct6PtX7G3G7zU8MtHxLsRlQ8T9
OpenSSL:
三个组件:
openssl:多用途的命令行工具:
libcrypto:公共加密库;
libssl:库,实现了ssl及tls:
PKI:public key infranstructure
签证机构:CA
注册机构:RA
证书吊销列表:CRL
证书存储库:
建立私有CA:
那么谁来给CA发证呢?
还是由CA使用其私钥来对证书进行签名,这种我们称之为自签署证书。
如果我们为自己做一个私有CA的话,那我们就需要为自己签名;
证书申请请求:
1、生成申请请求;
2、RA核验;
3、CA签署;
4、获取证书;
假设在公司内部实现基于证书进行通信,那么我们需要自建一个私有CA.
下面我们来做一下如何自签一个证书;
运用Opnessl实现私有CA
配置文件:/etc/pki/tls/openssl.cnf
(1) 创建所需要的文件
[root@www1 tmp]# cd /etc/pki/CA/ [root@www1 CA] # touch index.txt [root@www1 CA] # echo 01 > serial (2) CA自签证书 [root@www1 CA]# (umask 077; openssl genrsa -out private/cakey.pem 2048) #生成私钥文件 [root@www1 CA]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 7300 -out cacert.pem #创建私有CA 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 ltd #公司名称 Organizational Unit Name (eg, section) []:ops #部门 Common Name (eg, your name or your server‘s hostname) []:www1.magedu.com #发证主机名 Email Address []:admin@magedu.com #联系人邮箱
-new: 生成新证书签署请求;
-x509: 专用于CA生成自签证书;
-key: 生成请求时用到的私钥文件;
-days n:证书的有效期限;
-out /PATH/TO/SOMECERTFILE: 证书的保存路径;
(3)发证
1 用到的证书的主机生成证书请求:
[root@centos6 .ssh]# cd /etc/httpd/ [root@centos6 httpd]# mkdir ssl [root@centos6 ssl]# (umask 077; openssl genrsa -out httpd.key 2048) [root@centos6 ssl]# openssl req -new -key httpd.key -days 365 -out httpd.csr #.src私有证书申请请求
2 把请求文件传输给CA;
[root@centos6 ssl]# ls httpd.csr httpd.key [root@centos6 ssl]# scp httpd.csr root@192.168.1.113:/tmp/
3 CA签署证书,并将证书发还给请求者;
[root@www1 CA]# openssl ca -in /tmp/httpd.csr -out /tmp/httpd.crt -days 365 [root@www1 CA]# cat index.txt V 160916184400Z 01 unknown /C=CN/ST=Beijing/O=magedu ltd/OU=ops/CN=www1.magedu.com/emailAddress=webadmin@magedu.com [root@www1 CA]# ls newcerts/
01.pem新生成的证书在此目录下 应该把新证书cp到到 certs/#此目录可做证书存储库
[root@www1 CA]# cp newcerts/01.pem certs/ [root@www1 CA]# cp /tmp/httpd.crt certs/ [root@www1 CA]# scp /tmp/httpd.crt root@192.168.1.112:/etc/httpd/ssl/
#把证书传给需认证的主机
[root@centos6 ssl]# ls
httpd.crt httpd.csr httpd.key #httpd.crt是CA签好的证书
原文地址:http://yangbb.blog.51cto.com/10649397/1696318