http://developers.sun.com.cn/blog/yutoujava/entry/200704132
桌面SSO 的实现
从WEB-SSO 的概念延伸开,我们可以把SSO 的技术拓展到整个桌面的应用,不仅仅局限在浏览器。SSO 的概念和原则都没有改变,只需要再做一点点的工作,就可以完成桌面 SSO 的应用。
桌面SSO 和WEB-SSO 一样,关键的技术也在于如何在用户登录过后保存登录的凭据。在WEB-SSO 中,登录的凭据是靠浏览器的cookie 机制来完成的;在桌面应用中,可以将登录的凭证保存到任何地方,只要所有SSO 的桌面应用都共享这个凭证。
从网站可以下载一个简单的桌面SSO 的样例(http://gceclub.sun.com.cn/wangyu/desktop-sso/desktopsso.zip) 和全部源码(http://211.151.94.21/blog/yutoujava/resource/desktopsso_src.zip ),虽然简单,但是它具有桌面SSO 大多数的功能,稍微加以扩充就可以成为自己的解决方案。
6.1 桌面样例的部署
-
运行此桌面SSO 需要三个前提条件:
a) WEB-SSO 的身份认证应用应该正在运行,因为我们在桌面SSO 当中需要用到统一的认证服务
b) 当前桌面需要运行Mozilla 或Netscape 浏览器,因为我们将ticket 保存到mozilla 的cookie 文件中
c) 必须在JDK1.4 以上运行。(WEB-SSO 需要JDK1.5 以上) -
解开desktopsso.zip 文件,里面有两个目录bin 和lib 。
-
bin 目录下有一些脚本文件和配置文件,其中config.properties 包含了三个需要配置的参数:
a) SSOServiceURL 要指向WebSSO 部署的身份认证的URL
b) SSOLoginPage 要指向WebSSO 部署的身份认证的登录页面URL
c) cookiefilepath 要指向当前用户的mozilla 所存放cookie 的文件 -
在bin 目录下还有一个login.conf 是用来配置JAAS 登录模块,本样例提供了两个,读者可以任意选择其中一个(也可以都选),再重新运行程序,查看登录认证的变化
-
在bin 下的运行脚本可能需要作相应的修改
a) 如果是在unix 下,各个jar 文件需要用“:” 来隔开,而不是“;”
b) java 运行程序需要放置在当前运行的路径下,否则需要加上java 的路径全名。
6.2 桌面样例的运行
样例程序包含三个简单的Java 控制台程序,这三个程序单独运行都需要登录。如果运行第一个命叫“GameSystem” 的程序,提示需要输入用户名和密码:
效验成功以后,便会显示当前登录的用户的基本信息等等。
这时候再运行第二个桌面Java 应用(mailSystem )的时候,就不需要再登录了,直接就显示出来刚才登录的用户。
第三个应用是logout ,运行它之后,用户便退出系统。再访问的时候,又需要重新登录了。请读者再制裁执行完logout 之后,重新验证一下前两个应用的SSO :先运行第二个应用,再运行第一个,会看到相同的效果。
我们的样例并没有在这里停步,事实上,本样例不仅能够和在几个Java 应用之间SSO ,还能和浏览器进行SSO ,也就是将浏览器也当成是桌面的一部分。这对一些行业有着不小的吸引力。
这时候再打开Mozilla 浏览器,访问以前提到的那两个WEB 应用,会发现只要桌面应用如果登录过,Web 应用就不用再登录了,而且能显示刚才登录的用户的信息。读者可以在几个桌面和Web 应用之间进行登录和logout 的试验,看看它们之间的SSO 。
6.3 桌面样例的源码分析
桌面SSO 的样例使用了JAAS (要了解JAAS 的详细的信息请参考http://java.sun.com/products/jaas )。JAAS 是对PAM (Pluggable Authentication Module )的Java 实现,来完成 Java 应用可插拔的安全认证模块。使用JAAS 作为Java 应用的安全认证模块有很多好处,最主要的是不需要修改源代码就可以更换认证方式。例如原有的Java 应用如果使用JAAS 的认证,如果需要应用SSO ,只需要修改JAAS 的配置文件就行了。现在在流行的J2EE 和其他 Java 的产品中,用户的身份认证都是通过JAAS 来完成的。在样例中,我们就展示了这个功能。请看配置文件login.conf
|
当我们注解掉第二个模块的时候,只有第一个模块起作用。在这个模块的作用下,只有
test
用户(密码是
12345
)才能登录。
当我们注解掉第一个模块的时候,只有第二个模块起作用,桌面
SSO
才会起作用。
所有的Java 桌面样例程序都是标准JAAS 应用,熟悉JAAS 的程序员会很快了解。JAAS 中主要的是登录模块(LoginModule )。下面是SSO 登录模块的源码:
|
在
config.properties
的文件中,我们配置了它们的值:
|
SSOServiceURL
和
SSOLoginPage
成员变量指向了在
Web-SSO
中用过的身份认证模块:
SSOAuth
,这就说明在桌面系统中我们试图和
Web
应用共用一个认证服务。而
cookiefilepath
成员变量则泄露了一个“天机”:我们使用了
Mozilla
浏览器的
cookie
文件来保存登录的凭证。换句话说,和
Mozilla
共用了一个保存登录凭证的机制。之所以用
Mozilla
是应为它的
Cookie
文件格式简单,很容易编程访问和修改任意的
Cookie
值。(我试图解析
Internet Explorer
的
cookie
文件但没有成功。)
下面是登录模块DesktopSSOLoginModule
的主体:login() 方法。逻辑也是非常简单:先用Cookie 来登陆,如果成功,则直接就进入系统,否则需要用户输入用户名和密码来登录系统。
|
下面是Cookielogin()
方法的实体,它的逻辑是: 先从
Cookie
文件中获得相应的
Cookie
值,通过身份效验服务效验
Cookie
的有效性。如果
cookie
有效就算登录成功;如果不成功或
Cookie
不存在,用
cookie
登录就算失败。
|
用用户名和密码登录的方法要复杂一些,通过Callback 的机制和屏幕输入输出进行信息交互,完成用户登录信息的获取;获取信息以后通过userAuth 方法来调用远端SSOAuth 的服务来判定当前登录的有效性。
|
CookieAuth 和userAuth 方法都是利用apahce 的httpclient 工具包和远程的SSOAuth 进行http 连接,获取服务。
|
还有一个地方需要补充说明的是,在本样例中,用户名和密码的输入都会在屏幕上显示明文。如果希望用掩码形式来显示密码,以提高安全性,请参考:http://java.sun.com/developer/technicalArticles/Security/pwordmask/
7 真正安全的全方位SSO 解决方案:Kerberos
我们的样例程序(桌面SSO 和WEB-SSO )都有一个共性:要想将一个应用集成到我们的SSO 解决方案中,或多或少的需要修改应用程序。Web 应用需要配置一个我们预制的filter ;桌面应用需要加上我们桌面SSO 的JAAS 模块(至少要修改JAAS 的配置文件)。可是有很多程序是没有源代码和无法修改的,例如常用的远程通讯程序telnet 和ftp 等等一些操作系统自己带的常用的应用程序。这些程序是很难修改加入到我们的SSO 的解决方案中。
事实上有一种全方位的SSO 解决方案能够解决这些问题,这就是Kerberos 协议(RFC 1510 )。Kerberos 是网络安全应用标准(http://web.mit.edu/kerberos/ ) ,由MIT 学校发明,被主流的操作系统所采用。在采用kerberos 的平台中,登录和认证是由操作系统本身来维护,认证的凭证也由操作系统来保存,这样整个桌面都可以处于同一个SSO 的系统保护中。操作系统中的各个应用(如ftp,telnet )只需要通过配置就能加入到SSO 中。另外使用Kerberos 最大的好处在于它的安全性。通过密钥算法的保证和密钥中心的建立,可以做到用户的密码根本不需要在网络中传输,而传输的信息也会十分的安全。
目前支持Kerberos 的操作系统包括Solaris, windows,Linux 等等主流的平台。只不过要搭建一个Kerberos 的环境比较复杂,KDC (密钥分发中心)的建立也需要相当的步骤。Kerberos 拥有非常成熟的API ,包括Java 的API 。使用Java Generic Security Services(GSS) API 并且使用JAAS 中对Kerberos 的支持(详细信息请参见Sun 的Java&Kerberos 教程http://java.sun.com/ j2se/1.5.0/docs/guide/security/jgss/tutorials/index.html ),要将我们这个样例改造成对Kerberos 的支持也是不难的。值得一提的是在JDK6.0 (http://www.java.net/download/jdk6 )当中直接就包含了对GSS 的支持,不需要单独下载GSS 的包。
8 总结
本文的主要目的是阐述SSO 的基本原理,并提供了一种实现的方式。通过对源代码的分析来掌握开发SSO 服务的技术要点和充分理解SSO 的应用范围。但是,本文仅仅说明了身份认证的服务,而另外一个和身份认证密不可分的服务---- 权限效验,却没有提到。要开发出真正的SSO 的产品,在功能上、性能上和安全上都必须有更加完备的考虑。
附件:
作者简介
王昱是Sun 中国工程研究院的Java 工程师,现在的主要负责全球合作伙伴的技术支持。作为一名Java 资深工程师和架构师,王昱在Java 的很多领域都有多年的造诣,特别是在Java 虚拟机、J2EE 技术( 包括EJB, JSP/Servlet, JMS 和Web services 等技术) 、集群技术和Java 应用性能调优上有着较为丰富的经验。曾经多次在重要的Java 会议发表演讲,并在国际著名的Java 技术站点发表文章。
资源链接
-
OpenSSO 的网站: https://opensso.dev.java.net
-
在java应用中使用掩码的密码提示: http://java.sun.com/developer/technicalArticles/Security/pwordmask/
-
Kerberos的资源网站: http://web.mit.edu/kerberos/
-
Sun的Java&Kerberos教程: http://java.sun.com/j2se/1.5.0/docs/guide/security/jgss/tutorials/index.html
-
Apache社区提供的HttpClient工具包网址: http://jakarta.apache.org/commons/index.html