SSL是TCP/IP环境上的标准的安全加密传输协议。SSL的全称是安全的Socket层,它具有与Socket类似的客户端/服务器体制。常见的https即http+ssl,从安全的角度看,https的安全技术就是SSL加密。从建立服务的角度,配置一个web服务器提供https服务,其关键就是获取和设置所需的SSL服务器证书。SSL基本的安全约束是对服务器的验证,这一安全约束被用来防止钓鱼网站仿冒合法的网站,从而防止客户端向假的服务器,如仿冒电子邮件或者网银外观的网站,提供登录口令等敏感数据。注册一个与知名公司相似的域名、仿造一模一样的页面是很容易的,如app1e.com、taobao.aution.com这样的李鬼域名,很容易蒙过一不留神的上网者。由于从VeriSign等主要的数字证书服务商那里获取与仿冒域名一致的数字证书则几乎是一件不可能的事情,通过浏览器端内置的强制服务器证书验证,用户只需关注浏览器的https锁头标志即可防止陷入这些仿冒网站的陷阱。另一方面,SSL的加密是端到端的,这意味着从用户端直到服务器端的任何中间环节都无法查看SSL通讯的内容。只要客户端应用程序(如浏览器)与合法服务器成功建立了SSL连接,wifi无线信号、路由器、运营商等通信数据流过的环节上的任何地方的任何人,都无法解密查看通信内容。这一安全能力也是Google在全面使用https(即SSL加密通信)后,被整个墙掉的原因之一。这里我们可以推测到,即使是拥有巨大资源的墙,在面对SSL时,也不能对通信内容进行较为全面的分析过滤,最后不得不把Google整个墙掉了事。
SSL支持可选的客户端验证,在面向特定用户的高安全性应用中,如网银、第三方支付等,服务器也需要验证客户端的身份。基于用户数字证书的SSL客户端验证,能够提供比口令更强的安全性。这一点,在央行2015支付规范中得到了认可。规范明确了,第三方支付机构如果采用基于数字证书的客户端验证,不受单日最多5000元的限制。
SSL利用公钥技术,无须在通信双方预先共享任何秘密密钥或者口令,就能够在彼此之间建立可信赖的安全连接。SSL对网络没有额外的要求,只要通信双方能够建立普通的TCP连接,它们就能够在这个普通连接之上建立安全的SSL加密连接。这一点与IPSec恰恰相反,IPSec把加密工作留给了网络,对于应用程序是透明的。显然,目前的互联网没有对公众提供IPSec服务。对于互联网应用开发者,SSL是适用的网络通信数据加密手段。选用SSL加密时,证书和密钥管理,如获取和维护数字证书等,需要应用的设计者予以考虑。在拥有良好的PKI公钥基础设施的环境中,这个问题会包在PKI身上解决。反之,应用开发者需要规划应用级的数字证书管理机制。在这种情形下,证书管理不会很复杂,但这仍然是开发者使用SSL的过程中,需要理解和处理的重要问题之一。现在的应用APP越来越多地把Web服务作为用户终端和服务器,服务器与服务器之间交互的方式。这里我们必须注意,这些更高层的网络服务交付机制,并没有发明新的网络通信安全机制,它们会直接使用SSL之类的网络传输加密协议所提供的安全能力。安全使用这些更高级的应用服务,要处理的证书管理和密钥管理、安全特性就是其加密通信机制的相关工作。
SSL的所面临安全威胁主要是中间人攻击。由于实施中间人攻击的攻击者必须让攻击者掌控的CA根证书进入客户端的受信任CA证书存储库,这一操作一般会需要管理员账户的人工许可,适当的安全教育能够缓解这一威胁。
SSL协议本身在客户端和服务器端有着较为复杂的交互和状态迁移过程,所幸,这一部分的工作已经在支持SSL的各种加密开发库中得到了很好的实现。下面,我们将讨论在windows、android、linux等不同平台环境下的ssl加密编程问题。包括的主要内容,一是所采用的加密库函数的结构和使用方法,二是所需的数字证书的获取与管理。