OpenSSL HTTPS实现的深度解析
一、引言
随着互联网技术的飞速发展,网络安全问题日益受到关注。
HTTPS作为一种安全的超文本传输协议,在互联网上得到广泛应用。
OpenSSL是一个强大的开源加密库,支持多种加密算法,是HTTPS协议实现的关键组件之一。
本文将深度解析OpenSSL在HTTPS实现中的应用。
二、HTTPS概述
HTTPS是一种通过计算机网络进行安全通信的协议,它在HTTP协议的基础上,使用SSL/TLS加密技术,对传输的数据进行加密,确保数据的完整性和隐私性。
HTTPS的主要作用包括:身份认证、数据完整性保护和数据加密。
三、OpenSSL简介
OpenSSL是一个强大的开源工具库,支持多种加密算法和安全协议,包括SSL、TLS等。
OpenSSL提供了丰富的API接口,方便开发者在应用程序中实现加密功能。
OpenSSL还提供了命令行工具,方便用户进行证书管理、密钥管理等操作。
四、OpenSSL在HTTPS中的应用
1. 生成证书和密钥
在HTTPS中,服务器和客户端需要使用证书和密钥进行身份认证。
OpenSSL提供了生成证书和密钥的功能。
通过OpenSSL的命令行工具,可以生成RSA或ECDSA密钥对,以及自签名证书或向权威证书机构申请证书。
2. 建立SSL/TLS连接
当客户端与服务器建立HTTPS连接时,双方需要进行握手过程。
在这个过程中,OpenSSL作为库函数,负责处理SSL/TLS协议的细节。
握手过程中,服务器会向客户端发送证书,客户端验证服务器证书的合法性后,双方建立加密连接。
3. 数据加密和解密
在HTTPS通信过程中,OpenSSL负责数据的加密和解密。
当客户端向服务器发送数据时,数据首先被加密,然后通过网络传输到服务器。
服务器收到数据后,使用相应的密钥进行解密。
反之,服务器向客户端发送数据时,也会进行加密和解密过程。
五、OpenSSL在HTTPS中的工作流程
1. 客户端向服务器发送HTTPS请求。
2. 服务器响应请求,并发送证书和公钥。
3. 客户端验证服务器证书的合法性,并可能向服务器发送客户端证书。
4. 双方进行握手过程,协商使用何种加密套件和主密钥。
5. 握手完成后,OpenSSL负责数据的加密和解密过程。
六、OpenSSL的配置与优化
为了保障HTTPS的安全性,需要对OpenSSL进行适当的配置与优化。
主要的配置包括选择适当的加密算法、配置证书和密钥的管理方式、调整性能参数等。
还需要定期对OpenSSL进行安全更新,以修复已知的安全漏洞。
七、常见问题和解决方案
在使用OpenSSL实现HTTPS时,可能会遇到一些常见问题,如证书验证失败、握手过程失败等。
这些问题可能是由于证书配置错误、加密算法不支持等原因导致的。
解决这些问题的方法包括检查证书配置、更新OpenSSL版本、选择适当的加密算法等。
八、总结
本文深度解析了OpenSSL在HTTPS实现中的应用,包括生成证书和密钥、建立SSL/TLS连接、数据加密和解密等方面。
同时,还介绍了OpenSSL的配置与优化方法,以及常见问题和解决方案。
通过本文的学习,读者可以更好地理解HTTPS的安全机制,以及OpenSSL在其中的作用。
openssl 如何使用
为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。
1.对称加密算法 OpenSSL一共提供了8种对称加密算法,其中7种是分组加密算法,仅有的一种流加密算法是RC4。
这7种分组加密算法分别是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支持电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常用的分组密码加密模式。
其中,AES使用的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128位,其它算法使用的则是64位。
事实上,DES算法里面不仅仅是常用的DES算法,还支持三个密钥和两个密钥3DES算法。
2.非对称加密算法 OpenSSL一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。
DH算法一般用户密钥交换。
RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。
DSA算法则一般只用于数字签名。
3.信息摘要算法 OpenSSL实现了5种信息摘要算法,分别是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD。
SHA算法事实上包括了SHA和SHA1两种信息摘要算法,此外,OpenSSL还实现了DSS标准中规定的两种信息摘要算法DSS和DSS1。
4.密钥和证书管理 密钥和证书管理是PKI的一个重要组成部分,OpenSSL为之提供了丰富的功能,支持多种标准。
首先,OpenSSL实现了ASN.1的证书和密钥相关标准,提供了对证书、公钥、私钥、证书请求以及CRL等数据对象的DER、PEM和BASE64的编解码功能。
OpenSSL提供了产生各种公开密钥对和对称密钥的方法、函数和应用程序,同时提供了对公钥和私钥的DER编解码功能。
并实现了私钥的PKCS#12和PKCS#8的编解码功能。
OpenSSL在标准中提供了对私钥的加密保护功能,使得密钥可以安全地进行存储和分发。
在此基础上,OpenSSL实现了对证书的X.509标准编解码、PKCS#12格式的编解码以及PKCS#7的编解码功能。
并提供了一种文本数据库,支持证书的管理功能,包括证书密钥产生、请求产生、证书签发、吊销和验证等功能。
事实上,OpenSSL提供的CA应用程序就是一个小型的证书管理中心(CA),实现了证书签发的整个流程和证书管理的大部分机制。
和TLS协议 OpenSSL实现了SSL协议的SSLv2和SSLv3,支持了其中绝大部分算法协议。
OpenSSL也实现了TLSv1.0,TLS是SSLv3的标准化版,虽然区别不大,但毕竟有很多细节不尽相同。
虽然已经有众多的软件实现了OpenSSL的功能,但是OpenSSL里面实现的SSL协议能够让我们对SSL协议有一个更加清楚的认识,因为至少存在两点:一是OpenSSL实现的SSL协议是开放源代码的,我们可以追究SSL协议实现的每一个细节;二是OpenSSL实现的SSL协议是纯粹的SSL协议,没有跟其它协议(如HTTP)协议结合在一起,澄清了SSL协议的本来面目。
6.应用程序 OpenSSL的应用程序已经成为了OpenSSL重要的一个组成部分,其重要性恐怕是OpenSSL的开发者开始没有想到的。
现在OpenSSL的应用中,很多都是基于OpenSSL的应用程序而不是其API的,如OpenCA,就是完全使用OpenSSL的应用程序实现的。
OpenSSL的应用程序是基于OpenSSL的密码算法库和SSL协议库写成的,所以也是一些非常好的OpenSSL的API使用范例,读懂所有这些范例,你对OpenSSL的API使用了解就比较全面了,当然,这也是一项锻炼你的意志力的工作。
OpenSSL的应用程序提供了相对全面的功能,在相当多的人看来,OpenSSL已经为自己做好了一切,不需要再做更多的开发工作了,所以,他们也把这些应用程序成为OpenSSL的指令。
OpenSSL的应用程序主要包括密钥生成、证书管理、格式转换、数据加密和签名、SSL测试以及其它辅助配置功能。
机制 Engine机制的出现是在OpenSSL的0.9.6版的事情,开始的时候是将普通版本跟支持Engine的版本分开的,到了OpenSSL的0.9.7版,Engine机制集成到了OpenSSL的内核中,成为了OpenSSL不可缺少的一部分。
Engine机制目的是为了使OpenSSL能够透明地使用第三方提供的软件加密库或者硬件加密设备进行加密。
OpenSSL的Engine机制成功地达到了这个目的,这使得OpenSSL已经不仅仅使一个加密库,而是提供了一个通用地加密接口,能够与绝大部分加密库或者加密设备协调工作。
当然,要使特定加密库或加密设备更OpenSSL协调工作,需要写少量的接口代码,但是这样的工作量并不大,虽然还是需要一点密码学的知识。
Engine机制的功能跟Windows提供的CSP功能目标是基本相同的。
目前,OpenSSL的0.9.7版本支持的内嵌第三方加密设备有8种,包括:CryptoSwift、nCipher、Atalla、Nuron、UBSEC、Aep、SureWare以及IBM 4758 CCA的硬件加密设备。
现在还出现了支持PKCS#11接口的Engine接口,支持微软CryptoAPI的接口也有人进行开发。
当然,所有上述Engine接口支持不一定很全面,比如,可能支持其中一两种公开密钥算法。
8.辅助功能 BIO机制是OpenSSL提供的一种高层IO接口,该接口封装了几乎所有类型的IO接口,如内存访问、文件访问以及Socket等。
这使得代码的重用性大幅度提高,OpenSSL提供API的复杂性也降低了很多。
OpenSSL对于随机数的生成和管理也提供了一整套的解决方法和支持API函数。
随机数的好坏是决定一个密钥是否安全的重要前提。
OpenSSL还提供了其它的一些辅助功能,如从口令生成密钥的API,证书签发和管理中的配置文件机制等等。
如果你有足够的耐心,将会在深入使用OpenSSL的过程慢慢发现很多这样的小功能,让你不断有新的惊喜。
公钥真实性两种机制
一、基础知识:1、互联网上中间人攻击通常用的三种方式:1)窃听 2)数据篡改 3)会话劫持 2、数据加密的常用的三种方式有:对称加密、非对称加密、单向加密。
3、ssl:secure socket layer,安全的套接字层。
4、TLS:Transport Layer Security,功能类似于ssl。
5、随机数生成器:/dev/random 和 /dev/urandom 。
-salt:依赖于随机数生成器。
6、随机数的来源:熵池和伪随机数生成器。
熵池中的随机数来自块设备中断和键盘和鼠标的敲击时间间隔;伪随机数生成器中的随机数来自于熵池和软件产生。
7、openssl rand [base64] num 也可以用来生成随机数。
8、echo –n “QQ”|openssl base64,表示对QQ做base64编码。
二、对称加密:1、加密方和解密方使用同一个密钥。
2、加密解密的速度比较快,适合数据比较长时的使用。
3、密钥传输的过程不安全,且容易被破解,密钥管理也比较麻烦。
4、加密算法:DES(Data Encryption Standard)、3DES、AES(Advanced Encryption Standard,支持128、192、256、512位密钥的加密)、Blowfish。
5、加密工具:openssl、gpg(pgp工具)三、非对称加密(公钥加密):1、每个用户拥用一对密钥加密:公钥和私钥。
2、公钥加密,私钥解密;私钥加密,公钥解密。
3、公钥传输的过程不安全,易被窃取和替换。
4、由于公钥使用的密钥长度非常长,所以公钥加密速度非常慢,一般不使用其去加密。
5、某一个用户用其私钥加密,其他用户用其公钥解密,实现数字签名的作用。
6、公钥加密的另一个作用是实现密钥交换。
7、加密和签名算法:RSA、ELGamal。
8、公钥签名算法:DSA。
9、加密工具:gpg、openssl四、单向加密: 1、特征:雪崩效应、定长输出和不可逆。
2、作用是:确保数据的完整性。
3、加密算法:md5(标准密钥长度128位)、sha1(标准密钥长度160位)、md4、CRC-324、加密工具:md5sum、sha1sum、openssl dgst。
5、计算某个文件的hash值,例如:md5sum/shalsumFileName,openssl dgst –md5/-sha1 FileName。
五、密钥交换的两种机制:1、公钥加密实现:发送方用接收方的公钥加密自己的密钥,接收方用自己的私钥解密得到发送方的密钥,逆过来亦然,从而实现密钥交换。
2、使用DH算法:前提发送方和接受方协商使用同一个大素数P和生成数g,各自产生的随机数X和Y。
发送方将g的X次方mod P产生的数值发送给接收方,接受方将g的Y次方mod P产生的数值发送给发送方,发送方再对接收的结果做X次方运算,接受方对接收的结果做Y次方运算,最终密码形成,密钥交换完成。
六、同时实现数据的完整性、数据加密和身份验证所使用到的机制如下: 假设Bob和Rose进行通信:1】加密过程: Bob使用单向加密算法得出发送数据的特征码(用于数据完整性检测),Bob用自己的私钥加密此特征码(实现身份验证),并将此特征码置于数据的后面。
Bob再生成一个密码D,用此密码加密加密过的特征码和数据(实现数据加密),此时生成的数据我们称其为Q,最后用Rose的公钥加密该密码D,并将D置于Q的后面。
2】解密过程: Rose用自己的私钥解密得到D,然后用D解密得到数据和加密过得特征码,再用Bob的公钥解密此特征码,如果可以解密,则说明该数据是Bob发送的,反之,则不是。
最后用单向加密算法计算该段数据的特征码,通过比较发送过来的特征码和Rose通过计算得到的特征码来确定此数据是否被篡改掉,如果特征码一致,则数据未发生改变;如果特征码不一致,则数据发生过改变。
七、openssl: 1)组件:libcrypto:加密库。
libssl:实现ssl功能的库。
openssl:多用途的加密工具,能够提供对称加密、公钥加密、单向加密,且可以作为一个简单的本地CA用。
2)在对称加密中,使用openssl实现对某个文件加密3使用openssl实现解密3-outplaintext 3)openssl version:查看openssl的版本信息。
4)openssl :进入openssl的命令行模式。
5)openssl speed:测试某种加密算法加密不同长度密钥的速率。
6)在公钥加密中,openssl可以用来生成私钥。
opensslgenrsa 指定生成的私钥长度 > 保存到的文件名opensslgenrsa[des3]-out 保存到的文件名 指定生成的私钥长度在生成密钥文件的同时修改密钥文件的权限:(umask 077; opensslgenrsa 指定生成的私钥长度> 保存到的文件名)opensslgenrsa 指定生成的私钥长度 [-des3](加密私钥文件)>保存到的文件名。
opensslgenrsa[-des3]-out保存到的文件名指定生成的私钥长度当私钥在生成的时候,文件未加密,则可以使用如下格式对未加密的私钥文件进行加密并保存:opensslrsain未加密私钥存放的文件 –des3-out保存到的文件名 解密私钥:opensslrsain需要解密的私钥文件 –out保存到的文件名。
7)公钥在私钥中提取出:opensslrsa–-pubout 指定保存公钥的文件名。
如何创建一个自签名的SSL证书
自签名SSL证书不安全,建议你还是申请一个又第三方CA机构颁发的SSL证书比较好,国内用的过得比如沃通SSL证书等。