设计,开发:肖波
页面:顾晓燕
美工:孙莹莹
2007-8
简介
安全证书登录组件SecUser,后简称SecUser是www.kaitoo.com开发的一款基于.Net的开放源码的安全证书登录组件,该组件可以帮助用户构建一个类似于银行的网上银行系统的基于证书验证的Web应用系统。该组件封装了证书的管理功能,验证功能,以及登录后Web应用系统的安全认证功能,为开发者提供一个方便易用且高度可扩展的安全证书系统支撑平台。
架构
图1 安全证书登录组件系统架构
SecUser 组件由如下组件组成
用户终端组件
登录组件Logon:该组件在终端运行,为用户提供一个WinForm的登录界面,同时提供证书管理的相关功能。开发者可以根据实际情况修改登录组件的界面及裁剪相关功能。
图2 登录界面
SecUser.Remote.Client 组件:该组件提供终端和服务器进行证书管理相关操作的接口。
图3 SecUser.Remote.Client 组件 类关系图
用户终端组件小结
用户终端组件运行于用户的终端,提供终端侧的证书管理,用户登录,登录后的浏览器容器等功能,用户终端组件提供了和用户终端绑定的接口,可以通过机器码,软件狗等方式将证书和终端进行绑定,从而使用户只能在指定机器上运行软件。
WebServer 组件
SecUser.Remote.Server组件:该组件提供对用户侧证书管理的响应,以及页面安全验证的封装。
图4 SecUser.Remote.Server 组件 类关系图
SecUser.Remote.Server 组件主要由 CCertServer,CBasePage,CTestBasePage 三个类组成。
其中 CCertServer 用于处理证书管理的响应,CBasePage 提供WebPage的安全验证,所有需要安全验证的页面都必须从CBasePage继承,CBasePage 通过令牌验证当前页面是否是由当前登录用户调用的。CBasePage 类同时还可以给派生页面提供证书ID,用户ID等当前用户的基本信息,并且提供一个UserInfo的接口给页面存取当前用户相关的信息。
出于安全性的考虑,所有需要安全验证的页面都必须在终端登录Logon组件的浏览器容器中执行,这样为软件调试带来一定困难,为了方便开发者在开发阶段对软件进行调试,SecUser.Remote.Server 组件提供了一个CTestBasePage类,开发阶段,界面可以从这个类继承,这个类提供和BasePage类相同的属性,但不进行安全验证,派生类可以修改CTestBasePage类的保护属性设置不同的值进行调试。该类只在Debug版本存在。
ISecUser 接口组件 :SecUser组件是一个高度可扩展的证书安全系统平台,该平台框架不限制用户的实现方式,只提供实现接口,用户可以设计任意符合自己需求的实现方式。开源代码中提供了对接口的实现组件SecUser.Cert 和 SecUser.User,这两个组件只是一个示例,用户完全可以不用这两个组件,而编写自己的接口实现。
图5 ISecUser 接口组件 类关系图
ICertManage接口实现创建证书的调用
IUserPassword接口实现用户名密码的校验
IGlobalCfg 接口实现全局变量的存取
IUserCertManage 接口实现证书管理的相关操作
其中IUserPassword 接口是组件中唯一和用户系统关联的接口,开发者一般都需要实现这个接口,从开发者用户系统中校验用户身份的合法性,并返回用户系统中为该用户分配的用户ID。
这里需要注意的是本系统中有两个用户ID,一个是用户系统的用户ID,一个是证书系统的用户ID,这两个ID不是一个ID,整个证书系统中用到的用户ID都是证书系统的用户ID,而非用户系统用户ID,用户系统的用户ID只在从CBasePage类派生的用户页面中被用于对用户系统进行操作。
SecUser.Cert 组件:该组件实现证书系统的相关接口ICertManage,IGlobalCfg,IUserCertManage。该组件只是一个示例。如果开发者没有特殊要求,该示例是可以满足开发者的需求的。一般可以不修改,直接使用。
SecUser.User 组件:该组件实现用户系统的相关接口IUserPassword。该组件只是一个示例。由于开发者的用户系统肯定不是示例中的用户系统,所以一般情况下该组件是要被重写的,开发者必须重写该组件,和开发者自身的用户系统对接。
配置和部署
终端组件的配置
终端组件需要进行如下配置
静态配置:
开发者需要根据自己系统的情况配置登录组件的相关静态属性
Logon 项目的CGetConfig.cs 文件
internal class T_StaticCfg
{
internal const String CFG_FILE_NAME = "certcfg.xml"; //配置文件名称
internal const int CERT_CHECK_DAYS = 30; //离证书到期多少天开始提示更新证书
internal const String CERT_SUBJECT = "CN=xxx"; //证书的主题可分辨名称,必须与服
务器侧设置的名称一致
internal const bool NEED_IDENTIFIER = false; //是否需要进行终端识别码的校验,如果
需要校验,必须修改 CGetIdentifier
的Identifier属性代码!
internal const String DEFAULT_REMOTE_URL =
"http://localhost:2185/Web/SecUserFace.aspx"; //默认的远程URL地址
internal const int ADMIN_PAGE_WIDTH = 800; //管理员界面的宽度
internal const int ADMIN_PAGE_HEIGHT = 600; //管理员界面的高度
internal const int NORMAL_PAGE_WIDTH = 800; //普通用户界面的宽度
internal const int NORMAL_PAGE_HEIGHT = 600; //普通用户界面的高度
}
终端验证码的实现
Logon 项目的CGetIdentifier.cs 文件
static String Identifier
{
get
{
//插入获取终端标识符的实际代码
throw new Exception("You must write code for client identifier!");
}
}
本组件只提供了接口,没有给出具体实现,用户可以在get 程序块中加入自己的获取终端识别码的代码。
WebServer的配置
示例数据库创建
创建用户数据库SecUser,执行SecUser.User/Sql 下的脚本创建表,前面已经说过,实际情况下不要创建用户数据库,而是用开发者自身的用户库。
创建证书数据库 Cert,执行SecUser.Cert/Sql 下的脚本。
数据库连接配置:
Web/Web.Config 的connectionStrings中配置开发者系统对应的用户数据库和证书数据库的连接字符串。
<connectionStrings>
<add name="SecUser.Cert.DAL.Data.ConnectionString" connectionString="Data Source=(local);Initial Catalog=Cert;Integrated Security=True;Connect Timeout=30;" />
<add name="SecUser.User.DAL.Data.ConnectionString" connectionString="Data Source=(local);Initial Catalog=SecUser;Integrated Security=True;Connect Timeout=30;"/>
</connectionStrings>
MakeCert.exe 程序路径配置:
MakeCert.exe 是示例代码用户生成证书的外部程序,开发者可以实现自己的证书创建代码,如果用示例代码,必须配置该组件的路径,并将该组件放置到对应路径下。
<appSettings>
<add key = "MakeCertPath" value=
"E:/WebComponent/V1.0Bone/SecUser/Web/Bin/"/>
</appSettings>
证书管理页面首页地址配置
该配置指明系统用证书管理员身份登录后首先指向的页面。
该如果实际的证书管理页面的首页存在框架,则这个页面需要做成一个指向实际首页的跳转页面。普通用户登录首页也是同样道理。
<appSettings>
<add key = "AdminHomePage" value=
"http://localhost:2185/Web/AdminHomePage.aspx"/>
</appSettings>
上述两个配置都在appSettings一节中。
接口实现配置
接口必须被实现后才可以使用,用户可以编写自己的接口实现,并在Web/App_Code/Instance.cs 文件中填写接口实现的代码
示例代码如下,用户可以修改该代码,加入自己的接口实现。
public Instance()
{
//初始化证书相关接口
m_UserCertManage = new SecUser.Cert.BLL.CUserCertManage();
m_GlobalCfg = new SecUser.Cert.BLL.CGlobalCfg();
m_CertManage = new SecUser.Cert.BLL.CCertManage();
m_UserCertManage.GlobalCfg = m_GlobalCfg;
m_UserCertManage.CertManage = m_CertManage;
//初始化用户密码校验接口
m_UserPassword = new SecUser.User.BLL.CUserPassword();
}
部署
第一个证书管理员的生成
第一个证书管理员作为超级用户不需要进行审核就可以申请,用户做好上述配置后,运行Logon组件,选择一个用户系统中的用户做超级用户如Admin,点击申请管理员证书后输入选定的超级用户的用户名和密码,已经证书信息,证书信息如何使用有开发者根据自己情况决定,也可以不用,确定后及可以生成第一个证书管理员的证书。该用户第一次登录系统时会自动
将用户证书安装到用户终端,并用该证书进行用户身份验证。
系统可以有多个证书管理员,除第一个证书管理员外其他管理员的申请必须有其他管理员进行审核通过后才能够使用。
全局属性配置
管理员登录后可以进行全局属性配置
这里需要注意的是证书主题必须要和终端配置中的证书注意一致,否则终端将无法找到证书。
用户属性配置
用户列表
用户证书管理
用户属性管理
安全性
给出几个安全建议
1、 网站建议配置为采用SSL,目前版本证书还不能被用于SSL的认证,但由于本组件已经进行了一定的安全验证,所以只要用服务器证书配置SSL,就可以达到较强的安全性。特别是后台管理页面强烈建议采用SSL配置WebServer。
2、 用户终端的两个组件建议编译成强命名组件,以免被修改。
3、 Logon 组件建议进行搅混等加密处理,以免被轻易反编译后获取关键配置代码。
4、 Web Server 引用的组件发布时建议使用Release版本,特别是SecUser.Remote.Server.dll 一定强烈建议使用Release版本发布。