dev2dev 首页 > 资源中心 > 专家Blog > 专家Blog文章
如何将PKI Cert或CAC Card与ALUI集成在一起
在许多方面,密码是其他所有已尝试形式之外的最糟糕的安全形式。我对Bucchere的强密码理论进行了部分创新,强密码理论是墨菲定律(该定律声明无论怎样都将出错)的派生物。现在得出的结论类似如下:密码越强,就越容易被黑(hack)。为什么,因为如果强迫用户使用强密码,那么用户很有可能将密码写下来。写下密码则完全废弃了使用它的初衷。
底线是:密码被利用。但密码已经成为事实的标准,因为它们比我们尝试的其他任何东西都更容易并更廉价,这些东西包括PKI cert、生物测定学(如指纹和视网膜扫描)、CAC卡片、RSA安全ID等。(甚至对于基于cert的验证方案,用户仍然需要一个密钥来生成自己的cert,它实质上只是一个绚丽的密码。)
密码是事实验证标准并不意味着我们就不应该去尝试其他表面上看起来更好的安全形式,特别是,如果1)您正在保护特别敏感的数据,2)在打开网络,3)或者具有可用来投资更健壮安全形式的资源(比如$$$)。我并不是谈论从Verisign购买一个SSL cert,并继续让用户将其密码写在粘在监视器上的便笺上。(自我记录:当您回到办公室的时候,请拿走粘在监视器上写有密码的便笺。)我将讨论使用某种类型的“软”cert(如PKI)或“硬”cert(如CAC)来保护您的系统和数据。
现在,如果您的系统是ALI的(即以前的Plumtree Foundation或Plumtree Portal),那么您很幸运,因为知道Plumtree的受过高等教育的人都特别容易做到这一点。事实上,最困难的部分是从cert中获得用户的身份(请参阅下面的代码片段,从中可以获得一些启发)。一旦已经这样做,只需将一个类放入实现ISSOProvider接口的jar文件中即可。(对于那些运行在Windows上的用户,请不要问我如何将这“转移”到C#中——只使用Java代码,将它放入Visual Studio.NET并随后修改语法错误。)
但请等一下,SSO代表“单点登录”,对吗?在这里您真正要做的是将证书从cert传递给ISSOProvider,对于SSO,只需要做少量工作或什么都不做。这是一句真话。微妙之处在于ISSOProvider,因为它的名称中包含字母SSO,它几乎可以用于任何形式的验证,不管正在使用SSO产品还是没有使用SSO产品。
package com.bdgportal.alui.auth;
import com.plumtree.openfoundation.util.*;
import com.plumtree.openfoundation.web.*;
import com.plumtree.portaluiinfrastructure.sso.*;
public class CertIntegration implements ISSOIntegration {
private XPHashtable settings;
public CertIntegration() {
;
}
public boolean Initialize(XPHashtable settings) {
this.settings = settings;
//String exampleSetting = ((XPArrayList)settings.GetElement("SettingName")).GetElement(0);
}
public String GetSSOProductName() {
return "My Favorite Cert Integration";
}
/**
* Gets the username from the cert and returns it to Plumtree. This will fail if the username
* does not have a matching account in Plumtree. This can be a Plumtree database user or a user
* imported from an authentication source, in which case you need to include the auth source
* prefix in the username, e.g. "MyAuthSource/cbucchere"
*
* @param request The wrapped HttpServletRequest from the web container.
* @return The object passed back to Plumtree for authentication with the portal.
*/
public SSOLoginInfo GetLoginInfo(IXPRequest request) {
String userName = ((XPRequest)request).GetUnderlyingObject().getUserPrincipal().getName();
return new SSOLoginInfo(userName);
}
public String[] GetSecureCookies() {
return null;
}
public String[] GetSecureHeaders() {
return null;
}
public boolean OnLogout(IXPResponse response, String returnURI) {
return false;
}
}
如上所述,其中最困难的部分是从PLI cert、CAC卡片和视网膜扫描等中获得用户名。在上述示例中,我做了一些假设。首先,我假设用户的门户运行在Weblogic之上,它知道并能正确实现Principal,这是Java Servlet知道谁正在使用它的方式。Weblogic允许将Principal类的自定义实现添加到其安全基础架构中。所有您需要做的就是扩展java.security.Principal,然后使用一长串不可思议的配置步骤来启用它。
谈到这些配置,我忘记提醒您了,有两个小的配置步骤您需要执行,以便获得在ALI中使用的闪亮的新ISSOIntegration。在portalconfig.xml中,需要将SSOVendor的值设置为100(或者更大),然后将CustomSSOClass设置为编写用来实现ISSOIntegration的类的完全限定名。对于上述Java示例,该名称将是com.bdgportal.alui.auth.CertIntegration,对于.NET,该名称将是C#类的名称。
说到.NET,正如您所知道的许多信息那样,它是一个完全不同的东西,它有自己的为web应用程序提供安全的方式(如System.Web.Security)。
不管使用的是哪种平台,都需要从正在使用的验证方法获得用户名。一旦实现这一点,只需将上述代码放入项目中,并将getUserPricipal().getName()替换为可以找到的用来获得用户名的机制即可。
假设信任自己的验证机制可以返回适当用户名,那么您将允许用户通过任何您喜欢的方式(CAC、PKI、生物测定学等)登录到门户中。
原文出处:http://dev2dev.bea.com/blog/bucchere/archive/2006/11/how_to_integrat.html
作者其它文章
|