
作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。
座右铭:低头赶路,敬事如仪
个人主页:网络豆的主页
目录
通过之前文章我们对于SSL协议进行了一定了解网络安全——传输层安全协议
本章将会继续讲解SSL握手协议与SSL记录协议。
SSL握手协议工作在SSL记录协议层之上,用于协商产生会话状态的加密参数。当SSL客户端和服务器首次开始通信时,它们就协议版本、加密算法的选择、是否互相认证进行协商,并使用公钥加密技术产生共享秘密。所有这些工作都是由握手协议完成的,大致可以分为以下两个阶段。

通信双方通过相互发送Hello消息进行初始化。
(1)客户端首先发出客户问候消息(ClientHelloMessage),服务器收到后,或者发出服务器问候消息,或者发出终止错误,并中断连接,客户端和服务器的问候消息将协商产生下列属性:协议版本、会话标识符、加密算法及压缩方法.此外还将产生和交换两个随机数。
(2)客户问候消息发送完后,如果Server端需要进行认证,会发送它的证书。另外,如果需要的话(例如,如果它们的服务器没有证书,或者其证书仅用来进行签名),将发出一个Server Key Exchange消息。如果Server端已经被认证,而且所选的加密算法支持的话,可以向客户端请求证书。在验证以后,服务器就发送服务器问候结束消息,以示达成了握手协议。
(3)如果服务器发出一个CertificateRequest消息客户端必须发出证书消息或者一个NoCertificate报警。此时,客户端密钥交换消息准备发送,消息的内容将依赖于客户端问候消息和服务器问候消息所协商选择的公钥算法。如果客户端已经发出了一个具备签名能力的证书,一个数字签名后的证书验证消息将被发送,以确认此证书的合法性。
(4)此时,客户端可以发送密钥更改消息,客户端将尚未协商确定的加密算法复制加入到当前加密算法。然后,客户端立即用新的算法、密钥和密钥素材发出结束消息。服务器将发出自己的改变加密规范消息作为回应,同时将尚未协商确定加密规范复制加人到当前加密规范,并用新的加密规范发出结束消息。
(5)此时,握手过程结束,客户端和服务器可以开始交换应用加密数据,应用数据加密一般是用第(2)步密钥协商时确定的对称加/解密密钥,如DES、3DES等。目前,商用加密强度为128位,非对称密钥一般为RAS,商用强度为1024位,用于证书的验证。完整的SSL握手协议消息交换过程如图4-5所示。


图中,带*号的步骤是可选的,或依据状态而发的消息,而密钥更改(Change CipherSpec)用于客户端与服务器协商新的加密数据包时而改变原先的加密算法。
如果双方是在已有连接上重建一个会话,则不需要协商密钥以及有关会话参数,可以简化握手协商过程,内容如下。
(1)客户方使用一个已有的会话标识符(Session ID)发出Client Hello消息。
(2)服务方在会话队列中查找相匹配的会话标示识符(SessionID),如果有相匹配的会话,服务器方在该会话状态下重新建立连接,并使用相同的会话标示识符(SessionID),向客户方发出一个ServerHello消息。如果没有相匹配的会话,则服务方产生一个新的会话标识符(SessionID),并且客户方和服务方之间必须进行一次完整的握手协商过程。
(3)在会话标识符(SessionID)匹配的情况下,客户方和服务方必须分别发送Change Cipher Spec消息,然后发送Finished 消息。
(4)此时,重建一个会话结束。客户方和服务方进入数据交换阶段。简化的SSL握手协议消息交换过程如图4-6所示。

SSL.握手协议由一系列握手消息的交互组成。SSl.握手协议定义了若干握手消息,用于在通信双方之间建立会话和协商安全属性。握手消息将提交给SSL.记录层,由记录层封装一个或多个SSL_Plaintext结构。

SSL是层次化协议。在每一层,消息均可以包含描述长度、消息及消息内容的域。SSL在传输消息时,首先将消息分为可处理的数据块,可以进行压缩,将其封装为一带消息验证(MAC)的包,随后进行加密,并进行传输。收到消息时,首先解密,然后验证、解压缩并重新组合得到原有的消息,将此消息发向高层协议。SSL.记录层从更高层接收未加解释的任意长度的非空块数据块。

记录层将数据块分裂为小于或等于214字节的SSL.PlainText记录。客户端消息的分界限并不反映至记录层中,也就是说,具有同样内容类型(ContentType)的多个客户端消息可能会合并为一个SSLPlaintext记录。
创作不易,求关注,点赞,收藏,谢谢~
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("
默认情况下:回形针gem将所有附件存储在公共(public)目录中。出于安全原因,我不想将附件存储在公共(public)目录中,所以我将它们保存在应用程序根目录的uploads目录中:classPost我没有指定url选项,因为我不希望每个图像附件都有一个url。如果指定了url:那么拥有该url的任何人都可以访问该图像。这是不安全的。在user#show页面中:我想实际显示图像。如果我使用所有回形针默认设置,那么我可以这样做,因为图像将在公共(public)目录中并且图像将具有一个url:Someimage:看来,如果我将图像附件保存在公共(public)目录之外并且不指定url(同
是否可以在不实际下载文件的情况下检查文件是否存在?我有这么大的(~40mb)文件,例如:http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm这与ruby不严格相关,但如果发件人可以设置内容长度就好了。RestClient.get"http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm",headers:{"Content-Length"=>100} 最佳答案
我在这方面尝试了很多URL,在我遇到这个特定的之前,它们似乎都很好:require'rubygems'require'nokogiri'require'open-uri'doc=Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html"))putsdoc这是结果:/Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:353:in`open_http':404NotFound(OpenURI::HT
我在一个ruby文件中有一个函数可以像这样写入一个文件File.open("myfile",'a'){|f|f.puts("#{sometext}")}这个函数在不同的线程中被调用,使得像上面这样的文件写入不是线程安全的。有谁知道如何以最简单的方式使这个文件写入线程安全?更多信息:如果重要的话,我正在使用rspec框架。 最佳答案 您可以通过File#flock给锁File.open("myfile",'a'){|f|f.flock(File::LOCK_EX)f.puts("#{sometext}")}