TLS如何实现各种功能?数据如何加密在网络上传输?

网景(Netscape)公司在应用层和传输层加入了半层,把这个半层称之为SSL,SSL不是软件,可以理解是一个库,当http交给tcp层之前先通过ssl进行封装,所以http就成为https,ftp变为ftps等。SSL有三个版本V1、V2、V3,目前只有V2、V3在用。

由于SSL是私有的,所以国际化组织开发出TLS(安全传输协议)用于在两个通信之间提供保密性和数据完整性。TLSv1=SSLv3

SSL协议结构

SSL协议本身可以分为两层:底层为SSL记录协议(SSL record protocol);上层为SSL握手协议(SSL handshake protocol)、SSL密码变化协议(SSL change cipher spec protocol)和SSL警告协议(SSL alert protocol)。

SSL握手协议:是SSL协议非常重要的组成部分,用来协商通信过程中使用的加密套件(对称加密算法、密钥交换算法和MAC算法等)、在服务器和客户端之间安全地交换密钥,实现服务器和客户端的身份验证。客户端和服务器通过握手协议建立一个会话。会话包含一组参数,主要有会话ID、对方的证书、加密套件(包括密钥交换算法、数据加密算法和MAC算法)及主密钥。

SSL密码变化协议:客户端和服务器端通过密码变化协议通知对端,随后的报文都将使用新协商的加密套件和密钥进行保护和传输。

SSL警告协议:用来允许一方向另一方报告告警信息。消息中包含告警的严重级别和描述。

SSL记录协议:主要负责对上层的数据进行分块、计算并添加MAC、加密,最后把记录块传输给对方。

消息传输过程中使用基于密钥的MAC(Message Authentication Code,消息验证码)来检验消息的完整性。MAC是将密钥和任意长度的数据转换为固定长度数据的一种算法。利用MAC算法验证消息完整性的过程如图所示。发送者在密钥的参与下,利用MAC算法计算出消息的MAC值,并将其加在消息之后发送给接收者。接收者利用同样的密钥和MAC算法计算出消息的MAC值,并与接收到的MAC值比较。如果二者相同,则报文没有改变;否则,报文在传输过程中被修改,接收者将丢弃该报文。

SSL会话建立

两台主机之间SSL会话是如何建立的?以http为例,https使用443端口

在没有使用SSL的时候建立三次握手后即可通信,当使用SSL时,三次握手后,

①客户端请求,服务端收到请求后与客户端协商建立SSL(如:协议版本、加密算法等)

②服务器把证书发给客户端

③客户端获取证书之后要验证证书(颁发机构信任)

④客户端生成一个会话密钥(对称加密密钥)并发给服务器端

⑤服务端就可加密数据发送

SSL/TLS协议的运行原理浅析

SSL程序软件--openssl

加密解密算法实现工具(程序)有openssl和gpg

OPENSSL:SSL的开源实现,实现了大部分算法,该软件有三部分组成
libcrypto:通用加密库,其他软件链接到库文件即可实现功能
libssl:TLS/SSL的实现,实现了数据传输的三种特性的库
openssl:命令行工具,可实现私有证书颁发机构以及加解密等功能。

openssl配置文件:/etc/pki/tls/openssl.conf 主要在实现CA时使用

查看openssl的子命令:[root@host]#openssl  ?

openssl speed [算法名] #测试算法加密速度

openssl enc #先使用whatis查看,再使用man+whatis信息查找帮助

使用enc子命令进行加密

openssl enc –e -des3 -salt -a -in inittab -out inittab.deb3

-e/d:e是表示加密,d是表示解密
-des3:指定加密算法
-salt:为了和openssl0.9.5以后的版本兼,容默认设置。这是经过加密后放在密码最前面的一段字符串,用途也是为了让破解更难。
-a :当进行加解密时,他只对数据进行运算,有时需要进行base64转换,设置此选项后加密结果进行base64编码,解密前先进行base64编码。
-in :输入文件,缺省为标准输入
-out :输出文件,缺省为标准输出

使用 –d选项进行解密
openssl enc –d -des3 -d -salt -in inittab.des3 -out inittab

使用单向加密获得指纹

[root@host]#md5sum inittab 或者openssl dgst –md5 inittab

[root@host]#sha1sum inittab

如何给用户生成密码?openssl passwd -1 -salt 不使用salt选项会使用随机salt ,-1表示md5

openssl的rsa实现:rsa子命令是RSA key processing tool,而rsautil才是加解密工具 ,但是公钥一般不用于加密

生成随机数

rand子命令:openssl rand -base64 长度 ,生成指定长度的随机数

随机数的来源:收集磁盘IO的中断时间间隔或者敲击键盘的时间间隔作为随机数,生成的随机数会保存在一段内存空间(熵池),当使用随机数过量的时候,熵池没有随机数可用了可以通过大量磁盘IO让其重新生成

/dev/random 仅从熵池中取数据,没有数据之后会阻塞

/dev/urandom 熵池没有数据后软件生成随机数

使用openssl构建私有CA

步骤一:生成一对密钥,生成RSA,使用子命令genrsa,生成私钥,从私钥提取公钥

[root@host]#openssl genrsa #默认生成512位

[root@host]#openssl genrsa 2048 #指定生成多少位

[root@host]#openssl genrsa 2048 > server.key #保存结果

修改server.key权限为600,私钥十分重要应只允许属主访问

或者在子shell中直接生成指定权限的密钥文件,注意秘钥长度参数不能写在前

[root@host]#(umask 077;openssl genrsa -out server.key 2048)

[root@host]#openssl rsa -in server1024key -pubout #从私钥中提取公钥

-in 指定输入key位置文件,-pubout输出

步骤二:生成自签署证书;使用req子命令。

[root@host]#openssl req -new -x509 -key server1024.key -out server.crt -day 365

Country Name (2 letter code) [XX]:CN                       #国家名称

State or Province Name (full name) []:Huizhou        #省份名称

Locality Name (eg, city) [Default City]:zhongkai      #城市名称

Organization Name (eg, company) [Default Company Ltd]:pk           #公司名称

Organizational Unit Name (eg, section) []:IT             #组织单位

Common Name (eg, your name or your server's hostname) []:openhost        #主机名称

Email Address []:wjluo@pk.cn                      #邮件地址

-new :新的申请

-x509:生成自签证书,专用于CA

-key server1024.key:指定密钥(私钥)文件

-out server.crt:输出保存的位置和文件名

-day 365:指定证书有效期

文本格式输出证书信息:openssl x509 -text -in serverkey.crt

此时,生成了密钥和自签证书之后仍不能使用,要根据/etc/pki/tls/openssl.cnf配置文件的配置路径把证书放置在对应位置

【CA_default】

dir = /etc/pki/CA            # 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                        # 起始序列号,发出的证书编号

crlnumber = $dir/crlnumber      # 证书撤销列表编号

crl = $dir/crl.pem                        # 证书撤销列表的文件是什么

private_key = $dir/private/cakey.pem          # CA自己的私钥

RANDFILE = $dir/private/.rand                       # 随机数文件,会自动生成

default_days = 365                       # 证书有效期限

default_crl_days= 30                   # 证书吊销后保留多长时间

【req_distinguished_name】   #设置默认值,生成自签证书的时候不用交互输入。

创建配置文件中存在的相关目录文件,/etc/pki/CA

mkdir certs newcerts crl

touch index.txt

touch serial

echo 01>serial(给予起始号)

自此,CA可以正常接受其他客户端申请

每一种服务都需要自己的证书,要有证书就需要公钥,要获得公钥就需要私钥。

以httpd为例:

1、 新建/etc/httpd/ssl/目录,用于存放生成的文件

2、 生成httpd应用的私钥

注意这个私钥和CA无关,是需要签署的服务(另一台主机)生成的。

[root@host]#(umask 077;openssl genrsa -out httdd.key 1024)

3、 生成httpd的申请(填申请表)

[root@host]#openssl req -new -key httpd.key -out httpd.csr

填写完信息后最好会询问是否需要把请求加密存放,否就输入空密码

4、 把请求(申请表)发送给CA

[root@host]#openssl ca -in httpd.csr -out httpd.crt -day 365

5、 当前目录就会有新签好的证书

6、 可以发现serial文件序号自增1

吊销证书

(一)客户端
  1、获取证书serial
  # openssl x509 -in /path/to/certificate_file.crt -noout -serial -subject

(二) CA
  2、根据节点提交的serial和subject信息来验正与index.txt文件中的信息是否一致;

3、吊销证书
   # openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem

4、生成吊销证书的编号(如果是第一次吊销,生成此文件)
   # echo 00 > /etc/pki/CA/crlnumber

5、更新证书吊销列表
  # cd /etc/pki/CA/crl/
  # openssl ca -gencrl -out thisca.crl

如果需要,查看crl文件的内容:
  # openssl crl -in /path/to/crlfile.crl -noout -text

SSL及使用openssl实现CA的更多相关文章

  1. ssl协议,openssl,创建私有CA

    SSL是Security Socket Layer:安全的套接字层 他介于HTTP和TCP协议层之间 SSL是Netscape公司开发的,属于个人 TLS是标准委员会制定的 OpenSSL是SSL的开 ...

  2. 基于 OpenSSL 的 CA 建立及证书签发 【转】

    建立 CA 建立 CA 目录结构 按照 OpenSSL 的默认配置建立 CA ,需要在文件系统中建立相应的目录结构.相关的配置内容一般位于 /usr/ssl/openssl.cnf 内,详情可参见 c ...

  3. ssl简介与openssl的使用

    SSL证书:  是数字证书的一种,类似于驾驶证.护照和营业执照的电子副本.因为配置在服务器上,也称为SSL服务器证书. ssl也是传输协议. 基于ssl协议开发的一款软件叫openssl linux系 ...

  4. 基于 OpenSSL 的 CA 建立及证书签发

    http://rhythm-zju.blog.163.com/blog/static/310042008015115718637/ 建立 CA 建立 CA 目录结构 按照 OpenSSL 的默认配置建 ...

  5. 使用openssl模拟CA和CA证书的签发

    使用openssl模拟CA和CA证书的签发     当使用ssl/tls进行加密通信时,必须要有数字证书.若通信只限制在局域网内,可以不向第三方机构申请签发证书,可以通过openssl模拟CA(Cer ...

  6. 使用openssl搭建CA并颁发服务器证书

    本来整理了一份执行脚本,但是没有找到附件功能.只好直接贴当时自己看过的链接了. 文章标题:Openssl Certificate Authority 转载链接:https://jamielinux.c ...

  7. openssl生成CA签署 及 加密解密基础

    openssl  生成私有CA 及签署证书 openssl 配置文件: /etc/pki/tls/openssl.cnf 1. 在openssl CA 服务器端生成私钥 cd /etc/pki/CA/ ...

  8. 实战Tomcat配置SSL,使用openssl制作证书

    制作证书以及Tomcat配置 搭建openssl环境,下载openssl并设置环境变量方便命令行的使用: 修改openssl配置文件,设置dir目录,如设置dir=e:/temp/openssl_ca ...

  9. nginx反向代理cas-server之2:生成证书,centOS下使用openssl生成CA证书(根证书、server证书、client证书)

    前些天搭好了cas系统,这几天一致再搞nginx和cas的反向代理,一直不成功,但是走http还是测试通过的,最终确定是ssl认证证书这一块的问题,原本我在cas服务端里的tomcat已经配置了证书, ...

随机推荐

  1. docker 搭建 web 服务环境

    docker容器虽然早就听说过,但是本人还真的没去用过,刚好看到相关的文章,就分享了下,有机会可以实践下...... 做过开发的人对开发环境的安装.配置应该都不会太陌生,不管你做什么开发,对开发环境都 ...

  2. gentoo annie youku video

    在gentoo 上面,如果需要下载 youku 的视频的话,可以使用 annie 这个软件来下载.annie 软件主页:https://github.com/iawia002/annie#instal ...

  3. MongoDB(3)--Java 操作 MongoDB 的 API

    引入mongoDb 依赖 <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-j ...

  4. Python11

    os模块 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相当于shell下cd os ...

  5. redis 配置文件解释 以及集群部署

    redis是一款开源的.高性能的键-值存储(key-value store),和memcached类似,redis常被称作是一款key-value内存存储系统或者内存数据库,同时由于它支持丰富的数据结 ...

  6. BitmapData.threshold()方法

    import flash.display.Bitmap; import flash.display.BitmapData; import flash.geom.Rectangle; import fl ...

  7. sklearn中的SVM

    scikit-learn中SVM的算法库分为两类,一类是分类的算法库,包括SVC, NuSVC,和LinearSVC 3个类.另一类是回归算法库,包括SVR, NuSVR,和LinearSVR 3个类 ...

  8. Unable to connect to MKS;Too many scoket connect attempts;giving up

    Unable to connect to MKS;Too many scoket connect attempts;giving up(无法连接到MKS;太多scoket连接尝试;放弃) 第一次学习虚 ...

  9. HTML的基础样式之CSS

    一.初始CSS 1.1.介绍CSS 1.CSS定义如何显示HTML元素. 2.当浏览器读到一个样式表,他就会按照这个样式表来对文档进行格式化(渲染). 1.2.CSS语法 每个CSS样式由两个组成部分 ...

  10. SSM商城项目(十三)

    1.   学习计划 1.订单系统 2.提交订单 3.MyCAT 2.   订单系统 2.1. 功能分析 1.在购物车页面点击“去结算”按钮跳转到订单确认页面. a)         展示商品列表 b) ...