当前位置:文档之家› OpenSSL握手过程的测试与分析

OpenSSL握手过程的测试与分析

华中科技大学

硕士学位论文OpenSSL握手过程的测试与分析

姓名:何福均

申请学位级别:硕士

专业:软件工程

指导教师:覃中平

20080603

摘要

网络正改变着人们的生活。如何保护数据在网络上的安全,引起越来越多人的关注。SSL及其后继者TLS是Internet安全协议中重要的部分,而OpenSSL则是一个优秀、功能强大而且开源的SSL与TLS实现,它们均得到广泛的应用和关注。国内外已有很多文章和书籍讨论这方面的内容。但大多关注的是SSL/TLS或者OpenSSL的应用,极少有对SSL/TLS协议细节或者OpenSSL相关部分进行深入分析。目前所知的SSL/TLS实现均来自国外。OpenSSL作为一个开源软件包,为应用和实现SSL提供了不可多得的资源。然而,目前尚不清楚OpenSSL与SSL协议是如何对应的,是否真正可信,仅作为“黑盒”在使用。

握手协议是SSL协议中最重要最复杂的部分,也是最值得研究的部分。分析一个典型的握手将有重要意义。采用“先获取后分析”的方法来分析SSL协议和OpenSSL 代码中的握手部分是一个新的尝试。先从代码中获取真实的数据,然后结合协议和代码,对所得数据进行分析。目的是为了打开OpenSSL这个“黑盒”,更好地认识OpenSSL和SSL协议。

握手过程的分析涉及两方面的内容。一是握手过程中各种消息的结构、含义和作用;二是此过程中涉及到的关键计算。SSL v3.0和TLS v1.0在消息结构和计算上存在差别。对OpenSSL源代码的学习,可以对协议中一些没有明确指定的行为或者是模糊的参数定义等作出补充性的说明。OpenSSL展示了一个“具体”的SSL协议。

对典型握手过程的研究,将为研究其他形式的握手或者是SSL协议以及OpenSSL的其他方面打下坚实的基础。

关键词:信息安全SSL TLS 握手协议 OpenSSL

Abstract

Network is changing people’s life and more and more people have paid attention to how to protect the data transported on the network. SSL and its successor TLS are main part of Internet security protocols. OpenSSL is an excellent, powerful and open source implementation of SSL and TLS. Both of SSL/TLS and OpenSSL have been widely deployed and followed with interest. There have been many domestic and overseas papers and books to discuss them. But most of these papers and books concern the applications of SSL/TLS or OpenSSL rather than the deep analysis of the protocol details or the relative part of code in OpenSSL. The implementations of SSL/TLS known by now all come from foreign countries. As an open source software package, OpenSSL provides a valuable source which can be used to employ and implement SSL. But so far, we have not known the relationship between OpenSSL and SSL and whether OpenSSL is authentic. It is only treated as a black box.

The handshake protocol is the most important and complex part of SSL protocol and it is worthy of being learnt. It makes sense to analyse a classical handshake process. It is a new try to employ a method called ‘capture and analyse’ to analyse SSL protocol and relative code in OpenSSL, which means first we get real data from inside of the source code and then analyse the data combining the protocol and source code together. The purpose is to unpack the OpenSSL black box and to know it and SSL protocol better.

The analysis of handshake process will concern two aspects, including the structure, meaning and function of each handshake message as well as the critical calculations. There are differences between SSL v3.0 and TLS v1.0. The study of OpenSSL source code can help us to clarify some actions and ambiguous arguments in the protocol specifications. OpenSSL shows a concrete SSL protocol.

The analysis of classical handshake process will come into being a base for the study of any other form of handshake or any other aspects of SSL protocol and OpenSSL.

Key words: Information security SSL TLS Handshake protocol OpenSSL

独创性声明

本人声明所呈交的学位论文是我个人在导师指导下进行的研究工作及取得的研究成果。尽我所知,除文中已经标明引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写过的研究成果。对本文的研究做出贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律结果由本人承担。

学位论文作者签名:

日期:年月日

学位论文版权使用授权书

本学位论文作者完全了解学校有关保留、使用学位论文的规定,即:学校有权保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权华中科技大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。 

保密□,在年解密后适用本授权书。

本论文属于

不保密□。

(请在以上方框内打“√”)

学位论文作者签名:指导教师签名:

日期:年月日日期:年月日

1 绪论

1.1 研究背景

自从互联网诞生以后,在短短的几十年里,尤其上个世纪90年代中期以来,互联网在世界各国蓬勃兴起[1],包括在我国[2],迅速发展,网民人数快速增加。网络的发展与普及,给人们的生活带来极大的方便,也在改变着人们的生活方式。它不但使人与人之间的距离变小,而且网络上大量的信息无疑是一笔巨大的财富。

到处可以看到,网络确实给人们的生活和工作带来极大的便利。学校里的各种办公系统、公共机构的各种查询系统、银行的网上银行服务、各种电子商务和电子政务系统等等,都为人们节省了很多宝贵的时间,免去很多排队的烦恼。足不出户,只需轻松的操作,就可以完成以前大量复杂而繁琐的工作。

近年来,随着网络通信和电子商务等服务和资源进入人们的日常生活,大量的私人信息和秘密信息在网络上传输。例如,各种各样的密码和帐户名,信用卡帐号等等。人们在享受网络带来的各种便利的同时,面临各种各样的安全隐患[3-5],也越来越关心自己的信息在网络上的安全。

信息安全与密码学都有着悠久的历史。前人早已采用各种方法来保证通信的安全,例如采用漆封等。而随着网络的出现,如何去保障网络上信息的安全,给人们带来了新的挑战。各种公钥密码算法的提出和实现[6, 7],给密码学注入了新的内容,也为网络上的信息安全带来了重要的理论支持。

SSL(Security Sockets Layer)和TLS(Transport Layer Security)[8-10],都是建立在公钥密码的基础之上的。实际上,它们组合使用了对称密码、非对称密码、消息摘要和数字签名。这两种协议存在极大的相似。通常,会把SSL和TLS合起来简称为SSL。

SSL协议是在20世纪90年代提出并被应用的协议。它们的目标都是保证数据在网络上传输的安全。这包括两重含义,一是需要对传输的数据提供保密;二是需要能够提供身份验证功能,保证对方确实是值得信任的。SSL v1.0在1994年由

Netscape公司提出,但没有被广泛部署。SSL v2.0在同年11月同样由Netscape公司提出。这是一个被广泛部署的协议。SSL v3.0发布于1995年,它与SSL v2.0大不相同,只保留了一些基本的协议特色,大大扩展了能够协商的算法。TLS v1.0在1999年发布,一般被认为是SSL v3.0的后继者,因为它们确实非常相似。TLS现在最新的版本是2006年发布的1.1版本。这里所说的SSL指的是SSL v3.0与TLS v1.0。这两个协议当前都得到广泛的应用,而SSL v2.0则已经不被推荐。

SSL协议已经成为Internet安全协议中最重要的部分,它们为电子商务、Web服务以及其他的网络应用提供安全保障。

OpenSSL是一个功能非常强大的SSL实现。它实现了各种密码算法、密钥管理和证书管理功能,同时它支持SSL v2.0、SSL v3.0和TLS v1.0。OpenSSL被广泛地应用。它是开源的软件包,这为有兴趣学习各种密码算法实现和SSL实现的读者提供了非常宝贵的资源。OpenSSL里还提供很多有用的工具,使用它们可以很轻松地完成一些任务,例如签发证书、查看证书等等。它为密码技术和SSL的推广发挥了重要作用。

OpenSSL是采用C语言编写的,这使它具有良好的平台移植性,也大大扩展了OpenSSL的应用范围。使用者既可以在Linux上也可以在各种Windows上编译和使用它。而OpenSSL尽管使用C语言开发,但里面的很多技巧值得所有开发者学习。例如,OpenSSL里面大量采用了类似面向对象方法论里面的“接口”。

OpenSSL最初的作者是Eric A. Young和Tim J. Hudson。他们于1995年开始编写这个具有巨大影响的软件包。1998年,OpenSSL项目组接管了OpenSSL的开发工作,并推出了0.9.1版。OpenSSL的版本在不断的更新,关于它的最新动态,可到https://www.doczj.com/doc/5919214192.html,进行查阅。

鉴于SSL的重要和OpenSSL的强大,目前国内外已经有很多人对SSL和OpenSSL展开了学习和讨论。

1.2 研究的目的与意义

上文已经提到,SSL协议是被广泛应用的Internet安全协议。在我国,SSL也已

经被大量使用。我们平时在Internet上所大量使用的保证通信安全的HTTPS协议[11]就是得益于它们的支持。

但是当前所知道的各种开源和非开源的SSL实现均来自国外。我们的关键信息就是在这样的情况被传送的——在别人所承诺的保护下传送,而这种保护到底是否真正可靠却不得而知。这使我们陷入了受制于人的状况。OpenSSL是开源的代码,为我们应用SSL提供了不可多得的资源。它被应用到很多方面,而且实际上有很多在它上面进行的二次开发。但在使用一个安全软件的时候,必须确认它是否真正的安全和可信。拥有了源代码,不等于“认识”了源代码。这之间存在巨大的差距。

这些都凸显了对SSL协议和实现进行学习和研究的必要性和迫切性。对OpenSSL的学习和研究主要有下面几方面的意义。

第一,填补OpenSSL与SSL协议说明之间的空白。OpenSSL是SSL的实现,但目前还没有看见详细讨论它与SSL协议说明的关系的文献资料。实现与说明是有距离的。它源于协议说明,又高于协议说明。实现更具体,而且带着实现者的策略。这里需要确定的是,OpenSSL是否严格遵守SSL协议,或者在实现过程中是否加入了一些不利于使用者的人为限制。例如,在历史上,美国曾一度对出口的加密算法的密钥强度进行过限制。虽然在2000年已经取消了这一限制,但无法知道的是在实际的实现中,是否还保留着这些限制。这些都不能从协议说明文档中得到答案,真正有效的办法就是分析源代码。只有将OpenSSL这个黑盒子打开,通过分析,才能确定能否给它盖上“合格”的印章。只有确定它的确与SSL协议相吻合,而且没有陷阱之后,才可以放心地使用。

第二,加深对SSL协议的理解。要实现一个协议,对其各种规定必须清楚。这是前提。学习一个协议,单是阅读其说明,静态的学习并不足够。协议里面存在着模糊的部分。而一个协议的具体实现,则为了解协议规定的行为提供了途径,并且能够给协议中模糊的部分提供一个清楚的解释。

第三,为实现协议提供了一个可行的参考。一个被广泛使用的SSL实现,有很多值得学习的地方。无论是对协议的时序控制还是具体的编程技巧,抑或是里面大量的密码算法的实现,都是很值得去学习的。

本文就是通过尝试结合OpenSSL和SSL,相互验证,从而能对协议和OpenSSL 有一个比较全面的认识,为以后进一步的工作打下一个基础。这是本文的目的。

1.3 研究的国内外发展状况

上文曾提到,国内外都有人在关注SSL协议和OpenSSL,也有很多相关的文献。可对这些文献作一个大体的分类。

关于SSL协议的主要有以下几个方面:(1)对SSL协议的介绍[12-14](2)对SSL 协议安全性的讨论[15, 16](3)对SSL各种应用的研究,例如在VPN中的应用[17-19],在电子商务中的应用[20, 21],无线通信[22],保证数控制数据的安全[23],嵌入式应用等等[24](4)对SSL性能的讨论[25, 26](5)对SSL的改善和增强[27-29]。

而关于OpenSSL的则主要有以下几个方面:(1)介绍OpenSSL提供的函数和命令 [30, 31](2)讨论OpenSSL中有关密码算法实现的安全性[32, 33](3)使用OpenSSL 来搭建实验和应用平台[34-36]。

国内外也有综合讨论SSL和OpenSSL的优秀书籍[37-39]。除此之外,也有研究与SSL有关的公钥基础设施(PKI,Public Key Infrastructure)的[40, 41]。

目前对于SSL和TLS协议本身的细节进行深入学习和研究的并不多,而结合实现来进一步讨论的则是尚未得见。而对于OpenSSL,更多的是从工程应用角度或者是从密码算法的实现角度来看待,并没有从SSL协议实现的角度来分析其中的相关代码。而这些代码正是需要了解的,从而可以知道OpenSSL如何实现协议。

1.4 本文主要研究工作

握手协议是SSL协议中最重要的组成部分,也是最复杂、涉及内容最多的部分。握手过程中的消息类型丰富。它是学习和研究SSL协议及其实现不可回避的部分,也是一个起点。本文将分析OpenSSL中的握手过程。本文将从OpenSSL中得到SSL 通信的实例,然后通过实现、实例以及SSL协议说明来对握手过程进行综合的分析。本文将采用“先获取后分析”的方法来完成整个分析工作。具体的工作和目标如下:

(1) 获取相关信息。就是从OpenSSL中获取足以支持分析SSL握手过程的各种

信息。这里将要解决的问题有需要获取何种信息、采用何种方法来获取和储存信息以及从OpenSSL源代码中的何处获取信息等等。当然,在此之前,将需要选择适当的开发平台并按照要求配置和构建运行环境,成功编译、运行和跟踪OpenSSL,这是重要的前提工作。

(2) 测试和分析所得到的信息。就是根据所获得的信息测试和分析典型的SSL 握手形式。首先将对SSL记录层协议进行分析,SSL记录是分析的基本单位。然后,将分析一个完整的握手过程,对握手过程中所涉及的各种消息的结构、含义和作用进行讨论,并结合捕获的通信实例,说明消息的组成。在此基础上,进一步就握手过程中涉及到的关键计算进行验证和分析。针对SSL v3.0和TLS v1.0在消息结构上和计算上存在差别的情况,在适当地方将对其进行分别的说明。并将结合OpenSSL 的源代码,对协议中一些没有明确指定的行为或者是模糊的参数等作出补充说明,并指出OpenSSL中的相关代码部分,力求全面而准确。

(3) 得到相关的结论和建议。通过上述两项工作,将得到一些有用的OpenSSL 与SSL协议关系的结论。这些结论将使我们能够更好地使用OpenSSL和更好地理解SSL协议,为以后的工作打下一个基础。同时,也将根据这些结论,给出在使用OpenSSL时的一些建议。

2 SSL协议中握手过程的说明

2.1 SSL记录层协议的说明

SSL实际上是一个分层的协议。SSL记录是SSL协议发送和接收的基本单位。在记录层协议之上,有四种协议:改变加密说明(change_cipher_spec)、警示(alert)、握手(handshake)、应用数据(application_data)。改变加密说明协议和握手协议将在下文详细讨论。应用数据协议是SSL为其上层协议服务所携带的应用数据,例如HTTP“请求”就是通过应用数据协议传送的。警示协议主要用于报告各种错误,另外一个重要的用途是指示连接将要关闭。

图2-1 协议栈中SSL协议的位置及其层次

SSL有一个假定,就是假定其下层的数据包发送机制是可靠的。写入网络的数据将依顺序发送给另一端的程序,不会出现丢失数据包或者重复发送的情况。这种要求是必须的。从下文可以看到,SSL的握手消息是有时序的。在实际中,也有在UDP上运行的SSL变种,但SSL几乎只是在TCP上运行,它不能在UDP或者直接在IP上运行。其实这一点也令它的应用很广泛,因为很多应用层协议是基于TCP的,例如HTTP,FTP等等。SSL的这种特点也使其很自然地嵌入到应用层与TCP层之间。图2-1说明了这种关系。

在进一步对握手协议进行说明之前,先对SSL记录层协议进行说明。下文的分析都是以SSL记录作为基本单位的。记录层协议实际上是一个简单的封装或者说是“打包”协议。记录可能是明文传送的,也可能是被加密传送的,具体需要看通信实体所处的阶段。图2-2是明文传送情况的SSL记录的结构示意图。

图2-2 明文传送情况下的SSL 记录 其中的类型、版本和长度合起来称为“记录头信息”,共长5个字节。各字段的大小和具体含义如下。

类型:1个字节,表示此记录携带的是何种数据。可能的取值有四种,change_cipher_spec=20,alert=21,handshake=22,application_data=23。

版本:2个字节,表示此记录是什么协议版本的记录。分主版本和从版本,各占1个字节。对于SSL v3.0,主版本为

3,从版本为0,那么值为0x0300;对于TLS v1.0,主版本为3,从版本为1,那么值为0x0301。

长度:2个字节,表示所携带数据的长度,并不包含记录头信息的5个字节。也就是说,整个记录的长度=长度+5。

从图2-3可以看出,经过加密后的SSL 记录要比明文传送的记录多了一些内容。阴影的部分是经过加密的,而且是作为一个整体加密。然而记录头信息始终是明文传送。

HMAC :消息验证码,以确保消息的完整性。具体的长度需要根据协商的摘要算法而定。对于MD5是16字节,而SHA1则是20字节。至于如何计算HMAC ,SSL v3.0与TLS v1.0所采用的具体方法并不相同。在下文将会看到这些差别。

填充,填充长度:只有在双方采用分组加密的情况下才会出现的字段。如果是采用序列加密,并不存在。“填充长度”是指“填充”字段的字节数,占1个字节。如果用Length(A)表示字段A 的字节数,那么填充的目的就是使Length(数据)+ Length(HMAC)+ Length(填充)+ Length(填充长度)等于所使用分组加密算法的块大小的整数倍。至于“填充”字段的内容和长度,SSL v3.0和TLS v1.0有着不同的规定。 图2-3 加密传送情况下的SSL 记录

SSL v3.0的说明中规定,“填充长度”的值一定要小于所使用分组加密算法的块大小或者等于0,即填充最少的字节。而对“填充”字段的内容并没有作任何限制,是随意的。TLS v1.0的说明中则指出,“填充长度”的取值范围可以是从0到255(不含255)。而且“填充”字段中的每个字节的内容均为“填充长度”的值。

记录层协议的“数据”可以被压缩,只要双方都协商使用某一压缩算法。但SSL 协议里只明确指出如何表示不使用压缩方法。至于如果要使用压缩算法,如何对其编码,则没有任何说明,这依赖于实现。

2.2 SSL握手协议的说明

2.2.1 握手协议简述

握手过程有多种形式。将要详细讨论的握手过程所涉及的消息如图2-4所示。这是一个非常常见而且典型的基于RSA的握手过程。通信双方通过这一系列信息的交换,从而使客户端可以对服务器的身份进行验证,确定服务器可信任,并且双方可以协商和计算接下来如何保护通信的方法和参数。这是握手过程的目的。下文将会对每条消息进行详细的说明。

Client Server ClientHello --------> 

ServerHello 

Certificate 

<-------- ServerHelloDone 

ClientKeyExchange 

[ChangeCipherSpec] 

Finished --------> 

[ChangeCipherSpec] <-------- Finished 

…… …… 

图2-4 基于RSA的典型SSL握手过程

握手过程占据了整个SSL协议的绝大部分,内容相当丰富,而且需要证书及大量其他技术诸如密码学等的支持。握手过程的实现同样也占据了OpenSSL实现中的

绝大部分,函数繁多。这足可见其重要。

对于SSL v3.0和TLS v1.0,握手协议所规定的消息格式基本上是相同的。不同之处来自两个方面:一个是说明上明确定义的消息结构的不同;一个则是消息结构定义相同,但由于某些历史原因所造成的实现上的不同。它们的差别也体现在一些计算的定义上。下文在适当的地方将会指出这些差别。

对于SSL记录层协议而言,整个握手消息就是记录中的“数据”部分。握手消息也有自己的格式。与SSL记录格式类似,握手消息也由头信息和内容两部分组成。头信息包含两个字段:握手消息类型,1个字节,用以指出内容是何种握手消息;长度,3个字节,用以指出内容的长度为多少字节。

2.2.2 ClientHello消息

ClientHello是握手过程发送的第一条有效信息,并且总是从客户端发出。握手过程中,客户端必须先“说话”。该消息有两个目的:一个是传送一些连接的参数,为以后所用;一个是携带客户端给出的一些参数的选择列表,便于服务器从中选择。该消息的结构如图2-5所示:

版本随机数会话ID加密套件列表压缩方法列表

主从时间随机字节长度ID 长度套件列表长度方法列表

图2-5 ClientHello消息结构

版本(client_version):与SSL记录层协议中“版本”字段的定义一样,2个字节,第一个表示主版本,第二个表示从版本。此版本的值是客户端准备接受的“最高”的SSL版本号。对于SSL v3.0,版本为0x3000;而对于TLS v1.0,版本为0x0301。值得注意的是,“版本”是客户端向服务器表明它希望使用的版本,但并没有办法告诉服务器它不使用什么版本。版本是一个非常重要的字段,它背后直接指出了消息是何种格式,参数如何计算等等,反映在实现上,就是一组不同的握手函数的集合。

随机数(random):或者称为客户端随机数,32个字节。按照SSL说明,随机数由两部分组成:时间和随机字节。“时间”字段长4个字节,为消息产生时客户端的时间(自格林威治1970年1月1日午夜12点以来的秒数);“随机字节”为28字

节的随机数。尽管存在“时间”字段,但并不要求客户端时钟需要任何特殊的设置,也并不要求客户端和服务器时钟需要同步。整个随机数处理时并不要求作任何的检查。实际上,甚至头四个字节与时间并无关系,握手照样可以无差错地进行。协议说明中明确指出,高层协议可对此作一些额外要求。

会话ID(session_id):这是目前为止第一个变长的字段。对于所有变长字段,在发送字段本身的内容前,必须先附加其长度。至于用多少个字节表示长度,原则是够用即可,根据各字段的最大长度不同而不同。例如,如果有一个变长字段的最大长度为216-1个字节,那么,用两个字节表示其长度就够了。SSL说明中对消息的定义并没有显式地标记出变长字段的“长度”,而是通过定义其为一变长字段,并给出最长长度来表示。在此特别标记出长度,是为了强调其存在和位置,也便于后面的分析。会话ID是一个从0字节到32字节的变长数组。所以“长度”只需1个字节。一个会话至少包括:会话ID,对方的证书,所协商好的加密套件,生成的MasterSecret,以及是否可重用的标识。当客户端想重复使用之前某次连接时的加密密钥资料时,它就提供这么一个会话ID。恢复一个会话在一些应用很重要,因为每次产生新的加密资料开销昂贵。如果想开始一个全新的握手过程,那么就只需提供长度为0的会话ID,即将“长度”字段设置为0,此时并不存在“ID”。

加密套件列表(cipher_suites):长度从2到216-1个字节的变长字段。“长度”占两个字节。一个加密套件用两个字节表示,如0x000A。加密套件定义了密钥交换算法、密钥交换中所使用的签名算法、加密算法和消息摘要算法,并标记了该套件是否是“可出口”的。由于历史上美国政府曾经对出口的加密算法的密钥长度有限制,对于被标记为“可出口”的加密套件,在握手过程中需要一些特别的步骤。客户端在列表中给出了其支持的加密套件的编码。至于客户端选择支持哪些加密套件,并且如何排列这些套件的顺序,协议说明没有作出任何规定,完全依赖于实现。

压缩方法列表(compression_methods):长度从2到28-1个字节的变长字段。“长度”占1个字节。每个压缩算法用一个字节表示。

2.2.3 ServerHello消息

ServerHello是服务器对ClientHello的应答消息,结构如图2-6所示,主要携带

服务器在客户端提供的列表中进行选择的结果以及交换服务器随机数。

版本随机数会话ID 主从时间随机字节长度ID 所选加密

套件

所选压缩

方法

图2-6 ServerHello消息结构

版本(server_version):格式与ClientHello中的“版本”格式和取值一样,表示服务器使用的协议版本。

随机数(random):或者称为服务器随机数,以区别于客户端随机数。其格式与ClientHello中的“随机数”相同。服务器也提供随机数的目的是,即使客户端出现在两次握手中使用同一个随机数的情况,由于服务器随机数也参与计算,从而可以极大可能保证最终导出的密钥是不同的。有关的计算请见下文。

会话ID(session_id):其格式与ClientHello中的“会话ID”相同。如果客户端在ClientHello中请求恢复某一会话,服务器在其会话缓冲中进行查找,若找到而且会话是可恢复的,那么“会话ID”应来自所恢复的会话,并且与ClientHello中的“会话ID”应一致。会话的恢复是另一种握手方式,而且可以认为是“最精简”的握手,在一些情况下会使用。这里不讨论。通常情况下,服务器会建立一个新的会话,并提供一个客户端可以用来恢复此会话的ID。当然,如果服务器不准备恢复此会话,那么可以提供长度为0的ID。SSL说明中并没有指出如何来构造会话ID,完全依赖于具体的实现。

所选加密套件(cipher_suite):2个字节。服务器从接收到的ClientHello的“加密套件列表”中,选择一个其支持的加密套件,并通过此字段告诉客户端。SSL说明文档中并没有指出服务器应该如何去选择加密套件。服务器有足够的自由。服务器既可以按照列表的中的先后顺序进行选择,也可以根据自己的规则来作出选择。客户端无法预知服务器的这个行为。如果是恢复的会话,此值应来自所恢复的会话。

所选压缩方法(compression_method):1个字节。服务器从接收到的ClientHello 的“压缩方法列表”中,选择一个其支持的压缩方法。如果是恢复的会话,此值应来自所恢复的会话。

2.2.4 Certificate消息

证书作为PKI(Public Key Infrastructure,公钥基础设施)的重要组成部分,在SSL协议中也扮演了重要的角色。在通常的情况下,服务器都给客户端发送其证书,以便客户端可以确认服务器的身份。而证书中所携带的关于服务器的公钥信息,是后面对有关消息内容进行加密或者进行验证的依据。

证书文件有多种格式。SSL协议中使用的是X.509 V3格式的证书文件。证书的结构、颁发以及验证等内容是一个专门而涉及广泛的话题,在此并不过多的进行讨论。通信双方都会有一系列可信任的根证书。所谓根证书,是指CA(Certificate Authority)自己给自己签发的自签名的证书。CA是分级的,具有层次结构。例如,CA给CA1签发证书Cert1,而CA1给CA2签发证书Cert2,CA2给用户Customer1签发证书CertCus,以证明Customer1的身份及其相关信息。当另外一个用户Customer2需要验证Customer1身份的时候,一般来说,Customer2需要CertCus、Cert2、Cert1以及CA的根证书,通过逐级验证,才能确定Customer1的身份。而CertCus-Cert2-Cert1-CA的根证书,就组成了一条证书链。Customer1并不需要发送整个证书链,特别是CA的根证书,只要Customer2拥有的可信任的证书能成功构造这条证书链就可以了。

Certificate消息正是服务器向客户端发送必要的证书,使客户端能对其身份进行验证的消息。该消息的结构很简单,如图2-7所示。

消息长度第一份证

书长度

第一份证

书内容

第二份证

书长度

第二份证

书内容

……

第n份证

书长度

第n份证

书内容

图2-7 Certificate消息结构

消息长度:3个字节,整个消息的剩下的长度。

第n份证书长度:3个字节,表示第n份证书的内容有多少个字节。

第n份证书内容:证书内容。

证书的顺序是,第一份是服务器自己的证书,如上文中的CertCus;第二份是给其颁发证书的CA的证书,如上文中的Cert2,如此类推。

2.2.5 ServerHelloDone消息

这是一条特别的有着重要作用的空消息。在一些特别的握手过程中,在证书之后可能还有其他的消息。ServerHelloDone表示服务器已发送完此阶段的全部信息。

在SSL说明中对ServerHelloDone是这样定义的:

struct { } ServerHelloDone;

到此,客户端和服务器已经协商了加密套件,交换了各自的随机数,并且客户端能够对服务器的身份进行验证。

2.2.6 ClientKeyExchange消息

这是一条非常重要的消息。而且其具体的格式与通过ClientHello与ServerHello 所协商的加密套件密切相关。本文重点关心的是基于RSA作为密钥交换的握手,这是普遍使用的情况。在普通的RSA握手情况下,通信双方所传送的消息较其他密钥交换算法要少,比如DH或者Fortezza。此时ClientKeyExchange结构如图2-8所示。

PreMasterSecret

长度

版本随机数

图2-8 采用RSA交换密钥时的ClientKeyExchange消息结构长度:两个字节,表示消息剩下的字节数。

PreMasterSecret:客户端传送给服务器的一个重要数据,该数据将用于下文讨论的MasterSecret的计算。PreMasterSecret由两部分组成:客户端版本,两个字节;46字节的随机数。在此情况下,PreMasterSecret的明文长48字节,并且将使用服务器证书中所携带的RSA公钥对其进行加密,然后再传输。加密后的PreMasterSecret 也称为EncryptedPreMasterSecret。“长度”准确地说,应该说是此处的密文长度。例如,如果RSA的密钥是1024位,那么“长度”就应该是128字节,即0x0080。

2.2.7 ChangeCipherSpec消息

ChangeCipherSpec消息是一条非常特殊的消息。无论何种握手形式,它均出现在握手过程当中。但从图2-1看到,它并不是握手协议里定义的消息,而是与握手协

议并列的一种协议,被称为改变加密说明协议,有其自身的格式。

客户端和服务器都会发送ChangeCipherSpec 。在会话恢复的握手情况下,是服务器首先向客户端发送,其余情况下则是客户端先发送。消息的内容非常简单,只有一个值为1的字节。

ChangeCipherSpec 是告诉接收方,接下来的消息将采用新协商的加密套件和密钥进行通信。这将导致一系列的状态变化。这包括:所用的压缩算法、加密算法、摘要算法以及所使用的加密密钥、MAC 密钥等等。通信双方独立地维护自己的状态,并且分读写两种状态,各有各的一套密钥资料。服务器的读状态与客户端的写状态相对应,写状态与客户端的读状态相对应。发送ChangeCipherSpec 的一方,会改变自己的写状态,下条消息将使用新密钥资料进行发送;而收到ChangeCipherSpec 的一方则改变自己的读状态,下条消息将使用新密钥资料进行读取。密钥资料不传送,双方独立计算,但结果应该是一致的。ChangeCipherSpec 需要在双方协商完相关安全参数之后,在Finished 消息之前发送。

2.2.8 Finished 消息

Finished 消息是第一条使用新的加密参数进行加密传输的消息,它的作用是使双方能够确认没有任何握手消息被篡改过。通信双方均需要发送此消息。一方发送完ChangeCipherSpec 之后,应该马上发送Finished 消息。当双方都发送完Finished 消息后,整个握手过程就正式完成。Finished 消息也是需要分析的最后一条握手消息。

Finished 是SSL v3.0与TLS v1.0中在结构

定义上存在差别的唯一一条消息。

图2-9中是SSL v3.0的Finished 结构。它含有两个字段md5_hash 、sha_hash 。而图2-10则是TLS v1.0的Finished 结构,它只含有一个字段sha_hash 。md5_hash 、sha_hash 和verify_data 都是某种运算法则下计算出来的消息摘要。其中md5_hash 长16字节,

sha_hash 长20字节,verify_data 长12字节。

尽管具体内容不同,但思想是一致的。双

图2-9 SSL v3.0 Finished 消息结构

图2-10 TLS v1.0 Finished 消息结构

方都是通过某种方法对所有握手消息和计算出来的MasterSecret进行消息摘要,并向另一方发送此摘要。而另一方在本地进行相同的运算,并将计算结果与接收结果比较,如若一致,则说明握手过程没有被篡改。

2.3 SSL握手过程中相关计算的说明

SSL握手过程涉及到一些计算。密钥导出是整个握手过程最关键的计算。它有几个步骤:MasterSecret的计算、Key block的计算和Key block的分解。此外本节还将就记录层的MAC以及Finished消息的计算进行说明。SSL v3.0和TLS v1.0对这些计算都有着各自的定义。HMAC和PRF在TLS中被大量使用。这里先对其做一个介绍。

2.3.1 HMAC和PRF

(1)HMAC

HMAC即Keyed-Hash Message Authentication Code。传统的消息摘要函数MD5和SHA1的输入仅仅是要被进行消息摘要的文本,形式为MD5(text)和SHA1(text)。

表2-1 HMAC中将用到的符号

B被认可的消息摘要函数输入的块大小(按字节计)

H被认可的消息摘要函数

ipad内层填充,将x’36’重复B次

K在消息创作者和预期接受者之间共享的密钥

K0密钥K在必要的预处理后形成的一个B字节的密钥

L被认可的消息摘要函数输出的块大小(按字节计)

opad外层填充,将x’5c’重复B次

t MAC的字节数

text 用HMAC进行摘要的数据;text不包含填充符

x’N’十六进制记号,在字符串‘N’里的每个符号代表4个二进制位

|| 串联(如000||111=000111)

⊕?异或操作

[注]上表信息来自FIPS PUB 198[42]

而HMAC则是在使用消息摘要函数(例如MD5等)的同时,增加了一个“密钥”作为输入。HMAC使用嵌套的密钥控制摘要,就是说,先计算密钥和消息的摘要,然后用这个结果作为另一个密钥控制的输入。表2-1给出了HMAC中将会使用的符号。

HMAC的定义如下:

MAC(text) t = HMAC(K, text) t = H( (K0⊕ opad ) || H( (K0⊕ ipad) || text ) ) t 在下文中,HMAC中的H取的是目前最流行的两个摘要算法:MD5或者SHA1,分别将它们记作HMAC_MD5和HMAC_SHA1。即:

HMAC_MD5(K, text) t = MD5( (K0⊕ opad ) || MD5( (K0⊕ ipad) || text) ) t

HMAC_SHA1(K, text) t = SHA1( (K0⊕ opad ) || SHA1( (K0⊕ ipad) || text) ) t 此外,在TLS v1.0说明文档中,使用HMAC_hash记号,其含义和这里所说的HMAC是完全相同的。在这里约定,如果省略上述表达式中的下标t,那么MD5或者SHA1的所有输出都将被作为最终的MAC,即HMAC_MD5(K, text)是16字节,HMAC_SHA1(K, text)是20字节。

由于MD5和SHA1的输入块大小都为64字节,所以表2-1中的B的值就是64。

HMAC的算法如表2-2所示:

表2-2 HMAC描述

步骤描述

step 1如果K的长度 = B,则K0 = K,转到step 4

step 2如果K的长度> B,对K进行哈希操作,获得一个长为L字节的串,然后添加(B-L)个0来创建一个B字节的串K0 (比如K0 = H(K) || 00...00),转到step 4

step 3如果K的长度< B,在末尾添加0来创建一个B字节的串K0(例如,如果K是20字节长而且B = 64,那么将会在K的末尾添加44个0字节0x00)

step 4将K0与ipad进行异或操作来获得一个B字节的串:K0⊕ ipad

Step 5将数据'text'添加到step 4的结果后面:(K0⊕ ipad) || text

step 6对step 5得到的结果应用H:H((K0⊕ ipad) || text)

step 7将K0与opad进行异或操作:K0⊕ opad

step 8将step 6得到的结果添加到step 7的结果后面:

(K0⊕ opad) || H((K0⊕ ipad) || text)

step 9 对step 8得到的结果应用H:H((K0⊕ opad )|| H((K0⊕ ipad) || text))

step 10 选择step 9中的结果最左边的t字节作为MAC

[注]上表信息来自FIPS PUB 198[42]

使用OpenSSL建立根CA及自签名证书制作过程

使用OpenSSL建立根CA及自签名证书制作过程 2009-12-24 11:35:32| 分类:openssl |字号订阅 Openssl版本:0.9.8 版本,可从https://www.doczj.com/doc/5919214192.html,处下载。 1.先建立如下目录结构: $home/testca # testca 是待建CA的主目录 ├─newcerts/ # newcerts子目录将存放CA签发过的数组证书(备份目录) ├─private/ # private目录用来存放CA私钥 └─conf/ # conf目录用来存放简化openssl命令行参数用的配置文件 此外使用命令 echo "01" > serial touch index.txt 在ca根目录下创建文件serial (用来存放下一个证书的序列号) 和indext.txt (证书信息数据库文件)。 1.生成CA的私钥和自签名证书 (根证书) 创建配置文件:vi "$HOME/testca/conf/gentestca.conf" 文件内容如下: #################################### [ req ] default_keyfile = /home/cx/testCA/private/cakey.pem default_md = md5 prompt = no

distinguished_name = ca_distinguished_name x509_extensions = ca_extensions [ ca_distinguished_name ] organizationName = ss organizationalUnitName = sstc commonName = sstcCA emailAddress = GChen2@https://www.doczj.com/doc/5919214192.html, #自己的邮件地址 [ ca_extensions ] basicConstraints = CA:true ######################################## 然后执行命令如下: cd "$HOME/testca" openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 2190 -config "$HOME/testca/conf/gentestca.conf" 执行过程中需要输入CA私钥的保护密码,假设我们输入密码: 888888 可以用如下命令查看一下CA自己证书的内容 openssl x509 -in cacert.pem -text –noout 创建一个配置文件,以便后续CA日常操作中使用 vi "$HOME/testca/conf/testca.conf"

OpenSSL证书制作过程

比亚迪培训讲义 在J2EE中使用数字证书 深圳市金蝶中间件有限公司 2007年12月

Table of Contents 1 数字证书使用的场合 (3) 2 数字证书的颁发 (3) 2.1 概述 (3) 2.2 创建自签名CA (3) 2.2.1 生成ca私钥 (3) 2.2.2 生成ca待签名证书 (4) 2.2.3用CA私钥进行自签名,得到自签名的CA根证书 (4) 2.2.4 https://www.doczj.com/doc/5919214192.html,f配置文档 (5) 2.3 颁发服务器证书 (7) 2.3.1 生成服务器私钥对及自签名证书 (7) 2.3.2 生成服务器待签名证书 (7) 2.3.3 请求CA签名服务器待签名证书,得到经CA签名的服务器证书 (8) 2.3.4把CA根证书导入密钥库 mykeystore (8) 2.3.5把经过CA签名的服务器证书导入密钥库mykeystore (8) 2.4 颁发客户端证书 (9) 2.4.1 生成客户端私钥 (9) 2.4.2生成客户端待签名证书 (9) 2.4.3请求CA签名客户端待签名证书,得到经CA签名的客户端证书 (10) 生成客户端的个人证书client.p12 (10) 2.5 CA根证书导入客户端 (11) 2.6个人证书导入客户端 (11) 3 在J2EE中使用证书 (11) 3.1 配置SSL双向认证 (11) 3.1.1 服务器端密钥库和信任库 (12) 3.1.2修改Muxer服务 (12) 3.1.3修改SecurityService服务 (13) 3.2 在程序中获取证书信息 (13) 4 练习 (13) 5 附录 (14) 5.1 SSL v3的处理步骤 (14) 5.2 命令行调试SSL证书 (14)

openssl使用手册

OpenSSL有两种运行模式:交互模式和批处理模式。 直接输入openssl回车进入交互模式,输入带命令选项的openssl进入批处理模式。 (1) 配置文件 OpenSSL的默认配置文件位置不是很固定,可以用openssl ca命令得知。 你也可以指定自己的配置文件。 当前只有三个OpenSSL命令会使用这个配置文件:ca, req, x509。有望未来版本会有更多命令使用配置文件。 (2)消息摘要算法 支持的算法包括:MD2, MD4, MD5, MDC2, SHA1(有时候叫做DSS1), RIPEMD-160。SHA1和RIPEMD-160产生160位哈西值,其他的产生128位。除非出于兼容性考虑,否则推荐使用SHA1或者RIPEMD-160。 除了RIPEMD-160需要用rmd160命令外,其他的算法都可用dgst命令来执行。 OpenSSL对于SHA1的处理有点奇怪,有时候必须把它称作DSS1来引用。 消息摘要算法除了可计算哈西值,还可用于签名和验证签名。签名的时候,对于DSA生成的私匙必须要和DSS1(即SHA1)搭配。而对于RSA生成的私匙,任何消息摘要算法都可使用。 ############################################################# # 消息摘要算法应用例子 # 用SHA1算法计算文件file.txt的哈西值,输出到stdout $ openssl dgst -sha1 file.txt # 用SHA1算法计算文件file.txt的哈西值,输出到文件digest.txt $ openssl sha1 -out digest.txt file.txt # 用DSS1(SHA1)算法为文件file.txt签名,输出到文件dsasign.bin # 签名的private key必须为DSA算法产生的,保存在文件dsakey.pem中 $ openssl dgst -dss1 -sign dsakey.pem -out dsasign.bin file.txt # 用dss1算法验证file.txt的数字签名dsasign.bin, # 验证的private key为DSA算法产生的文件dsakey.pem $ openssl dgst -dss1 -prverify dsakey.pem -signature dsasign.bin file.txt # 用sha1算法为文件file.txt签名,输出到文件rsasign.bin # 签名的private key为RSA算法产生的文件rsaprivate.pem $ openssl sha1 -sign rsaprivate.pem -out rsasign.bin file.txt # 用sha1算法验证file.txt的数字签名rsasign.bin, # 验证的public key为RSA算法生成的rsapublic.pem $ openssl sha1 -verify rsapublic.pem -signature rsasign.bin file.txt (3) 对称密码 OpenSSL支持的对称密码包括Blowfish, CAST5, DES, 3DES(Triple DES), IDEA, RC2, RC4以及RC5。OpenSSL 0.9.7还新增了AES的支持。很多对称密码支持不同的模式,包括CBC, CFB, ECB以及OFB。对于每一种密码,默认的模式总是CBC。需要特别指出的是,尽量避免使用ECB模式,要想安全地使用它难以置信地困难。 enc命令用来访问对称密码,此外还可以用密码的名字作为命令来访问。除了加解密,base64可作为命令或者enc命令选项对数据进行base64编码/解码。 当你指定口令后,命令行工具会把口令和一个8字节的salt(随机生成的)进行组合,然后计算MD5 hash值。这个hash值被切分成两部分:加密钥匙(key)和初始化向量(initialization

OpenSSL 命令常用证书操作

在OpenSSL开发包中,包含一个实用工具:openssl,比如我用MinGW GCC 编译OpenSSL 0.9.8k 后,openssl 就保存在out目录下。openssl 工具是完成密钥、证书操作和其它SSL 事务的入口环境,直接运行不带参数的openssl 命令后,可以得到一个shell 环境,在其中可以以交互的方式完成SSL 相关的安全事务。 不过有时,如果用一个带参数选项的openssl 命令完成操作,会更方便。下面是我使用openssl 做证书操作时,记录的常用命令用法。 1.生成密钥 生成RSA密钥,保存在file.key中,命令如下: 上面命令的含义是:产生RSA密钥,包括:私钥和公钥两部分,然后使用DES3算法,用用户输入的密码(passphrase)加密该密钥数据,保存在file.key中。 file.key默认以BASE64方式编码密钥数据,file.key的格式称为:PEM (Privacy Enhanced Mail)格式,在RFC 1421到RFC 1424中定义,PEM是早期用来进行安全电子邮件传输的标准,但现在广泛用在证书、证书请求、PKCS#7对象的存储上,所以证书文件也经常以.pem为扩展名。 2.不加密的密钥 如果在生成密钥时,使用了-des3等加密选项,则会生成被用户密码保护的加密密钥,以增强密钥数据的保密性(因为密钥文件中包含私钥部分)。但有时为了方便,需要不加密的明文密钥(这样安全性会降低),比如:使用

Apache的HTTPS服务,每次启动Apache服务时,都需要用户输入保护密钥的密码,感觉麻烦的话,可以使用明文密钥。 明文密钥可以使用不带-des3等加密选项的openssl命令生成,还可以使用以下命令将加密保护的密钥转换成明文密钥,当然转换过程需要用户输入原来的加密保护密码: 3.查看密钥 查看保存在file.key中的RSA密钥的细节,如果此文件是加密保护的,会提示用户输入加密此文件的密码,命令如下: 输出的内容均是RSA密钥数据的数学信息(模数、指数、质数等),从输出的结果中也可知file.key保存的RSA密钥数据包括:私钥和公钥两部分。 该命令也能查看其它工具生成的密钥,比如SSH,只要密钥文件符合openssl支持的格式。 4.生成证书请求 由file.key产生一个证书请求(Certificate Request),保证在file.csr 中,命令如下: 指定时,默认会访问Unix格式的默认路径:/usr/local/ssl/https://www.doczj.com/doc/5919214192.html,f。 创建证书请求时,会要求用户输入一些身份信息,示例如下:

openssl安装及使用

Openssl安装及使用 一软件 Windows下需要用到的软件 1.ActivePerl 一个perl脚本解释器。其包含了包括有Perl for Win32、Perl for ISAPI、PerlScript、Perl Package Manager四套开发工具程序,可以让你编写出适用于unix,windows,linux系统的CGI程序来。安装的只是perl的一个解释程序啦,外观上也不会发生什么变化,你在windows的cmd界面里输入perl -v可查看你所安装的版本。 在你编译perl程序时会用到它。 2.C++编译器 编译器就是将“高级语言”翻译为“机器语言(低级语言)” 的程序。一个现代编译器的主要工作流程:源代码(source code) →预处理器(preprocessor) →编译器(compiler) →汇编程序(assembler) →目标代码(object code) →链接器(Linker) →可执行程序(executables)。c++编译器是一个与标准化C++高度兼容的编译环境。这点对于编译可移植的代码十分重要。编译器对不同的CPU会进行不同的优化。 3.OpenSSL OpenSSL是一个强大的安全套接字层密码库,Apache使用

它加密HTTPS,OpenSSH使用它加密SSH,它还是一个多用途的、跨平台的密码工具。 OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序。OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。 4.MASM 8.0 MASM是微软公司开发的汇编开发环境,拥有可视化的开发界面,使开发人员不必再使用DOS环境进行汇编的开发,编译速度快,支持80x86汇编以及Win32Asm是Windows下开发汇编的利器。它与windows平台的磨合程度非常好,但是在其他平台上就有所限制,使用MASM的开发人员必须在windows下进行开发。8.0版本在编译OpenSSL的时候不容易出错。 用winrar解压缩MASMSetup.exe得到:setup.exe继续用winrar解压缩setup.exe 得到:vc_masm1.cab继续用winrar解压缩vc_masm1.cab得到:FL_ml_exe__..... (很长的文件名,省略),将这个文件重命名为ml.exe测试得到的ml.exe , 应该显示:Microsoft (R) Macro Assembler Version 8.00.50727.104将ml.exe 拷贝到工作目录,即可正常使用。 5.mspdb60.dll

linux下利用openssl来实现证书的颁发(详细步骤)

linux下利用openssl来实现证书的颁发(详细步骤) 1、首先需要安装openssl,一个开源的实现加解密和证书的专业系统。在centos下可以利用yum安装。 2、openssl的配置文件是https://www.doczj.com/doc/5919214192.html,f,我们一般就是用默认配置就可以。如果证书有特殊要求的话,可以修改配置适应需求。这样必须把相关的文件放到配置文件指定的目录下面。 3、首先需要利用openssl生成根证书,以后的服务器端证书或者客户端证书都用他来签发,可以建立多个根证书,就像对应不同的公司一样 #生成根证书的私钥 openssl genrsa -out /home/lengshan/ca.key #利用私钥生成一个根证书的申请,一般证书的申请格式都是csr。所以私钥和csr一般需要保存好openssl req -new -key /home/lengshan/ca.key -out /home/lengshan/ca.csr #自签名的方式签发我们之前的申请的证书,生成的证书为ca.crt openssl x509 -req -days 3650 -in /home/lengshan/ca.csr -signkey /home/lengshan/ca.key -out /home/lengshan/ca.crt #为我们的证书建立第一个序列号,一般都是用4个字符,这个不影响之后的证书颁发等操作 echo FACE > /home/lengshan/serial #建立ca的证书库,不影响后面的操作,默认配置文件里也有存储的地方 touch /home/lengshan/index.txt #建立证书回收列表保存失效的证书

Linux怎么使用OpenSSL命令行

Linux怎么使用OpenSSL命令行 OpenSSL是一款命令行工具可以用来做检测,加密解密等等,尤其在Linux中很实用。那么Linux要如何使用OpenSSL命令行呢?下面小编将针对OpenSSL命令行的使用给大家做个详细介绍。 Linux如何使用OpenSSL命令行 1. base64编码/解码 谈到命令行下如何发送邮件附件,很多人想起了uuencode。也可以使用base64编码。以下是openssl base64编码/解码的使用: $ openssl base64 《filename.bin 》filename.txt $ openssl base64 -d 《filename.txt 》filename.bin 2. 校验文件的一致性

UNIX下校验文件一致性的方法很多,比如sum、cksum、md5sum、sha1sum等。sum和cksum适用于简单校验的场合,生成的校验码容易重复。md5sum有安全漏洞,当前比较推荐的是sha1sum。不过sha1sum在不同的平台用法有些不同。考虑到跨平台性,建议用openssl。 $ openssl sha1 filename SHA1(filename)= e83a42b9bc8431a6645099be50b6341a35d3dceb $ openssl md5 filename MD5(filename)= 26e9855f8ad6a5906fea121283c729c4 3. 文件加密/解密 OpenSSL支持很多加密算法,不过一些算法只是为了保持向后兼容性,现在已不推荐使用,比如DES和RC4-40。推荐使用的加密算法是bf(Blowfish)和-aes-128-cbc(运行在CBC模式的128

openssl工具使用简介

openssl工具使用简介 1.私有密钥生成方法 生成私有密钥,可以使用不同的数字签名算法.下面分别介绍; #采用DSA算法 $ openssl dsaparam -noout -out dsakey0.pem -genkey 1024 #采用RSA算法 $ openssl genrsa -out rsakey0.pem 1024 #采用RSA算法,并使用密码保护.在生成私钥时,需要输入一个密码,用于保护私钥. #在使用这个私钥进行加/解密操作时,也需要输入这个密码. $ openssl genrsa -des3 -out rsakey1.pem 1024 2.公用密钥的生成方法 根据私钥来生成公钥 #生成dsa算法的公钥 $ openssl dsa -in dsakey0.pem -pubout -out dsakey0-pub.pem #生成rsa算法的公钥 $ openssl rsa -in rsakey0.pem -pubout -out rsakey0-pub.pem 3.自签名证书的生成方法 #产生DSA算法的证书 $ openssl req -x509 -key dsakey0.pem -days 365 -out mycert-dsa.pem -new #产生RSA算法的证书 $ openssl req -x509 -key rsakey0.pem -days 365 -out mycert-rsa.pem -new 4.使用证书进行邮件加密 我们的明文信件内容: $ cat test.txt 111111 222222 333333 444444 aaaaaa 使用证书对明文信件进行加密,输出到etest.txt文件: $ openssl smime -encrypt -in test.txt -out etest.txt mycert-rsa.pem 查看加密后的密文内容: $ cat etest.txt MIME-Version: 1.0 Content-Disposition: attachment; filename="smime.p7m" Content-Type: application/x-pkcs7-mime; smime-type=enveloped-data; name="smime.p7m" Content-Transfer-Encoding: base64 MIIBYAYJKoZIhvcNAQcDoIIBUTCCAU0CAQAxgewwgekCAQAwUjBFMQswCQYDVQQG EwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lk

openssl,CA证书生成命令集合

多级证书 平时我们自己签发CA证书再签发服务器证书的场景其实都非常简单。浏览器把自签CA导入后,就可以信任由这个CA直接签发的服务器证书。 但是实际上网站使用的证书肯定都不是由根CA直接签发的,比如 淘宝登陆服务器使用的证书。 我之前是自己写了脚本由自签CA直接签发服务器证书,为了真清楚的理解一下证书链的作用就直接使用openssl先签发2层的子CA,再由子CA去签发服务器证书。 手动签发证书的脚本如下: 生成自签CA # cat makerootca.sh #!/bin/bash DIR=/root/ssl.test2 mkdir -p $DIR/demoCA/{private,newcerts} touch $DIR/demoCA/index.txt echo 01 > $DIR/demoCA/serial opensslgenrsa -des3 -out $DIR/demoCA/private/cakey.pem 2048

opensslreq -new -x509 -days 3650 -key $DIR/demoCA/private/cakey.pem -out $DIR/demoCA/careq.pem 签发二级CA的脚本 https://www.doczj.com/doc/5919214192.html,f/root/ssl.test2 # cat no2domain.sh #!/bin/bash [ $# -ne 1 ] && echo "$0 NAME" && exit NAME=$1 DIR=/root/ssl.test2/autoget mkdir -p $DIR opensslgenrsa -des3 -out $DIR/$NAME.key 2048 openssl x509 -in $DIR/../demoCA/careq.pem -noout -text opensslrsa -in $DIR/$NAME.key -out $DIR/$NAME.key opensslreq -new -days 3650 -key $DIR/$NAME.key -out $DIR/$NAME.csr opensslca -extensions v3_ca -in $DIR/$NAME.csr -config $DIR/../https://www.doczj.com/doc/5919214192.html,f -days 3000 -out $DIR/$NAME.crt -cert $DIR/../demoCA/careq.pem -keyfile $DIR/../demoCA/private/cakey.pem 签发三级CA的脚本 # cat no3domain.sh #!/bin/bash #[ $# -ne 1 ] && echo "$0 NAME" && exit NAME=calv3 DIR=/root/ssl.test2/autoget opensslgenrsa -des3 -out $DIR/$NAME.key 2048

实验一综合热分析实验

实验一综合热分析实验 一、目的要求 1.了解综合热分析仪的基本构造、原理及方法。 2.了解实验条件的选择。 3.掌握热分析样品的制样方法。 4.掌握对样品的热分析图谱进行相关分析和计算。 二、综合热分析仪的结构、原理及性能 综合热分析仪是在程序控制温度下同步测定物质的重量变化、温度变化和热效应的装置。一般地,综合热分析仪主要由程序控制系统、测量系统、显示系统、气氛控制系统、操作控制和数据处理系统等部分组成。 1.TG的结构、原理及性能 热重法(TG)是在程序控制温度下,测量物质的质量与温度关系的一种热分析技术。热重法记录的是热重曲线(TG曲线),它以质量作为纵坐标,以温度或时间为横坐标,即m—T曲线。 热重法通常有下列两种类型:等温热重法:在恒温下测定物质质量变化与时间的关系;非等温热重法:在程序升温下测定物质质量变化与温度的关系。 热重法所用仪器称为热重分析仪或热天平,其基本构造是由精密天平和程序控温的加热炉组成,热天平是根据天平梁的倾斜与重量变化的关系进行测定的,通常测定重量变化的方法有变位法和零位法两种。①变位法是利用物质的质量变化与天平梁的倾斜成正比的关系,用差动变压器直接控制检测。②零位法是靠电磁作用力使因质量变化而倾斜的的天平梁恢复到原来的平衡位置,施加的电磁力与质量变化成正比,而电磁力的大小与方向是通过调节转换结构中线圈中的电流实现的,因此检测此电流即可知质量变化。天平梁倾斜由光电元件检出,经电子放大后反馈到安装在天平衡量上的感应线圈,使天平梁又回到原点。 SDTQ600综合热分析仪采用水平双杆双天平的结构设计。一臂作为水平天平零位平衡测量,另一臂作为高灵敏度DTA的热电偶。同时,一臂用来装填试样,

使用OPENSSL编写服务器和客户端代码实例

使用OPENSSL编写服务器和客户端代码实例使用相同的ca生成两个证书,一个是server.cer,一个是client.cer,注意生成server.cer的时候必须指明证书可以用于服务端的。 服务器代码: 1.#include "openssl/bio.h" 2.#include "openssl/ssl.h" 3.#include "openssl/err.h" 4. 5.#include 6. 7.#define EXIT_IF_TRUE(x) if (x) \ 8. do { \ 9. fprintf(stderr, "Check '%s' is true\n", #x); \ 10. ERR_print_errors_fp(stderr); \ 11. exit(2); \ 12. }while(0) 13. 14.int main(int argc, char **argv) 15.{ 16. SSL_CTX *ctx; 17. SSL *ssl; 18. X509 *client_cert; 19. 20. char szBuffer[1024]; 21. int nLen; 22. 23. struct sockaddr_in addr; 24. int len; 25. int nListenFd, nAcceptFd; 26. 27.// 初始化 28. cutil_init(); 29. cutil_log_set_level(LOG_ALL); 30. cutil_log_set_stderr(1);

31. SSLeay_add_ssl_algorithms(); 32. OpenSSL_add_all_algorithms(); 33. SSL_load_error_strings(); 34. ERR_load_BIO_strings(); 35. 36.// 我们使用SSL V3,V2 37. EXIT_IF_TRUE((ctx = SSL_CTX_new (SSLv23_method())) == NULL); 38. 39.// 要求校验对方证书 40. SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL); 41. 42.// 加载CA的证书 43. EXIT_IF_TRUE (!SSL_CTX_load_verify_locations(ctx, "cacert.cer", NULL)); 44. 45.// 加载自己的证书 46. EXIT_IF_TRUE (SSL_CTX_use_certificate_file(ctx, "server.cer", SSL_FILETYPE_PEM ) <= 0) ; 47. 48.// 加载自己的私钥 49. EXIT_IF_TRUE (SSL_CTX_use_PrivateKey_file(ctx, "server.key", SSL_FILETYPE_PEM) <= 0) ; 50. 51.// 判定私钥是否正确 52. EXIT_IF_TRUE (!SSL_CTX_check_private_key(ctx)); 53. 54.// 创建并等待连接 55. nListenFd = cutil_socket_new(SOCK_STREAM); 56. cutil_socket_bind(nListenFd, NULL, 8812, 1); 57. 58. memset(&addr, 0, sizeof(addr)); 59. len = sizeof(addr); 60. nAcceptFd = accept(nListenFd, (struct sockaddr *)&addr, (size_t *)&len); 61. cutil_log_debug("Accept a connect from [%s:%d]\n", 62. inet_ntoa(addr.sin_addr), ntohs(addr.sin_port)); 63. 64.// 将连接付给SSL 65. EXIT_IF_TRUE( (ssl = SSL_new (ctx)) == NULL); 66. SSL_set_fd (ssl, nAcceptFd); 67. EXIT_IF_TRUE( SSL_accept (ssl) != 1); 68. 69.// 进行操作 70. memset(szBuffer, 0, sizeof(szBuffer)); 71. nLen = SSL_read(ssl,szBuffer, sizeof(szBuffer)); 72. fprintf(stderr, "Get Len %d %s ok\n", nLen, szBuffer);

OpenSSL介绍

标题:【翻译】(Ubuntu文档)OpenSSL 本文档用于介绍SSL应用层协议,特别是OpenSSL对SSL的实现。举例详细介绍了在Client-Server环境下OpenSSL的使用。最后,通过例子展示了如何在Apache上使用OpenSSL以提供Https服务。 读者应熟练使用命令行,bash,修改配置文件。 OpenSSL简介: SSL也即Secure Socket Layer,是由网景公司为了传输敏感数据而提出的协议。SSL使用私钥加密传输的数据,防止被窃听。SSL最普遍的使用适合和浏览器结合使用,但是其他很多的应用也可以使用SSL。一般而言,使用了SSL的URL以https开头。 OpenSSL是广泛使用的商业级SSL工具,由Eric A. Young和Tim J.Hudson开发的库SSLeay。 X.509是ITU-T发布的数字证书规范。它规定了确定个人或计算机系统身份确认所需的信息和属性,用于安全管理和发布英特网的数字签名证书。OpenSSL广泛应用X.509。 OpenSSL使用 安装:首先使用如下命令确定Ubuntu可用的SSL版本: apt-cache search libssl | grep SSL 应该看到如下结果: libssl0.9.6 - SSL shared libraries (old version) libssl-dev - SSL development libraries, header files and documentation libssl0.9.7 - SSL shared libraries 可能还需要安装ca-certificate. 若需要OpenSSL的通用库,还需安装libssl-dev. 基本OpenSSL命令 确定OpenSSL的版本: openssl verion OpenSSL的可用命令: openssl help 为查找某一命令的帮助,在命令后加-h,如 openssl enc -h 列出所有可用的加密算法: openssl ciphers -v 使用openssl speed可以查看本机的openssl速度,查看每个算法美妙的加密字节数,以及sign/verify的时间 SSL证书 该部分介绍SSL证书的产生,包括用于支持SSL的服务应用的自签名和公认签名,以及用于客户程序的X.509签名。 服务器SSL证书 生成X.509证书后,有三种方式进行签名:自签名,生成CA以及由公认的CA机构签名。证书签名后,便可用于OpenSSL、连接LDAP的SSL通道以及HTTP服务器。该部分用于介绍证书的生成和签名。 生成并自签名证书

openssl 编程入门(含完整示例)

openssl编程入门(含完整示例) 易剑 1.编写目的 第一次跑起openssl示例并不太简单,本文的目的是为了让这个过程变得非常简单。在开始之前,要非常感谢周立发同学,正是通过他共享的示例,较轻松的入了门。本文档对他共享的示例中的一个小错误进行了修正,并提供了傻瓜式的“编译-生成-KEY运行”一条龙脚本(方法请参见压缩包中的readme文件),让跑第一个openssl程序变得轻轻松松。 2.示例包 ssl_test.tar.gz openssl-0.9.8h-Su SE10.tar.gz ssl_test.tar.gz为示例源代码包,openssl-0.9.8h-SuSE10.tar.gz为openssl二进制包,测试时是安装在/usr/local/ssl。 ssl_test.tar.gz中的示例在SuSE10中测试通过,使用的是openssl-0.9.8h,它包括如下文件: -rw-r--r--1root root1346Dec518:11cacert.pem -rwxr-xr-x1root root114Dec518:11make_key.sh -rwxr-xr-x1root root172Dec518:37mk_client.sh -rwxr-xr-x1root root172Dec518:37mk_server.sh -rw-r--r--1root root1679Dec518:11privkey.pem -rw-r--r--1root root167Dec518:39readme -rwxr-xr-x1root root38Dec518:38run_client.sh -rwxr-xr-x1root root64Dec518:38run_server.sh -rwxr-xr-x1root root1140142Dec518:38ssl_client -rw-r--r--1root root3928Dec517:31ssl_client.cpp -rwxr-xr-x1root root1139667Dec518:38ssl_server -rw-r--r--1root root4882Dec517:31ssl_server.cpp readme为包内容说明,run_server.sh用来运行服务端,run_client.sh用来运行客户端,mk_server.sh用来编译服务端,mk_client.sh用来编译客户端,make_key.sh用来生成钥匙KEY。

使用OpenSSLAPI进行安全编程

使用OpenSSL API 进行安全编程 创建基本的安全连接和非安全连接 Kenneth Ballard (kenneth.ballard@https://www.doczj.com/doc/5919214192.html,), 自由程序员 简介:学习如何使用 OpenSSL ——用于安全通信的最著名的开放库——的API 有些强人所难,因为其文档并不完全。您可以通过本文中的提示补充这方面的知识,并驾驭该 API。在建立基本的连接之后,就可以查看如何使用 OpenSSL 的 BIO 库来建立安全连接和非安全连接。与此同时,您还会学到一些关于错误检测的知识。 OpenSSL API 的文档有些含糊不清。因为还没有多少关于 OpenSSL 使用的教程,所以对初学者来说,在应用程序中使用它可能会有一些困难。那么怎样才能使用 OpenSSL 实现一个基本的安全连接呢?本教程将帮助您解决这个问题。 学习如何实现 OpenSSL 的困难部分在于其文档的不完全。不完全的 API 文档通常会妨碍开发人员使用该 API,而这通常意味着它注定要失败。但 OpenSSL 仍然很活跃,而且正逐渐变得强大。这是为什么? OpenSSL 是用于安全通信的最著名的开放库。在 google 中搜索“SSL library”得到的返回结果中,列表最上方就是 OpenSSL。它诞生于 1998 年,源自 Eric Young 和 Tim Hudson 开发的 SSLeay 库。其他 SSL 工具包包括遵循 GNU General Public License 发行的 GNU TLS,以及 Mozilla Network Security Services(NSS)(请参阅本文后面的参考资料,以获得其他信息)。 那么,是什么使得 OpenSSL 比 GNU TLS、Mozilla NSS 或其他所有的库都优越呢?许可是一方面因素(请参阅参考资料)。此外,GNS TLS(迄今为止)只支持 TLS v1.0 和 SSL v3.0 协议,仅此而已。 Mozilla NSS 的发行既遵循 Mozilla Public License 又遵循 GNU GPL,它允许开发人员进行选择。不过,Mozilla NSS 比 OpenSSL 大,并且需要其他外部库来对库进行编译,而 OpenSSL 是完全自包含的。与 OpenSSL 相同,大部分 NSS API 也没有文档资料。Mozilla NSS 获得了 PKCS #11 支持,该支持可以用于诸如智能卡这样的加密标志。OpenSSL 就不具备这一支持。 先决条件 要充分理解并利用本文,您应该: ?精通 C 编程。 ?熟悉 Internet 通信和支持 Internet 的应用程序的编写。

Linux下OpenSSL客户端中使用req命令来生成证书的教程

Linux下OpenSSL客户端中使用req命令来生成证书的教程作者:Gordon0918 字体:[增加减小] 来源:开源中文社区时间:04-22 11:56:58?我要评论这篇文章主要介绍了Linux下OpenSSL客户端中使用req命令来生成证书的教程,详细讲解了自动生成密钥和生成自签名证书的方法,需要的朋友可以参考下 openssl req 用于生成证书请求,以让第三方权威机构CA来签发,生成我们需要的证书。req 命令也可以调用x509命令,以进行格式转换及显示证书文件中的text,modulus等信息。如果你还没有密钥对,req命令可以一统帮你生成密钥对和证书请求,也可以指定是否对私钥文件进行加密。 1、密钥、证书请求、证书概要说明 在证书申请签发过程中,客户端涉及到密钥、证书请求、证书这几个概念,初学者可能会搞不清楚三者的关系,网上有的根据后缀名来区分三者,更让人一头雾水。我们以申请证书的流程说明三者的关系。客户端(相对于CA)在申请证书的时候,大体上有三个步骤: 第一步:生成客户端的密钥,即客户端的公私钥对,且要保证私钥只有客户端自己拥有。 第二步:以客户端的密钥和客户端自身的信息(国家、机构、域名、邮箱等)为输入,生成证书请求文件。其中客户端的公钥和客户端信息是明文保存在证书请求文件中的,而客户端私钥的作用是对客户端公钥及客户端信息做签名,自身是不包含在证书请求中的。然后把证书请求文件发送给CA机构。 第三步:CA机构接收到客户端的证书请求文件后,首先校验其签名,然后审核客户端的信息,最后CA机构使用自己的私钥为证书请求文件签名,生成证书文件,下发给客户端。此证书就是客户端的身份证,来表明用户的身份。 至此客户端申请证书流程结束,其中涉及到证书签发机构CA,CA是被绝对信任的机构。如果把客户端证书比作用户身份证,那么CA就是颁发身份证的机构,我们以https为例说明证书的用处。 为了数据传输安全,越来越多的网站启用https。在https握手阶段,服务器首先把自己的证书发送给用户(浏览器),浏览器查看证书中的发证机构,然后在机器内置的证书中(在PC或者手机上,内置了世界上著名的CA机构的证书)查找对应CA证书,然后使用内置的证书公钥校验服

Openssl各目录说明

Openssl 目录名功能描述 Crypto 存放OpenSSL 所有加密算法源码文件 和相关标注如X.509 源码文件,是 OpenSSL 中最重要的目录,包含了 OpenSSL 密码算法库的所有内容。SSL 存放OpenSSL 中SSL 协议各个版本和 TLS 1.0 协议源码文件,包含了 OpenSSL 协议库的所有内容。 Apps 存放OpenSSL 中所有应用程序源码文 件,如CA、X509 等应用程序的源文 件就存放在这里。 Doc 存放了OpenSSL 中所有的使用说明文 档,包含三个部分:应用程序说明文档、 加密算法库API说明文档以及SSL 协 议API 说明文档。 Demos 存放了一些基于OpenSSL 的应用程序 例子,这些例子一般都很简单,演示怎 么使用OpenSSL其中的一个功能。Include 存放了使用OpenSSL 的库时需要的头 文件。 Test 存放了OpenSSL 自身功能测试程序的 源码文件 OpenSSL算法目录 openSSL 的算法目录Crypto 目录包含了OpenSSL 密码算法库的所有源代码文件,是OpenSSL 中最重要的目录之一。OpenSSL 的密码算法库包含了

OpenSSL 中所有密码算法、密钥管理和证书管理相关标准的实现,在Windows 下编译后的库文件名为libeay32.lib,在Linux 下编译后生产的库文件名为libcrypto.a。Crypto 目录下包含了众多的子目录,这些目录大多数以相关的算法或标准名称的简写命名。当然,并非所有这些目录存放的源文件都是密码算法和标准,有些是OpenSSL 本身的一些相关功能文件,如BIO、DSO 和EVP 等。 Crypto子目录列表 Aes 对称算法,美国新的对称加密算法标准 AES 算法源码。 Bf 对称算法,Blowfish 对称加密算法源 码。 Cast 对称算法,CAST 对称加密算法源码。Des 对称算法,包括了DES 和3DES 对称 加密算法源码。 Idea 对称算法,IDEA 对称加密算法源码。Rc2 对称算法,RC2 对称加密算法源码。Rc4 对称算法,RC4 对称加密算法源码 Rc5 对称算法,RC5 对称加密算法源码。Dh 非对称算法,DH 非对称密钥交换算法 源码。 Dsa 非对称算法,DSA 非对称算法源码, 用于数字签名。 Ec 非对称算法,EC 椭圆曲线算法源码。Rsa 非对称算法,RSA 非对称加密算法源 码,既可以用于密钥交换,也可以用于 数字签名。 Md2 信息摘要算法,MD2 信息摘要算法源 码。 Md5 信息摘要算法,MD5 信息摘要算法源 码。 Mdc2 信息摘要算法,MDC2 信息摘要算法源

相关主题
文本预览
相关文档 最新文档