在WebLogic 8.1最新的 SP4版本中,最引人注目的要算是在安全方面,提供了用于和Microsoft Windows客户端进行Single Sign-On的Single Pass Negotiate Identity Assertion Provider。通过该Provider可以轻松完成从前认为技术难度很高的和Windows客户端的Single Sign-On。

  这个简单,低成本的SSO解决方案相信对大多数的企业应用来说更具吸引力:

  1. 用户只需要开机时登录Windows域,就可以以登录用户的身份访问全部的基于WebLogic Server,IIS等的应用系统;
  2. 在后续的访问中,用户将不需要重新输入口令,这样使得口令不会以明文形式在内网传递,来自内网的安全威胁被降低了(企业的主要网络安全威胁来自内网),如果在内网启用SSL则成本太高;
  3. 只需要一次验证,因此不论是AD还是其他的存储用户信息的关系数据库,LDAP等,验证的开销降低了;
  4. 极大改善用户体验,提高了IT服务品质,也提高了用户的工作效率

  在成本方面,对比一些SSO产品,简单的说:

  1. 不需要添置新的硬件,不需要购买新的软件License,并且可以充分利用大多数企业中非常成熟的MS AD资源;

    * 而一些SSO产品,不仅需要添加新硬件,购买License,而且成熟的部署往往涉及到Load Balance,Failover等,成本骤然升高

  2. 不需要专门的运营维护人员,不需要专门的技术支持人员对服务器进行管理,现有的IT团队即可胜任,成本被进一步降低;
  3. 安装配置简单,不需要安装独立的软件,操作人员不需要专门的知识背景;
    * 对比一些SSO产品超厚的文档手册,以及一次又一次的培训等

  因此这使得大多数的SSO产品厂商面临了更大的挑战。在应用安全技术突飞猛进,SSO市场竞争激烈的今天,用户将有越来越多的自由去选择适合自己的SSO解决方案,用户将最终获益。所以我们要感谢那些为今天这些技术的发展做出贡献的人们。

  在我拿到WebLogic 8.1 SP4后,完成了WebLogic Web Server和Windows 的Single Sign-On的配置,最终效果比较理想,整个配置过程也比较简单。但是其间也遇到了一些问题,加上Bea在网站上提供配置文档(http://e-docs.bea.com/wls/docs81/secmanage/sso.html)很多地方说得并不清楚,甚至还有一些错误,所以希望通过本文更好的帮助大家完成SSO的配置。

1 准备
WebLogic Single Sign-On的主角是SPNEGO(Simple and Protected GSS-API Negotiation Mechanism)。所谓的Negotiate就是双方通过一定的协商,确定最终使用的认证协议。因此通过SPNEGO,双方可以使用Kerberos,也可以使用NTLM等安全协议来完成双方的认证。所谓的GSS(http://www.ietf.org/rfc/rfc1508.txt )就是Generic Security Service API,SPNEGO可以说是其表现形式,主要目的是提供通用的安全服务,保证应用在不同环境中的可移植性。

  由于SPNEGO和Kerberos的紧密关系,因此我们更多情况下是看到SPNEGO/Kerberos这样的组合。

  WebLogic的SPNEGO Identity Assertor仅支持Kerberos Token。通过下图我们可以明白,SPNEGO Token和Kerberos Token关系,以及SPNEGO Token对底层认证数据的封装:

(from http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnsecure/html/http-sso-2.asp )
IE将Kerberos Token(Service Ticket以及一些认证必须的信息),使用SPNEGO Token封装,然后发送给WebLogic Web Server。Web Server通过SPNEGO Token中定义的协议类型确定使用的是Kerberos,然后从SPNEGO Token中解析中Kerberos Token进而完成后续的验证。

  SPNEGO Token使用二进制的ASN.1编码(LDAP协议中的LDAP Message即使用ASN.1编码),编码后的二进制数据通过Base64编码为可见字符后传送。具体可以参考http://www.faqs.org/rfcs/rfc2478.html。

  下面我们简单了解一下SPNEGO/Kerberos的验证过程:

  1. 用户使用在AD中创建的用户帐号和口令登录Windows 2000 Domain;
  2. 用户向一个Web Server发送请求访问一个受限的资源;
  3. 如果用户未认证,Web Server将返回HTTP Code 401 Unauthorized以及HTTP Header WWW-Authenticate: Negotiate要求客户端提供认证信息;
  4. IE根据配置的SPN(后面将介绍)获得向KDC请求的Service Ticket或者其他一些凭证;
  5. IE使用这些信息封装成Negotiate Token发送给Web Server
  6. Web Server使用事先准备好的keytab验证IE提交的认证信息,或者将Kerberos Token中的信息提交到KDC验证;
  7. WebLogic Web Server验证成功后装配相应的Subject,然后为此用户起一个Session,用户登录成功

  实际的验证过程是比较复杂的,读者可以参考:http://www.microsoft.com/technet/prodtechnol/windows2000serv/maintain/security/kerberos.mspx

2 环境
接下来,我们将以一个具体的环境为例进行说明。我们假设有下面的部署逻辑:

服务器端:
* Windows 2000 Advance Server (Active Directory)
* 域:SSO.COM
* 机器域名:AD-SERVER.SSO.COM
* RedHat Linux 7.2
* 主机名:wls

 * WebLogic Server 8.1 SP4 (一定要是SP4)

客户端机:
* Windows 2000 Professional
* IE 6.0

注意:
* 浏览器IE6.0和5.0以及5.5等在配置上会有不同
* 检查Windows 2000 Advance Server是否已经安装了Setspn.exe,否则从该链接中获取并安装。
http://www.microsoft.com/windows2000/techinfo/reskit/tools/existing/setspn-o.asp
* 保证Windows 2000 Advance Server中存在Ktpass.exe,你可以在C:Program FilesSupport Tools下找到它,否则需要从Windows2000 AD Server安装盘中获取。
* Kerberos实现对大小写敏感,因此配置中我们一律使用大写的域名
* 默认情况下Windows2000 Ad Server跟运行weblogic 的RedHat Linux两个主机间的时间相差不能超过5分钟(Kerberos协议对时间是敏感的),否则验证会失败。根据实际情况我们可以缩短这个时间,获得更好的安全性。

3 配置过程
准备工作都完成后,我们可以开始具体的配置工作了。

  1. 在Windows 2000 Advance Server上的配置
    (注意:以下的操作使用Administrator或者同等权限的用户操作)

    在Windows2000 Advance Server配置了Active Directory,同时将其作为DNS服务器。Windows2000 Ad Server将在每个Domain Controler上面启用KDC(Key Distribution Center),KDC包括两部分,分别是Authentication Service以及Ticket Granting Service。具体我们就不多说了,总之大家明白一旦配置好 Windows Domain Controller(通过AD建了一个Domain)这些就已经存在了并能正常工作,在Windows上除非有特殊要求,否则我们不需要多于的配置,或 者启用KDC之类的操作。

    * 在DNS中为WebLogic Server所在主机配置DNS记录。

    DNS Name:wls.SSO.COM

    *在AD(域SSO.COM)中为WebLogic Server创建用户帐号

    帐号:wls
    注意,在创建用户帐号时,不能选择用户第一次登录时需要修改口令的选项。而且需要使用默认的DES加密类型,这个不要修改,其他类型不被WebLogic支持。

    以及测试用户帐号:TESTUSER

    *使用Setspn.exe为用户wls创建一个Service Principal Name

    该SPN将作为用户(wls)属性存放,IE将根据它来判断访问的是哪一个Service,进而从KDC请求该Service的Ticket。其中HTTP是服务类型,HOST可以代表全部类型,我们这里指定为HTTP。

    并且如果一个主机上,开了多个同样的服务,那么可以通过设置port来区分,具体参考http://www.microsoft.com/resources/documentation/WindowsServ/2003/all/techref/en-us/Default.asp?url=/Resources/Documentation/windowsserv/2003/all/techref/en-us/W2K3TR_adspn_how.asp 由于我这里只有一个WebLogic Server,所以没有指定。

    下面是配置示例:
    C:Program FilesResource Kit>setspn -A HTTP/wls.SSO.COM wls
    Registering ServicePrincipalNames for CN=wls,CN=Users,DC=SSO,DC=com 
    HTTP/wls.SSO.COM
    Updated object

    完成后可以通过命令检查:
    C:Program FilesResource Kit>setspn -L wls
    Registered ServicePrincipalNames for CN=wls,CN=Users,DC=SSO,DC=com:
    HTTP/wls
    HTTP/wls.SSO.COM

    C:Program FilesResource Kit>

    *创建Kerberos Service Principal,并映射到wls用户
    C:Program FilesResource Kit>ktpass -princ http/wls .COM -pass *** -mapus
    er wls -out c: empwls.HTTP.keytab
    Successfully mapped http/wls to wls.
    Key created.
    Output keytab to c: empwls.HTTP.keytab

    Keytab version: 0x502
    keysize 43 http/wls.COM ptype 1 (KRB5_NT_PRINCIPAL) vno 1 etype 0x1 (DES-CBC-CRC) keylength 8 (0xa7c7e6ab9767fb37)
    Account has been set for DES-only encryption.

    WebLogic Web Server就是Kerberos Service,这里通过-princ指定了生成的Service Principal(kerberos 5格式:name/instance),它将代表一个WebLogic Web Server实体。这里是http/wls.COM(域名大写),它非常重要,Sun Krb5LoginModule(JDK1.4中提供)将通过它以及keytab对客户端提交的请求进行验证。它将配置在JAAS LoginModule Config Entry中。-pass参数指定了用户wls的口令,如果你前面选择了用户第一次登录必须修改口令,这里就惨了。

    Account has been set for DES-only encryption.这个信息也比较重要,如果没有DES-only,你的WebLogic认证可能会失败。

    上面的命令成功后将在磁盘上生成一个wls.HTTP.keytab文件,该文件非常重要,必须妥善保管,除了指定用户外,禁止任何其他人访问。

  2. 在RedHat上的配置
    *将文件wls.HTTP.keytab拷贝到Linux指定目录下
    如果是在真实环境中,这个拷贝过程必须非常安全。我建议使用启动WebLogic的Linux用户身份通过sftp将文件拷贝到启动WebLogic的目录下,方便我们后面的配置。

    拷贝完成后,立即删除Windows机器上的原文件。同时修改该文件属性为只有属主用户可读(属主用户为启动WebLogic的Linux用户)。可以使用如下命令修改文件访问属性:

    600 wls.HTTP.keytab
    502br> 
    注意:如果你拥有多个keytab,那么使用ktutil合并这些keytab到一个 keytab文件中。默认安装的RedHat中似乎没有安装krb5-workstation这个RPM包(工具ktutil包含该RPM内),如果这 样,需要下载RPM包进行安装,安装完成后/usr/kerberos/目录下会有我们需要的工具,大家可以通过该链接下载:http://rpmfind.net/linux/RPM/redhat/6.2/i386/krb5-workstation-1.1.1-9.i386.html 
    具体合并过程和文档请参考相关文档,比如:http://e-docs.bea.com/wls/docs81/secmanage/sso.html#1101370

    * 配置JAAS Login Configruation Entry

    JAAS Login Configuration Entry被JAAS使用。WebLogic Negotiate Identity Assertor解析完成Negotiate Token后将通过Krb5LoginModule完成最终的用户验证。

    此验证过程通过我们前面生成的keytab参与来完成,不需要访问KDC机器。这降低了KDC认证方面的开销。

    com.sun.security.jgss.initiate {  com.sun.security.auth.module.Krb5LoginModule required  principal="HTTP/wls.COM" useKeyTab=true keyTab="wls.HTTP.keytab" storeKey=true;
    };
    com.sun.security.jgss.accept {  com.sun.security.auth.module.Krb5LoginModule required  principal="HTTP/wls.COM" useKeyTab=true keyTab="wls.HTTP.keytab" storeKey=true;
    };

    参数中的Principal为前面我们通过ktpass创建的Service Principal,这里是“HTTP/wls.COM”。keytab指向我们通过ktpass生成的keytab文件。

    将上面的内容保存为krb5Login.conf。

  3. WebLogic的配置
    * 为WebLogic 配置Single Pass Negotiate Identity Assertion Provider

    这个配置比较简单,请参考http://e-docs.bea.com/wls/docs81/secmanage/providers.html#1199872 ,这里就不多说了。 注意Supported Types中两个Token Type需要全都选择。

    * 创建一个Web应用

    创建一个sso.war,其中在web.xml中指定将全部的页面作为受限资源控制,用户必须经过身份验证才能够访问web应用页面。
    <security-constraint>
    <display-name>Security Constraint on Conversation</display-name>
    <web-resource-collection>
    <web-resource-name>Conversation web service</web-resource-name>
    <url-pattern>/*</url-pattern>
    <http-method>GET</http-method>
    <http-method>POST</http-method> 
    </web-resource-collection> 
    <auth-constraint> 
    <role-name>*</role-name> 
    </auth-constraint>
    </security-constraint>
    <login-config> 
    <auth-method>CLIENT-CERT</auth-method>
    </login-config>

    Auth-method指定验证方式为CLIENT-CERT,这是必须的。Role-name为*表示只要用户拥有至少一个J2EE Security Role即可访问这些资源。用户成功登录后,其登录名就是一个Principal,WebLogic将默认将其映射为一个Security Role。因此只要用户成功登录,即可访问/*资源。所以如果用户没有登录,WLS将要求用户登录。

    在war包中的jsp文件内,比如index.jsp通过如下代码获取当前用户信息:

    <%=request.getRemoteUser()%>

    如果返回不为null,表明用户已经成功登录,其返回值就是登录用户的UID。使用WebLogic Console部署该应用,确保应用部署成功。

    * 在WebLogic控制台上增加一个用户帐号

    该帐号同1步在AD中创建的帐号必须完全一致,这里叫TESTUSER;或者你配置一个Active Directory Authentication Provider指向AD也可,但我没有实际操作,大家有兴趣的可以试一下。

    * 修改启动WebLogic脚本增加如下的系统变量
    -Dsun.security.krb5.debug=true
    -Djava.security.krb5.realm=SSO.COM
    -Djava.security.krb5.kdc= AD-SERVER.SSO.COM
    -Djava.security.auth.login.config=krb5Login.conf -Djavax.security.auth.useSubjectCredsOnly=false-Dweblogic.security.enableNegotiate=true"

    Krb5Login.conf为我们 前面编辑的configuration entry。AD-SERVER.SSO.COM指向我们的AD Server。可以在/etc/hosts文件中增加该名字到IP的映射会比较简单一些。sun.security.krb5.debug将使 Krb5LoginModule输出调试信息。这里还要提醒大家realm等参数(SSO.COM)都需要大写。

    * 重新启动WebLogic

  4. IE浏览器的配置

    IE浏览器也需要适当配置,我们这里以IE6.0为例说明。主要两个地方需要配置:

    1. 工具 Internet选项 -点击“本地Interanet”-点击“站点”-高级
    将*.SSO.COM加入,这样我们访问 wls.sso.com时,IE会将wls.sso.com作为本地网站来访问。

    2. 工具 -Internet选项 -高级 -安全 
    “启用集成Windows身份验证”前面打勾。6.0版本前的IE会默认选择该选项,IE6默认没有选择。

    具体请参考连接http://msdn.microsoft.com/library/en-us/dnsecure/html/http-sso-1.asp 中关于IE的配置。

    完成后重新启动 Windows。

4 验证
找 一个Windows 2000 Professional机器(切记不要是那台AD Server, AD上的IE只会向Web Server发出NTLM Token而非Kerberos Token, NTLM Token不被WLS支持),按照上面的IE配置方法完成配置后,将其加入到SSO.COM域。

使用用户TESTUSER登录域,打开IE,访问http://wls.sso.com:7001/sso/index.jsp

   页面上将显示出用户的登录帐号,如果失败将会弹出用户登录对话框。失败了也不要紧,看一下WebLogic的输出,我们已经打开了debug开关,从其 中的错误信息我们可以发现是什么原因。具体请参考JAVA GSS-API的Troubleshooting,链接如下:http://java.sun.com/j2se/1.5.0/docs/guide/security/jgss/tutorials/Troubleshooting.html

5 总结
通过上面的介绍,相信大家已经可以成功配置自己的SSO了(可以看出整个过程还是比较简单的,对比一些SSO产品的超复杂配置过程)。由于时间原因, 本文写的比较仓促,难免有疏漏的地方。如果哪些地方描述有错误,请给我指出;或者根据上面的配置没有成功的,也请告知我。希望与大家交流,共同分享成功配 置SSO的快乐!

来自:http://middleware123.com/weblogic/security/511.html

WebLogic Server的单点登陆功能--转载的更多相关文章

  1. ASP.net(C#)利用SQL Server实现注册和登陆功能

    说说我现在吧,楼主现在从事的事IT行业,主攻DotNet技术:当然这次上博客园我也是有备而来,所有再次奉献鄙人拙作,以飨诸位,望诸位不吝赐教. 世界上大多数的工作都是熟练性的工种,编程也不例外,做久了 ...

  2. SSO单点登录解决方案[转载]

    1 什么是单点登陆      单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互 ...

  3. 集成基于OAuth协议的单点登陆

    在之前的一篇文章中,我们已经介绍了如何为一个应用添加对CAS协议的支持,进而使得我们的应用可以与所有基于CAS协议的单点登陆服务通讯.但是现在的单点登陆服务实际上并不全是通过实现CAS协议来完成的.例 ...

  4. 集成基于CAS协议的单点登陆

    相信大家对单点登陆(SSO,Single Sign On)这个名词并不感到陌生吧?简单地说,单点登陆允许多个应用使用同一个登陆服务.一旦一个用户登陆了一个支持单点登陆的应用,那么在进入其它使用同一单点 ...

  5. 从零开始编写自己的C#框架(15)——Web层后端登陆功能

    对于一个后端管理系统,最重要内容之一的就是登陆页了,无论是安全验证.用户在线记录.相关日志记录.单用户或多用户使用帐号控制等,都是在这个页面进行处理的. 1.在解决方案中创建一个Web项目,并将它设置 ...

  6. cas单点登陆。就这一篇就够了!!!!!

    前言: cas是什么我就不累赘说了.就简单说下大致的流程.首先,cas是一个独立的项目.就是一个war包,部署在tomcat上面启动就ok.然后我们要实现单点登陆,无疑是访问系统1,如果没有登录,就跳 ...

  7. WebLogic Server

    前几天,看了几集J2ee , 给我的感觉就是,看不懂!! 一点也不懂! 那怎么办呢? 听老师的,不管懂不懂,先看看再说.接下来,就开始了J2ee "艰苦"的历程.在J2ee中,经常 ...

  8. WebSeal单点登陆

    WebSeal单点登陆 作为学习整理,部分内容来自网络和官方文档. LDAP LDAP可以看作一种数据库,分为客户端和服务端.服务端是用来存放资源,客户端用来操作资源.它是一种树形存储结构,遍历起来会 ...

  9. 在多点环境下使用cas实现单点登陆及登出

    CAS 介绍 CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目.CAS 具有以下特 ...

随机推荐

  1. Noah的学习笔记之Python篇:装饰器

    Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) ...

  2. 拦截QT关闭窗口的CloseEvent

    QDialog类下有一个虚函数 void QDialog::closeEvent (  QCloseEvent   *  e   )  [virtual protected] 通过实现closeEve ...

  3. IbatisNet开发使用小结

    一.   介绍 平常做企业级应用,需求变化是经常的事,而很多基础代码重复也是很让人头疼的问题.所以很多人会使用一些ORM框架来增强项目的可维护性.可扩展性.IBatis.Net就是一个比较易用的ORM ...

  4. [操作系统]iOS6与iOS7屏幕适配技巧

    一.没有包装任何 导航控制器 或者 UITabBarController 1.控制器的view是UIScrollView\UITableView\UICollectionView时(控制器是UITab ...

  5. 安卓天天练练(五)CompoundButton

    ToggleButton 让我想起了从前jQuery还没有取消toggle方法时是怎么偷懒的.. 注意: 如果LinearLayout,与RelativeLayout不同,必须有orientation ...

  6. Connect them

    zoj3204: 最小生成树,要求最小字典序的解. 用kruscal算法,先排序,输出的时候也要排序. /* zoj3204 解题思路: 赤裸裸的最小生成树.只是要求输出字典序最小的连接方案. 所以在 ...

  7. mysql左联右联内联

    在MySQL中由于性能的关系,常常要将子查询(Sub-Queries)用连接(join)来却而代之,能够更好地使用表中索引提高查询效率. 下面介绍各种join的使用,先上图: 我们MySQL常用的为左 ...

  8. 使用m2eclipse搭建Web项目

    这篇文章已经指导好了:http://www.cnblogs.com/quanyongan/archive/2013/04/21/3033838.html

  9. 14.6.3.5 Configuring InnoDB Buffer Pool Flushing

    14.6.3.5 Configuring InnoDB Buffer Pool Flushing InnoDB 执行某些任务在后台, 包括脏叶的刷新(那些已经发生改变的pages 但是没有写入到数据文 ...

  10. python读取文件通过正则过滤需要信息然后保存到新文件里

    import osimport reimport fileinput def getDataFromFile():        rt = "/(.*)/(.*).apk"     ...