对称加密中加密和解密使用相同的密钥,加解密速度快,算法公开,计算量小。前端
使用对称加密,交易双方都使用一样钥匙,安全性得不到保证;每对用户每次使用对称加密算法时,都须要使用其余人不知道的唯一钥匙,这会使得发收信双方所拥有的钥匙数量呈几何级数增加,密钥管理成为用户的负担。对称加密算法在分布式网络系统上使用较为困难,主要是由于密钥管理困难,使用成本较高。nginx
常见的对称加密算法:算法
非对称加密,密钥成对出现,一公一私。公钥(public key)公开给全部人,而私钥本身保存,必须保证其私密性,如对私钥加密或设置权限。数据库
Bob将信息使用 Alice 的公钥加密后发送给Alice,Alice 使用私钥解密加密的文档。非对称加密一样也能够认证身份,Alice 用本身的私钥加密信息,若是 Bob 能用 Alice 的公钥解密,则身份认证成功。数组
非对称加密的三种用途:浏览器
常见的非对称加密算法:安全
中间人攻击Man-in-the-middle attack服务器
单向加密只能加密,不能解密,又称为提取数据指纹。单向加密的做用是保证数据的完整性,单向加密会定长输入,当原有数据被改变后,输出会彻底变化,又称为雪崩效应。网络
常见的单向加密算法:session
PKI 公钥基础设施是抵御中间人攻击的一种认证技术,方法是 PKI 的相互认证的机制。
只要能安全的传输公钥,就能避免中间人攻击。要保证公钥不被替换,就须要一个可信的认证机构对公钥进行公证。
PKI 的主要的四个组件:
CA是有公信力的认证中心。申请者将本身的公钥和我的(站点)信息发送给CA,请求其作认证。CA进行验证后,将申请人的信息和公钥使用Hash算法提取消息摘要,而后CA使用本身的私钥对消息摘要进行加密造成数字签名。CA将申请者的我的信息和申请者的公钥加上数字签名造成了数字证书,并发送给申请者。X.509定义了证书的结构以及认证协议标准,目前使用的是第三版。
发送方发送信息时同时也发送本身的数字证书,当接收方收到信息和数字证书时,接收方使用Hash算法对证书中的我的信息和公钥进行提取指纹,而后使用CA的公钥对数字签名进行解密,对比本身生成的消息摘要和解密出来的数字签名是否一致,若是一致,则发送方的公钥可用。
CA自己也有证书来证实本身的身份,而且CA是一种树形结构,高级别的CA会给低级别的CA作信用背书,操做系统和浏览器已经内置了顶层的CA证书。
CA 参与的安全通讯过程:
以上,对称加密和非对称加密解决了数据的保密性,单向加密解决了数据的完整性,使用 PKI 解决了数据的可用性或者是来源合法性。这样就创建了一个安全的通讯。
1994年,NetScape公司设计了SSL协议(Secure Sockets Layer)的1.0版,可是未发布,设计 SSL 的目的是是为了对http报文进行加密,随后又陆续发布了2.0和3.0。1999年,互联网标准化组织ISOC接替NetScape公司,发布了SSL的升级版TLS (Transport Layer Security)1.0版,目前 TLS 的版本是TLS 1.3。
SSL/TLS发生做用的位置在 ISO/OSI 参考模型中的表示层、TCP/IP 模型中的应用层。
SSL协议分为两部分:Handshake protocol和Record Protocol。
Handshake Protocol用来在通讯双方协商出一个安全的会话密钥以供后续对称加密中使用。Record Protocol则定义了传输的封装格式。
SSL/TLS协议通讯的大概过程:
首先,客户端发出请求(ClientHello),将本地支持的加密套件(Cipher Suit)的列表,也就是本地支持的加密算法、支持的TLS版本、支持的压缩方法发送到服务端。另外产生一个随机数发送到服务端,同时保存在本地一个副本,稍后用于生成会话密钥。
而后,服务端回应(ServerHello),将服务端的数字证书发送给客户端,并确认使用的加密通讯协议版本(也就是安全套件)、服务器生成的随机数、确认使用的加密算法。
其次,客户端收到服务端证书根据证书链验证真实性后,获得服务器的可信公钥,而后再发送一个新的随机数、编码改变通知(随后的信息都将用双方商定的加密方法和密钥发送)、客户端握手结束通知。
最后,服务端收到第三个随机数后,计算生成本次会话使用的会话密钥,而后发送编码改变通知和服务器握手结束通知。
随后的通讯使用的http协议,而后使用会话密钥加密。
TLS 安全密码套件
创建私有 CA
1.安装 openssl:yum install openssl -y
2.生成 CA 的密钥对:(umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
3.生成自签证书和相关文件:openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365
4.初始化 CA 工做环境: touch /etc/pki/CA/{index.txt,serial};echo 01/etc/pki/CA/serial
与 CA 配置的相关文件是/etc/pki/tls/openssl.cnf ,index.txt是数据库索引文件, serial 是用来记录签证相关信息的。
站点申请证书
1.安装 openssl
2.生成密钥,保存在服务配置文件目录下
mkdir /usr/nginx-1.14.2/conf/ssl ln -s /usr/nginx-1.14.2/conf/ssl/ /etc/nginx/ssl (umask 077;openssl genrsa -out /etc/nginx/ssl/nginx.key 2048)
3.生成证书签署请求:openssl req -new -key /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.csr
须要注意的是,填写的信息须要与 CA 端保持一致,Organization Name 也必须保持一致。
4.将签署请求文件 nginx.csr发送给 CA 服务
CA 签署请求文件
1.签署请求文件:openssl ca -in /tmp/nginx.csr -out /tmp/nginx.crt -days 365
2.将证书发送给请求客户端
3.其余:CA 吊销证书openssl ca -revoke nginx.crt
站点部署证书
将证书保存在/etc/nginx/ssl/目录下,因为以前编译安装的 nginx,默认没有将ssl_module编译,因此须要从新将带有 ssl 模块一同编译nginx。
回到 Nginx 源码目录下,加上 SSL 模块,再次编译:
./configure --prefix=/usr/nginx-1.14.2/ --with-http_ssl_module make
因为当前操做是升级操做,以前使用的 Nginx 配置文件等不能被覆盖,因此不能使用make install
,须要备份原nginx 二进制文件,将新的 nginx 二进制文件覆盖便可
cp /usr/nginx-1.14.2/sbin/nginx /usr/nginx-1.14.2/sbin/nginx.without_ssl.bak cp /tmp/nginx-1.14.2/objs/nginx /usr/nginx-1.14.2/sbin/nginx
objs/nginx是新编译的 nginx 程序,覆盖原 nginx 程序,启动 nginx。
修改nginx配置文件,开启 https
server { listen 443; #监听端口为443 server_name devops.yellowdog.com; ssl on; #开启 ssl ssl_certificate /etc/nginx/ssl/nginx.crt; #证书位置 ssl_certificate_key /etc/nginx/ssl/nginx.key; #私钥位置 ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; #指定密码为 openssl 支持的格式 ssl_ciphers HIGH:!aNull:!MD5; #密码加密方式 ssl_prefer_server_ciphers on; #依赖 SSLv3和 TLSv1协议的服务器密码将优先于客户端密码 location / { alias dlib/; #根目录相对位置 } }
另外还设置将80端口的访问重定向至443端口
server { listen 80; server_name devops.yellowdog.com; rewrite ^(.*)$ https://$server_name$1 permanent; }
部署 https 站点整体不难,但重点要理解安全通讯中的原理。
推荐文章:图解openssl实现私有CA