具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚明白,下面结合附图对本发明实施例做进一步详细说明。在此,本发明的示意性实施例及其说明用于解释本发明,但并不作为对本发明的限定。
实施例一
如图1所示,本实施例提供一种基于HTTP的产生会话密钥的方法,该方法包括:
客户端向服务器发送包含客户端协议版本、客户端时间戳、客户端随机数、会话、支持的加密算法集的ClientHello S101。
所述服务器接收客户端发送的ClientHello,建立会话,存储客户端时间戳、客户端随机数,根据所述支持的算法集选择本次会话的加密算法,并向所述客户端发送包含服务器协议版本号、服务器时间戳、服务器随机数、服务器会话、本次会话指定加密算法、服务器公钥证书的ServerHello S102。
所述客户端接收所述的ServerHello,根据所述的ServerHello生成ClientKeyExchange、客户端预主密钥PMS、客户端主密钥MS及客户端信道验证Finished消息,并将ClientKeyExchange(客户端密钥更改消息)、确认加密算法集及客户端信道验证Finished消息发送到所述服务器S103。
所述服务器接收所述ClientKeyExchange、确认加密算法集及客户端信道验证Finished消息,利用私钥解密并取出PMS,服务器时间戳、服务器随机数及扩展域,利用PMS、RNC及RNS计算MS,并提取所需扩展域数值;生成服务器预主密钥PMS2、服务器主密钥MS2、服务器信道验证Finished消息及下次使用的服务器随机数RNS2,根据本次会话的加密算法对称加密元组{RNS2,PMS2,HmacValue},并保存在包含HMAC摘要签名的ServerKeyExchange中,并将包含的ServerKeyExchange、确认加密算法集、确认传输密钥安全级别及服务器信道验证Finished消息和InitContent初始化消息发送到所述客户端S104。
客户端接收ServerKeyExchange(服务器密钥更改消息)、确认加密算法集、确认传输密钥安全级别及服务器信道验证Finished消息,验证服务器信道验证Finished消息,根据本次会话的加密算法集解密所述ServerKeyExchange,验证所述HMAC摘要签名,利用PMS2、RNC、RNS生成MS2,再通过MS2、RNC、RNS生成会话密钥素材,并将所述RNS2保存在本地缓存中S15。
在上述方法中,如果服务器要求客户端使用证书验证身份,需要向客户端发送CertificateRequest。客户端收到CertificateRequest后,将ClientHello及ServerHello顺序连接,并使用本地私钥签名,并向服务器发送ClientCertificate及包含所述签名的CertificateVerify。
在客户端向服务器发送客户端信道验证Finished消息之前,向服务器发送的信息及服务器传来的信息顺序连接后,使用MS做PRF(伪随机函数Pseudorandom function)签名。
服务器接收到ClientKeyExchange后,如果服务器选择的本次会话的加密算法为传输一次一密,利用MS2与每次请求报文头中的X-SessionNum执行传输的一次一密。客户端接收到ServerKeyExchange后,如果服务器选择的本次会话的加密算法为传输一次一密,利用MS2与每次请求报文头中的X-SessionNum执行传输的一次一密。X-SessionNum的中文含义是用于参与每次会话传输生成不同的传输加密密钥的随机因子,用于实现传输加密密钥的一次一密。
如果服务器接收到ClientCertificate,验证客户端信道验证Finished消息,如果客户端信道验证Finished消息错误,返回失败信息。
如图2所示,本实施例还提供一种基于HTTP的产生会话密钥的系统,该系统包括:ClientHello处理单元201,ServerHello处理单元202,ClientKeyExchange处理单元203,ServerKeyExchange处理单元204及加密验证单元205。
ClientHello处理单元201向服务器发送包含客户端协议版本、客户端时间戳、客户端随机数、会话、支持的加密算法集的ClientHello;
ServerHello处理单元202服务器接收客户端发送的ClientHello,建立会话,存储客户端时间戳、客户端随机数,根据所述支持的算法集选择本次会话的加密算法,并向所述客户端发送包含服务器协议版本号、服务器时间戳、服务器随机数、服务器会话、本次会话指定加密算法、服务器公钥证书的ServerHello;
ClientKeyExchange处理单元203客户端接收所述的ServerHello,根据所述的ServerHello生成ClientKeyExchange、客户端预主密钥PMS、客户端主密钥MS及客户端信道验证Finished消息,并将ClientKeyExchange、确认加密算法集及客户端信道验证Finished消息发送到所述服务器;
ServerKeyExchange处理单元204接收所述ClientKeyExchange、确认加密算法集及客户端信道验证Finished消息,利用私钥解密并取出PMS,服务器时间戳、服务器随机数及扩展域,利用PMS、RNC及RNS计算MS,并提取所需扩展域数值;生成服务器预主密钥PMS2、服务器主密钥MS2、服务器信道验证Finished消息及下次使用的服务器随机数RNS2,根据本次会话的加密算法对称加密元组{RNS2,PMS2},并保存在包含HMAC摘要签名的ServerKeyExchange中,并将包含的ServerKeyExchange、确认加密算法集、确认传输密钥安全级别及服务器信道验证Finished消息发送到所述客户端;
加密验证单元205接收ServerKeyExchange、确认加密算法集、确认传输密钥安全级别及服务器信道验证Finished消息,验证服务器信道验证Finished消息,根据本次会话的加密算法集解密所述ServerKeyExchange,验证所述HMAC摘要签名,利用PMS2、RNC、RNS生成MS2,再通过MS2、RNC、RNS生成会话密钥素材,并将所述RNS2保存在本地缓存中。
客户端和服务器协议的基本流程如下:
客户端需要保存一个1024位RSA公钥证书,作为握手过程中对于服务器提交的公钥证书的认证。在认证服务器身份后,使用服务器公钥证书对于客户端PMS等信息的加密。这种设计允许我们可以随时更换服务器的私钥证书,从而降低服务器私钥流失引起的风险。
客户端在本地建立一个服务器证书缓存。当客户端收到服务器公钥证书后,如果Root CA验证无误,客户端需要以服务器域名作为加密密钥,在本地缓存中保存服务器证书。今后当访问这个服务器时,不再使用Root CA验证服务器证书合法性。如果在协议中,客户端检查到服务器证书更改,再进行Root CA验证。
如果一个会话断开,建立一个新的加密通道需要走完全部握手流程。本发明的加密算法包含RSA+AES+CBC+SHA;其中RSA为1024位,AES为256位。今后可能加入DHE-RSA、EC-DSA。
为尽量减少客户端、服务器交互,我们允许客户端在本地缓存服务器公钥证书以及其他信息,从而可以在后续一定数量的过程中,通过一次交互建立加密通道。
图3为本发明实施例基于HTTP的产生会话密钥的完整方法的信令图,下面结合图3详细说明本发明实施例。如图3所示,该完整流程包括:
1、客户端发送ClientHello到服务器:
生成ClientHello,该消息包括客户端协议版本Client.Version、客户端时间戳ClientHello.Timestamp、客户端随机数ClientHello.Random、会话编号sessionID、支持的算法集CipherSpecs、服务器证书序列号Certificate.SerialNumber(首次连接无证书,或需更新证书时重新走完整流程,将证书缓存清空)。
2服务器收到ClientHello并处理,然后执行ServerHello响应:
1)服务器建立会话编号sessionID,存储ClientHello.Timestamp与ClientHello.Random,根据CipherSpecs的支持加密集合选择本次会话的加密算法集CipherSuite。
2)ServerHello包含服务器协议版本号Server.Version、服务器时间戳ServerHello.Timestamp、服务器随机数ServerHello.Random、服务器会话编号sessionID、本次会话指定的加密算法CipherSuite、服务器公钥证书ServerCertificate。ServerCertificate为X509标准格式DER编码的服务器公钥证书。
3)如要求客户端使用证书验证身份,发送CertificateRequest。
3客户端收到ServerHello并处理,生成ClientKeyExchange等消息:
1)在本地缓存中保存ServerDNS、ServerCertificate、CertificateRequest.Flag(CertificateRequest的消息中将决定是否需要客户端的证书认证)、Certificate.SerialNumber。
2)生成客户端预主密钥PMS,PMS为客户端协议版本号+随机数。使用证书加密元组{PMS,ServerHello.Timestamp,ServerHello.Random,扩展域(最大32字节)}。其中,扩展域用以存放特定的扩展数据,如用户ID等信息。
3)如果服务器发送CertificateRequest(如需要该状态已缓存在客户端中,同时服务器如需要更改状态,需要重新走完整流程来更新,CertificateRequest.Flag),客户端将所有发送和接收到的数据(ClientHello,ServerHello)按顺序连接,使用客户端的私钥签名,在CertificateVerify中发送这个签名。
4)发送ChangeCipherSpec声明切换到加密信道传输。
5)计算客户端主密钥MS,生成信道验证的Finished消息。将Finished之前发出的和接收到消息(不包括Finished本身)的二进制数据,按照顺序连接后,使用PRF为MS签名。
4服务器收到ClientKeyExchange并处理,返回消息,完成信道协商:
使用私钥解密并取出{PMS,ServerHello.Timestamp,ServerHello.Random,扩展域}。使用PMS、(ClientHello.Timestamp+ClientHello.Random)[RNC]、(ServerHello.Timestamp+ServerHello.Random)[RNS]计算MS,并提取需要的扩展域数值。
生成服务器的预主密钥PMS2。使用PMS2、RNC、RNS生成服务器主密钥MS2,在会话中保存MS2作为传输密钥。
如服务器选择CipherSuite为传输一次一密的特性,则使用MS2与每次请求报文头中的X-SessionNum执行传输的一次一密。
生成下次使用的服务器缓存随机数(ServerHello.Timestamp+ServerHello.Random)[RNS2]。根据协商好的对称加密算法,使用MS对称加密元组{RNS2,PMS2},结果以二进制形式保存在消息ServerKeyExchange。其中该消息后有HMAC的摘要签名保障完整性。
如果有ClientCertificate,验证相关信息。验证客户端的Finished信息。如果错误,返回标准失败信息。
生成服务器的Finished,将Finished之前发出的和接收到消息(不包括Finished本身)的二进制数据,按照顺序连接后,使用MS做PRF签名。
回传:(1)ServerKeyExchange,(2)确认加密算法集ChangeCipherSpec,(3)确认传输密钥的安全级别,(4)发送自己的Finished消息。
5客户端收到服务器信息后:
验证服务器的Finished消息。如失败,切断当前连接。
根据协商好的对称加密算法,使用本地保存的MS解密ServerKeyExchange,使用MS对该消息后的HMAC摘要签名执行验证,取出元组{RNS2,PMS2}。使用PMS2、RNC、RNS生成MS2作为会话密钥。在缓存中保存RNS2。
如CipherSuite为传输一次一密的特性,则使用MS2与每次请求或响应报文头中的X-SessionNum执行传输的一次一密。
实施例二
如图4所示,本发明提供一种基于HTTP的产生会话密钥的方法,该方法包括:
客户端利用服务器域名从本地缓存中获得元组{ServerDNS,ServerCertificate,RNS2,CertificateRequest.flag};生成PMS、客户端验证信道Finished消息及包含客户端协议版本、客户端时间戳、客户端随机数、会话、支持的加密算法集及服务器证书序列号的ClientHello;以RNS2作为RNS;加密包含在ClientKeyExchange中的元组{PMS,服务器时间戳,服务器随机数,扩展域},向服务器发送ClientHello、ClientKeyExchange,ChangeCipherSpe及客户端验证信道Finished信息S401。
所述服务器建立会话,根据支持的加密集合选择本次会话的加密算法,根据服务器证书序列号验证证书有效性,如果服务器判断证书有效,解密元组{PMS,服务器时间戳,服务器随机数及扩展域},通过PMS、RNC、RNS计算客户端主密钥MS,验证客户端发送的Finished信息;生成下次使用的服务器随机数RNS2’、服务器预主密钥PMS2,MS2及包含服务器时间戳协议版本、服务器时间戳,服务器随机数、会话、本次会话的加密算法的,根据本次会话的加密算法,对称加密元组{RNS2,PMS2,HMacvalue},并封装在ServerKeyExchange中;向所述客户端发送ServerHello,ServerKeyExchange,ChangeCipherSpec,服务器验证信道Finished与InitContent初始化信息S402。
所述客户端接收ServerKeyExchange,ChangeCipherSpec,服务器验证信道Finished,验证服务器验证信道Finished,解密ServerKeyExchange,验证HMAC摘要签名,获取元组{RNS2,PMS2,HMacvalue},验证hmac摘要签名,缓存RNS2作为下次简化连接的RNS,利用PMS2、RNC、RNS生成MS2,再通过MS2、RNC、RNS生成会话密钥素材S403。
在上述EMP信道简化加密方法中,若服务器要求CertificateRequest,客户端将元组{ServerDNS,ServerCertificate,RNS2,CertificateRequest.flag},PMS、客户端验证信道Finished消息,ClientHello,RNS2及ClientKeyExchange中的数据连接为一个字符串,利用客户端私钥签名,并在CertificateVerify中将所述签名的数据发送给服务器。
本实施例中,如果服务器判断证书无效,向客户端返回错误报文,使客户端清空缓存证书。
服务器接收到ClientKeyExchange后,如果服务器选择的本次会话的加密算法为传输一次一密,利用MS2与每次请求报文头中的X-SessionNum执行传输的一次一密。客户端接收到ServerKeyExchange后,如果服务器选择的本次会话的加密算法为传输一次一密,利用MS2与每次请求报文头中的X-SessionNum执行传输的一次一密。
如图5所示,本实施例提供一种EMP信道简化加密系统,该系统包括:简化ClientHello处理单元501,简化ServerHello处理单元502及简化加密验证单元503。
简化ClientHello处理单元501利用服务器域名从本地缓存中获得元组{ServerDNS,ServerCertificate,RNS2,CertificateRequest.flag};生成PMS、客户端验证信道Finished消息及包含客户端协议版本、客户端时间戳、客户端随机数、会话、支持的加密算法集及服务器证书序列号的ClientHello;以RNS2作为RNS;加密包含在ClientKeyExchange中的元组{PMS,服务器时间戳,服务器随机数,扩展域},向服务器发送ClientHello、ClientKeyExchange,ChangeCipherSpec及客户端验证信道Finished与InitContent;
简化ServerHello处理单元502建立会话,根据支持的加密集合选择本次会话的加密算法,根据服务器证书序列号验证证书有效性,如果服务器判断证书有效,解密元组{PMS,服务器时间戳,服务器随机数及扩展域},通过PMS、RNC、RNS计算客户端主密钥MS,验证客户端发送的Finished信息;生成下次使用的服务器随机数RNS2、服务器预主密钥PMS2,MS2及包含服务器时间戳协议版本、服务器时间戳,服务器随机数、会话、本次会话的加密算法的,根据本次会话的加密算法,对称加密元组{RNS2,PMS2,HMacvalue},并封装在包含HMAC摘要签名的ServerKeyExchange中;向所述客户端发送ServerHello,ServerKeyExchange,ChangeCipherSpec,发送服务器验证信道Finished;
简化加密验证单元503接收ServerKeyExchange,ChangeCipherSpec,服务器验证信道Finished,验证服务器验证信道Finished,解密ServerKeyExchange,获取元组{RNS2,PMS2,HMacValue},验证HMAC摘要签名,缓存RNS2作为下次简化连接的RNS,利用PMS2、RNC、RNS生成MS2作为会话密钥。
当客户端和服务器建立首次连接后(即经过图3所示的流程之后),可以使用本地缓存简化连接流程。
图6为本发明实施例EMP信道简化加密方法的流程图,在简化流程中,客户端假设第一次和服务器间协商的协议版本号、加密算法、服务器密钥等均不变。如果上述任何假设变化,服务器需要返回一个错误信息,告知客户端重新启动完整的协议流程。如图6所示,EMP信道简化加密方法包括:
1客户端生成请求,其中包含消息:ClientHello,ClientCertificate(*),ClientKeyExchange,CertificateVerify(*),ChangeCipherSpec,Finished。其中,(*)为选项,只需在服务器要求客户端证书验证时包含:
1)客户端使用服务器域名从缓存中取出元组{ServerDNS,ServerCertificate(缓存中的服务器公钥证书),RNS2(缓存中的服务器随机数),CertificateRequest.flag(缓存中的CertificateRequest状态,Certificate.SerialNumber(缓存中的证书序列号)}。
2)简化版的ClientHello生成,该消息包括Client.Version、ClientHello.Timestamp、ClientHello.Random、sessionID、CipherSpecs、Certificate.SerialNumber。
3)使用RNS2作为当前的RNS,即作为ServerHello.Random。
4)生成PMS,通过ServerCertificate加密元组{PMS,ServerHello.Timestamp,ServerHello.Random,扩展域(最大32字节)},以二进制形式包含在ClientKeyExchange中。
5)如果服务器要求CertificateRequest,客户端将上述1-4中的所有消息数据连接为一个字符串,使用客户端私钥签名,包含在CertificateVerify消息中。
6)发送ChangeCipherSpe消息。
7)使用PMS、RNC、RNS计算MS,生成信道验证的Finished消息。
2服务器收到上述信息后处理,返回消息完成信道协商:包含ServerKeyExchange、ServerHello、ChangeCipherSpec、Finished:
1)建立session ID,存储RNC,根据CipherSpecs支持的加密集合选择本次会话的加密算法CipherSuite,根据Certificate.SerialNumber初步验证证书有效性。如果服务器判断证书失效,则应返回一个标准的Error报文,客户端清空缓存的证书,并重新走完整流程下载更新证书。
2)解密元组{PMS,ServerHelloTimestamp,ServerHello.Random,扩展域},通过PMS、RNC、RNS计算MS。
3)验证客户端发送的Finished信息。
4)生成下次使用的RNS2,生成服务器预主密钥PMS2。根据协商好的对称加密算法,对RNS2,PMS2生成HMacValue保障完整性,使用MS对称加密元组{RNS2,PMS2,HMacValue},封装在消息ServerKeyExchange中。其中该消息后有HMAC的摘要签名保障完整性。使用PMS2、RNC、RNS计算生成MS2,通过MS2、RNC、RNS生成会话密钥素材。
5)如服务器选择CipherSuite为传输一次一密的特性,则使用MS2与每次请求报文头中的X-SessionNum执行传输的一次一密。
6)简化版的ServerHello生成,包含Server.Version、ServerHello.Timestamp、ServerHello.Random(取自ClientKeyExchange中)、sessionID、CipherSuite。
7)发送消息:ServerKeyExchange,发送切换到加密信道消息ChangeCipherSpec,发送服务器的Finished。
3客户端收到上述信息后:
使用本地保存的MS解密ServerKeyExchange,使用MS对该消息后的HMAC摘要签名执行验证,取出元组{RNS2,PMS2,HMacValue},使用MS2对该消息后的HMacValue摘要签名执行验证。缓存RNS2作为下次简化连接的RNS。使用PMS2、RNC、RNS生成MS2,使用MS2验证服务器Finished消息。如失败,切断当前连接。再通过MS2、RNC、RNS生成会话密钥素材。
如果CipherSuite为传输一次一密的特性,则使用MS2与每次请求报文头中的X-SessionNum执行传输的一次一密。
信道保密分为默认传输加密及高级传输加密。
对于默认传输加密,服务器通过算法集的协商选择一次会话一密,加密解密的传输密钥在当前会话期间,密钥的值一直不变。对于高级传输加密,服务器通过算法集的协商选择一次一密,报文的加密密钥一直动态随机变化。一把密钥的生命周期只用于一次HTTP请求或响应的加密,使用后立即销毁并生成新的密钥。客户端写密钥与服务器写密钥均不同,因此任何一次HTTP请求或响应都不会出现重复的密钥,从而拥有高度安全的密钥隔离性。与一次会话一密的区别是,这种方式需要后台服务器每次请求和响应都通过PRF来计算密钥,而计算密钥的方式与一次会话一密类似,只是随机数发生器中需要加入一个HTTP报文头中的随机数。
请求传输密钥MS_Request由以下公式计算:PRF(MS2,labels,X-SessionNum+RNC+RNS)。响应传输密钥MS_Reponse由以下公式计算:PRF(MS2,labels,X-SessionNum+RNC+RNS)。X-SessionNum为一个48字节的随机数,保障动态密钥在2的8*48次方的概率组合内随机变化。
在加密信道建立后,出于性能考虑,客户端可能需要通过明文传输信息。例如,移动金融应用中,金融资讯等内容由于不包含用户信息,在用户登陆后可以通过明文传输。因此,如果有人改动了运营商的网关或路由器等软件,就能够篡改这些明文,从而诱使用户提交个人信息等资料。
以下办法可以解决这个问题:
首先,我们可以要求在客户端加载时,即和后台建立加密信道,得到当前MS2。对于所有明文传输的信息,服务器通过HTTP报文头X-Signature加入20字节的输出签名,HMAC_SHA1(X-Signature,MS2,HTTP Body)。客户端接收后,通过签名验证收到的明文(HTTP Body),从而保证明文传输的可靠性。
其次,如果需要在没有建立加密信道时进行明文传输,我们需要明确告知用户,哪些动作是通过安全信道完成的,哪些是通过明文信道完成的;这种做法和浏览器在加密信道时提醒用户是相同的;例如,可以通过客户端屏幕顶部的一些标记和状态提示用户。在加密信道建立后,客户端可以更改这种状态,提示用户已经进入完全保密安全的加密信道传输。
本发明实施例的有益效果在于,本发明能够在基于HTTP通信的任意业务流程中随时建立加密信道,实现了信道加密与身份认证的分离。
以上所述的具体实施例,对本实用新型的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本实用新型的具体实施例而已,并不用于限定本实用新型的保护范围,凡在本实用新型的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本实用新型的保护范围之内。