A-A+

公钥体系下的安全通信知识教程

2016年01月21日 站长资讯 暂无评论

网络是一个开放的世界,服务器可以被不法节点冒名顶替,传输的数据可以被整个通路上的任何一个节点监听。要保证客户机和服务器在网络中通信的安全,客户机首先要验明服务器正身,然后还要加密要传输的数据,该数据到达服务器后再进行解密。整个过程在X.509规范的PKI(公钥体系,public key infrastructure)下得到完成,数据的加密解密由SSL(安全套接字层,Secure Socket Layer)或TLS(传输层安全,Transport Layer Security)实现。当客户机需要与某个服务器建立通信连接时,发生SSL握手.

客户机通过网络发送请求安全会话的消息(通常请求是HTTPS协议的形式)。服务器通过发送其X.509证书(包括公钥)进行响应。

客户机验证服务器证书的有效性,并检验该证书是否由可信任的CA(授权机构,Certification Authority)所签发。

当证书有效,客户机生成一次性的密钥,并用服务器的公钥对该密钥进行加密,然后,客户机把加密的会话密钥发送给服务器。

服务器用其私钥对其次进行解密,然后得到本次通讯的会话密钥。

客户机和服务器用其约定的会话密钥开始数据通信,直到一次会话结束。

话分两头细说,客户机和服务器。

客户机

通常服务器提供给客户机的证书都附有证书链,它是由一系列CA证书发出的证书序列,最终以根CA证书结束。客户机预先存储了一组可信任的根CA证书,服务器证书链的终结根CA证书若在其列,客户机即可确认该服务器可信任。在Windows查阅PC中存储的根CA证书,可以在命令行中键入.

C:\> certmgr.msc

Java存储其根CA证书在其密钥库(keystore)$JAVA_HOME/jre/lib/security/cacerts中,keytool是管理密钥库的实用工具,密钥库的默认密码通常为changeit:

$ keytool -list -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit

客户机查询服务器的证书、测试能否用/etc/ssl/certs目录下存储的根CA证书与服务器成功完成SSL握手,可以执行如下OpenSSL的命令 http://www.luyouqiwang.com/xiaodu/

$ openssl s_client -showcerts -connect foo.server.com:443

$ openssl s_client -CApath /etc/ssl/certs -connect foo.server.com:443

服务器

基于Java技术的Web服务器通常以服务导向架构为蓝本,通过HTTPS协议将应用程序功能作为服务发送给客户机。通信传输协议的SSL握手过程中,服务器首先将其X.509证书发送给客户机,然后由客户机依据其存储的根CA证书验证该证书的真实性。Java内部维护一个keystore(密钥库),用以存储所有附有证书链的证书。

标签:

给我留言