PKI体系中的RA系统

 

PKI体系中的RA系统

摘要本文以格尔RA为基础,首先讨论了PKI公钥体系,说明了格尔PKI平台产品SRQ15,然后着重介绍了SRQ15中的RA系统。对格尔RA系统的功能进行了分析,对格尔RA系统的架构及开发中所涉及到的技术进行了探讨。最后展示了格尔RA系统的总体效果。

关键字PKIRASRQ15CA、私钥、公钥

The Register Authority in PKI System

AbstractThis paper takes the KOAL RA as the foundation, discussing the system of PKI first. Explaining the product SRQ15 of KOAL PKI. Then the paper emphasized to introduce the system of RA in the SRQ15. It carried on the analysis to the function of the KOAL RA system, discussing the technique of structure and developments of the KOAL RA system involved in. Finally, Displayed the effect of the KOAL RA system.

key words: PKIRASRQ15CA public keyprivate key

1        PKI技术简介

1.1   什么是PKI

PKIPublic Key Infrastructure是通过使用公开密钥技术和数字证书来确保系统信息安全并负责验证数字证书持有者身份的一种体系。为解决Internet的安全问题,世界各国对其进行了多年的研究,初步形成了一套完整的Internet安全解决方案,即目前被广泛采用的PKI体系结构,PKI体系结构采用证书管理公钥,通过第三方的可信机构CA,把用户的公钥和用户的其他标识信息(如名称、e-mail、身份证号等)捆绑在一起,在Internet网上验证用户的身份,PKI体系结构把公钥密码和对称密码结合起来,在Internet网上实现密钥的自动管理,保证网上数据的机密性、完整性。从广义上讲,所有提供公钥加密和数字签名服务的系统,都可叫做PKI系统,PKI的主要目的是通过自动管理密钥和证书,可以为用户建立起一个安全的网络运行环境,使用户可以在多种应用环境下方便的使用加密和数字签名技术,从而保证网上数据的机密性、完整性、有效性,数据的机密性是指数据在传输过程中,不能被非授权者偷看,数据的完整性是指数据在传输过程中不能被非法篡改,数据的有效性是指数据不能被否认。

PKI采用证书进行公钥管理,通过第三方的可信任机构(认证中心,即CA),把用户的公钥和用户的其他标识信息捆绑在一起,其中包括用户名和电子邮件地址等信息,以在Internet网上验证用户的身份。PKI把公钥密码和对称密码结合起来,在Internet网上实现密钥的自动管理,保证网上数据的安全传输。

因此,从大的方面来说,所有提供公钥加密和数字签名服务的系统,都可归结为PKI系统的一部分,PKI的主要目的是通过自动管理密钥和证书,为用户建立起一个安全的网络运行环境,使用户可以在多种应用环境下方便的使用加密和数字签名技术,从而保证网上数据的机密性、完整性、有效性。数据的机密性是指数据在传输过程中,不能被非授权者偷看;数据的完整性是指数据在传输过程中不能被非法篡改;数据的有效性是指数据不能被否认。

      一个有效的PKI系统必须是安全的和透明的,用户在获得加密和数字签名服务时,不需要详细地了解PKI的内部运作机制。在一个典型、完整和有效的PKI系统中,除证书的创建和发布,特别是证书的撤销,一个可用的PKI产品还必须提供相应的密钥管理服务,包括密钥的备份、恢复和更新等。没有一个好的密钥管理系统,将极大影响一个PKI系统的规模、可伸缩性和在协同网络中的运行成本。在一个企业中,PKI系统必须有能力为一个用户管理多对密钥和证书;能够提供安全策略编辑和管理工具,如密钥周期和密钥用途等。     

1.2   PKI在网络安全中的作用

      建立公钥基础设施的目的是管理密钥和证书。通过PKI对密钥和证书的管理,一个组织可以建立并维护可信赖的网络环境。PKI能够使加密和数字签名服务应用在广泛的应用中。就商业上实现有效的公钥基础设施而言,存在许多需求。首先,如果用户不能从应用中的加密和数字签名中获得益处,那么PKI是没有价值的。因而,对PKI最重要的约束是透明性。透明性意味着用户不必知道PKI是如果管理密钥和证书的,只从加密和数字签名中获得益处就足够了。一个有效的PKI是透明的,用户在获得加密和数字签名服务时,不需要详细地了解PKI是怎样管理证书和密钥的。

1.3   PKI的组成

      PKI体系是计算机软硬件、权威机构及应用系统的结合。它为实施电子商务、电子政务、办公自动化等都提供了基本的安全服务,从而使那些彼此不认识或相距很远的用户能通过信任链安全地交流。PKI是基于“数字证书”的系统,类似于用户的“电子护照”,即可以通过数字证书作为识别用户身份的依据。一个典型、完整、有效的PKI应用系统至少应具有以下部分:

l          公钥密码证书管理

l          黑名单的发布和管理

l          密钥的备份和恢复

l          自动更新密钥

l          自动管理历史密钥

l          支持交叉认证

      由于PKI体系结构是目前比较成熟、完善的Internet网络安全解决方案,国外的一些大的网络安全公司纷纷推出一系列的基于PKI的网络安全产品,如美国的VeriSign, IBM ,Entrust等安全产品供应商为用户提供了一系列的客户端和服务器端的安全产品,为电子商务的发展提供了安全保证。为电子商务、政府办公网、EDI等提供了完整的网络安全解决方案。

1.4   PKI的应用场景

      随着网络技术和信息技术的发展,电子商务已逐步被人们所接受,并在得到不断普及。但由于各种原因,国内电子商务的安全性仍不能得到有效的保障。在常规业务中,交易双方现场交易,可以确认购买双方的身份。利用商场开具的发票和客户现场支付商品费用,无须担心发生纠纷和无凭证可依。但通过网上进行电子商务交易时,由于交易双方并不现场交易,因此,无法确认双方的合法身份,同时交易信息是交易双方的商业秘密,在网上传输时必须保证安全性,防止信息被窃取;双方的交易非现场交易,一旦发生纠纷,必须能够提供仲裁。

      因此,在电子商务中,必须从技术上保证在交易过程中能够实现身份认证、安全传输、不可否认性、数据完整性。在采用数字证书认证体系之前,交易安全一直未能真正得到解决。由于数字证书认证技术采用了加密传输和数字签名,能够实现上述要求,因此在国内外电子商务中,都得到了广泛的应用。

图表 1中小企业的应用

1.5      PKI的现状与未来

世界各国都十分重视PKI体系的建设与研究, 有的国家的PKI应用已经开始。在PKI技术相对比较成熟的背景下,美国政府在完成大量研究的基础上,已提出了带桥接CA模式的联邦PKIFPKI)体系,其核心由CARAPMACSR组成。FPKI用于支持信息资源的安全共享,为联邦政府部门和其他组织机构使用数字证书技术实现信息系统安全、安全电子商务、安全通信等活动提供了设施、规则和政策。从2000年开始,亚洲范围内的国家也大规模着手研究建设PKI基础设施,被国外称为“导航工程”,宣告着PKI基础架构的正式起航。

我国的PKI建设在几年前就已开始启动。截至目前我国已经建立了50多家CA认证中心,但是各家CA机构彼此独立,成为彼此互不相连的“信任孤岛”,使各证书之间缺乏“互通性”,严重阻碍了PKI技术的发展。

      为了解决这一问题,20021月,由国务院信息办组织各方面的PKI专家,专门成立了《国家PKI体系研究》课题小组,20026月,该课题结束,向国家提交了《国家PKI体系总体框架》研究报告。200317,在由中国PKI论坛主办的中国公钥基础设施(中国PKI)战略发展与应用研讨会上,已经规划出了国家级PKI体系结构。那就是从行政上,规划成立国家PKI协调管理委员会(NPCMC),负责制定国家PKI管理政策、国家PKI体系发展规划;监督、指导国家电子政务PKI体系和国家公共PKI体系的建设、运行和应用;具体负责审批CA机构的成立和撤消。

      目前,建设国家级PKI体系结构的重要环节:就是筹划建立各级CA机构之间的“桥中心”,从抓CA互连互通的示范工程着手,然后逐渐推广,解决各CA“互不相认”的现状。建立“互连互通”技术体系的根本在于标准化,为此,全国信息安全标准化技术委员会于20028月正式成立了PKI/PMI工作组(即信安标委第四工作组,简称WG4工作组),主要负责PKI/PMI标准体系的研究。

我国作为一个网络大国,发展自己的PKI技术是很有必要的。PKI技术作为一项关键的网络安全技术,由于我们还没有成熟的解决方案,这成为了我们的电子政务、电子商务等发展的一大瓶颈。当前,Internet网络的安全应用已经离不开PKI技术的支持。网络应用中的认证、加解密的密钥管理、非否认等服务只有PKI技术才能提供。

2        格尔PKI平台产品及RA

2.1   SRQ15电子证书认证系统

SRQ15电子证书认证系统是格尔公司自主研制的面向大规模证书应用的PKI平台级产品,它符合国家密码管理办公室规范,支持各种通用的国际标准,支持双证书,双中心机制。系统主要提供证书服务,黑名单的的签发服务,证书和黑名单的发布服务,用户注册审核管理服务,在线证书状态查询服务,时间戳服务,并支持分布式多级部署和与其他CA机构的交叉认证,满足具有世界先进水平的CA认证中心系统的全部需求。系统采用相对独立的可伸缩模块化设计,能够能够满足不同规模的数字证书发放管理的需求。PKI是一个用公开密钥技术来实施和提供安全服务的具有普适性的安全基础设施。

图表 2 SRQ15产品体系结构

2.2   SRQ15产品核心流程

图表 3 SRQ15产品核心流程

1.       用户或RA管理员通过证书存储设备构造密钥对,该密钥对将用于生成签名证书。客户端使用该密钥对构造基本证书请求并发送给RA服务器;

2.       RA服务器验证用户合法性和用户证书请求是否已获批准,然后根据用户信息、证书基本请求和证书策略构造证书申请请求,并通过安全连接发送给CA服务器;

3.       CA服务器验证该请求的合法性,然后通过安全连接向密钥管理中心请求生成用户加密证书;

4.       密钥管理中心接到请求后,从备用库中获取得到加密过的加密密钥对和加密的加密密钥,使用加密机进行解密,生成一会话密钥,使用会话密钥对私钥进行加密,并使用用户签名公钥对会话密钥进行加密。同时将加密的密钥对储存到在用库中;

5.       将加密好的私钥及加密好的加密密钥和公钥一起送还给CACA服务器根据证书策略签发用户签名证书及加密证书,将签发好的证书加密好的私钥及加密好的加密密钥一起送还到RA

6.       RA服务器给客户端返回加密证书、签名证书、加密好的私钥及加密好的加密密钥;

7.       客户端使用签名证书私钥解密得到加密密钥,然后使用加密密钥解密加密证书私钥。客户端安装加密证书私钥及加密证书、签名证书。

2.3   RA系统

2.3.1          用户注册子系统

用户注册子系统负责用户的证书申请、审核和证书下载等。

图表 4用户注册子系统

2.3.2          RA业务主流程

图表 5 RA业务主流程

RA 系统能主要是完成用户证书的注册申请等功能。此外,RA 系统以对用户资料进行管理和维护;提供定义灵活的证书申请、审核流程。

l          进行用户身份信息的审核,确保其真实性;

l          本区域用户身份信息管理和维护;

l          数字证书的下载;

l          数字证书的发放和管理。

CA中心以集中发放证书或网上发放证书为主要发证模式;在这种情况下,用户注册、注册审核、统一发证等各个业务步骤都必须统一化、规范化,这都可以由RA中心来实现;

l          从逻辑结构和业务流程上来看,从操作终端(包括注册、审核、发证等)到RA系统到到CA中心的三层结构,如果省去RA系统,则直接从操作终端访问到CA中心,这不能满足CA系统的安全要求;

l          CA系统负责管理和维护属地内证书库以及证书废除列表库;RA系统负责管理和维护属地内用户资料;两者管理的对象不同,安全级别也不同,如果混为一体,则容易造成各类信息管理的混乱;

l          用户注册信息的功能和职责,它还能够管理各LRA及其操作员;对整个RA机构的运营策略进行控制,包括控制LRA的职能权限等,可将审核权利放到LRA实现,也可将审核权限回收到RA审核中心来完成;另外RA审核中心还提供集中发证功能、RA系统日志功能等。

3        RA需求分析

3.1   RA在整个体系中的位置

图表 6 RA在整个体系中的位置

3.2   系统概述

证书认证系统的建设可以保证网络信息通讯安全,保证通讯数据保密性、完整性和不可抵赖性。

RA系统是证书认证系统的组成部分,主要负责处理和用户直接交涉的用户及证书相关的管理业务。RA系统采用B/S构,RA服务器和RA操作终端(浏览器)构成。使用人员通过操作终端访问本系统,执行相关操作

RA系统分为RA总中心和RA分中心两种系统类型,RA总中心是独立的RA系统,RA分中心依赖于RA总中心提供证书功能。为了便于管理,用户和管理员具有机构属性,一个用户或管理员所属的RA机构可以是RA总中心,也可以是RA分中心,或者是RA总中心或RA分中心下属的逻辑RA机构,在逻辑RA机构下还可以有下级的逻辑RA机构。某一RA机构的管理员只能对本机构及下级的用户和管理员进行管理。

3.3   功能简介

RA系统主要负责处理和用户直接交涉的用户及证书相关的管理业务,主要有以下几个流程:

3.3.1 用户RA

3.3.1.1       查询用户

      根据自定义条件,查询满足条件的用户信息

3.3.1.2       签发证书

签发用户证书的基本业务流程是:注册用户-> 签发审核-> 签发证书。后一步操作必须在前一步操作成功完成后才能进行。

1.注册用户

注册新用户信息。用户注册后可进行签发证书等相关证书操作

2.签发审核

审核新注册用户的信息。如果接受申请,则用户可进行证书签发操作;如果拒绝申请,则用户可通过用户更新操作,以便重新进入签发审核流程

3.签发证书

签发用户证书。所签发的证书类型为双证书,即一张签名证书,一张加密证书。证书有效期由CA证书策略确定

3.3.1.3       更新证书

更新用户证书的基本业务流程是:更新用户-> 更新审核> 更新证书,即

更新用户证书是由更新用户信息操作而触发的。后一步操作必须在前一步操作成功完成后才能进行。

1.更新用户

更新当前用户信息。用户信息更新后,需要对其证书进行更新。当申请操作被审核拒绝后,可以更新用户数据,重新进入审核流程

2.更新审核

审核用户的证书更新申请。如果接受申请,则用户可进行证书更新操作;如果拒绝申请,则用户可通过用户更新操作,以便重新进入更新审核流程

3.更新证书

更新用户证书,指更新证书主题项内容。签名证书和加密证书主题项会根据用户当前信息作相应更新。签名证书的密钥更新,加密证书的密钥不更新。证书有效期由CA证书策略确定。更新证书时需要提交原有证书

3.3.1.4       延期证书

延期用户证书的基本业务流程是:申请延期证书-> 延期审核> 延期证书。后一步操作必须在前一步操作成功完成后才能进行。延期证书的前提是该用户已获得了签发的有效证书。

1.申请延期

申请延期证书。申请延期证书的操作必须在签发用户证书操作成功完成后才能进行

2.延期审核

审核用户的证书延期申请。如果接受申请,则用户可进行证书延期操作;如果拒绝申请,则用户可通过用户更新操作,以便重新进入延期审核流程。

3.延期证书

延期证书的制作。当延期审核被接受时进入该流程。

3.3.1.5       冻结证书

冻结用户证书的基本业务流程是:申请冻结->审核冻结->冻结证书。冻结证书的前提是该用户已获得了签发的有效证书。

1. 申请冻结

申请冻结证书。申请冻结证书的操作必须在签发用户证书操作成功完成后才能进行。

2. 审核冻结

审核冻结证书。审核冻结证书的操作必须在申请冻结证书操作成功完成后才能进行。

3. 冻结证书

使用户证书暂时失效。证书冻结后,用户将不能使用需要对证书有效性进行验证的应用程序。冻结证书不会对证书信息进行变更。可通过证书解冻来恢复原有证书功能

3.3.1.6       解冻证书

解冻用户证书的基本业务流程是:申请冻结->审核冻结->解冻证书。解冻证书的前提是该用户证书已被冻结。

1. 申请解冻

申请解冻证书。申请冻结证书的操作必须在冻结证书操作成功完成后才能进行。

2. 审核解冻

审核解冻证书。审核冻结证书的操作必须在申请解冻证书操作成功完成后才能进行。

3.解冻证书

对已冻结的证书进行解冻,恢复原有功能。证书解冻即可正常使用,不会对证书信息进行变更

3.3.1.7       恢复证书

恢复用户证书的基本业务流程是:申请恢复-> 恢复证书。恢复证书是在用

户证书损坏或丢失的情况下进行。恢复证书的前提是该用户已获得了签发的有效证书。

1.申请恢复

申请恢复证书

2.恢复证书

恢复用户证书,指对于存放证书的加密模块损坏或者遗失情况下的证书密钥恢复。恢复证书操作将重新生成签名证书和加密证书。证书主题项与原有证书相同;签名证书的密钥重新生成,加密证书的密钥从KMC导出,与原有密钥相同。证书有效期由CA证书策略确定。恢复证书不需要提交原有证书

3.3.1.8       废除证书

废除用户证书的基本业务流程是:废除证书。废除证书的前提是该用户已获得了签发的有效证书。

废除证书

使用户证书永久失效。废除后的证书将无法通过证书有效性验证机制,并且无法恢复原有功能。

3.3.1.9       重发证书

重发证书的基本业务流程是:申请重发-> 重发审核> 签发证书。后一步

操作必须在前一步操作成功完成后才能进行。重发证书操作是在用户证书被废除的情况下,需要为用户重新签发证书时进行。

1.申请重发

申请重新签发证书。

2.重发审核

审核用户的重发申请。如果接受申请,则用户可进行证书签发操作;如果拒绝申请,则用户可通过用户更新操作,以便重新进入重发审核流程。

3.重发证书

重发证书操作是在用户证书被废除的情况下,需要为用户重新签发证书时进行。

3.3.1.10审核撤消

审核撤消可以取消已完成的审核操作,该功能使用户证书从审核待发证状态回退到申请待审核状态,确保了审核操作的可逆性。

3.3.1.11用户注销

注销用户前,必须废除此用户的证书。

3.3.2 企业RA

      企业RA的功能和操作流程与用户RA基本相同,只是在个别界面和名词上有所差异。

3.3.2.1       查询用户

      根据自定义条件,查询满足条件的用户信息。

3.3.2.2       签发证书

签发用户证书的基本业务流程是:注册用户-> 签发审核-> 签发证书。后一步操作必须在前一步操作成功完成后才能进行。

1.注册用户

注册新用户信息。用户注册后可进行签发证书等相关证书操作。

2.签发审核

审核新注册用户的信息。如果接受申请,则用户可进行证书签发操作;如果拒绝申请,则用户可通过用户更新操作,以便重新进入签发审核流程。

3.签发证书

签发用户证书。所签发的证书类型为双证书,即一张签名证书,一张加密证书。证书有效期由CA证书策略确定。

3.3.2.3       更新证书

更新用户证书的基本业务流程是:更新用户-> 更新审核> 更新证书,即

更新用户证书是由更新用户信息操作而触发的。后一步操作必须在前一步操作成功完成后才能进行。

1.更新用户

更新当前用户信息。用户信息更新后,需要对其证书进行更新。当申请操作被审核拒绝后,可以更新用户数据,重新进入审核流程。

2.更新审核

审核用户的证书更新申请。如果接受申请,则用户可进行证书更新操作;如果拒绝申请,则用户可通过用户更新操作,以便重新进入更新审核流程。

3.更新证书

更新用户证书,指更新证书主题项内容。签名证书和加密证书主题项会根据用户当前信息作相应更新。签名证书的密钥更新,加密证书的密钥不更新。证书有效期由CA证书策略确定。更新证书时需要提交原有证书。

3.3.2.4       延期证书

延期用户证书的基本业务流程是:申请延期证书-> 延期审核> 延期证书。后一步操作必须在前一步操作成功完成后才能进行。延期证书的前提是该用户已获得了签发的有效证书。

1.申请延期

申请延期证书。申请延期证书的操作必须在签发用户证书操作成功完成后才能进行。

2.延期审核

审核用户的证书延期申请。如果接受申请,则用户可进行证书延期操作;如果拒绝申请,则用户可通过用户更新操作,以便重新进入延期审核流程。

3.延期证书

延期证书的制作。当延期审核被接受时进入该流程。

3.3.2.5       冻结证书

冻结用户证书的基本业务流程是:申请冻结->审核冻结->冻结证书。冻结证书的前提是该用户已获得了签发的有效证书。

1.申请冻结

申请冻结证书。申请冻结证书的操作必须在签发用户证书操作成功完成后才能进行。

2. 审核冻结

审核冻结证书。审核冻结证书的操作必须在申请冻结证书操作成功完成后才能进行。

3. 冻结证书

使用户证书暂时失效。证书冻结后,用户将不能使用需要对证书有效性进行验证的应用程序。冻结证书不会对证书信息进行变更。可通过证书解冻来恢复原有证书功能。

3.3.2.6       解冻证书

解冻用户证书的基本业务流程是:申请解冻->审核解冻->解冻证书。解冻证书的前提是该用户证书已被冻结。

1. 申请解冻

申请解冻证书。申请冻结证书的操作必须在冻结证书操作成功完成后才能进行。

2. 审核解冻

审核解冻证书。审核冻结证书的操作必须在申请解冻证书操作成功完成后才能进行。

3.解冻证书

对已冻结的证书进行解冻,恢复原有功能。证书解冻即可正常使用,不会对证书信息进行变更。

3.3.2.7       恢复证书

恢复用户证书的基本业务流程是:申请恢复-> 恢复证书。恢复证书是在用

户证书损坏或丢失的情况下进行。恢复证书的前提是该用户已获得了签发的有效证书。

1.申请恢复

申请恢复证书。

2.恢复证书

恢复用户证书,指对于存放证书的加密模块损坏或者遗失情况下的证书密钥恢复。恢复证书操作将重新生成签名证书和加密证书。证书主题项与原有证书相同;签名证书的密钥重新生成,加密证书的密钥从KMC导出,与原有密钥相同。证书有效期由CA证书策略确定。恢复证书不需要提交原有证书。

3.3.2.8       废除证书

废除用户证书的基本业务流程是:废除证书。废除证书的前提是该用户已获得了签发的有效证书。废除证书,使用户证书永久失效。废除后的证书将无法通过证书有效性验证机制,并且无法恢复原有功能。

3.3.2.9       重发证书

重发证书的基本业务流程是:申请重发-> 重发审核> 签发证书。后一步

操作必须在前一步操作成功完成后才能进行。重发证书操作是在用户证书被废除的情况下,需要为用户重新签发证书时进行。

1.申请重发

申请重新签发证书。

2.重发审核

审核用户的重发申请。如果接受申请,则用户可进行证书签发操作;如果拒绝申请,则用户可通过用户更新操作,以便重新进入重发审核流程。

3.重发证书

重发证书操作是在用户证书被废除的情况下,需要为用户重新签发证书时进行。

3.3.2.10审核撤消

审核撤消

      审核撤消可以取消已完成的审核操作,该功能使用户证书从审核待发证状态回退到申请待审核状态,确保了审核操作的可逆性。

3.3.2.11用户注销

注销用户

注销用户信息。注销用户前,必须废除此用户证书。

3.3.3 管理员RA

3.3.3.1       查询管理员

根据自定义条件,查询满足条件的管理员信息。

3.3.3.2       注册管理员

注册管理员,并签发管理员证书。所签发的证书类型为单证书。证书有效期由CA证书策略确定。

3.3.3.3       注销管理员

废除管理员证书,并注销管理员信息。管理员证书废除后,将永久失效。

3.3.4 设备RA

3.3.4.1       查询设备证书

根据自定义条件,查询满足条件的设备证书信息。

3.3.4.2       签发设备证书

导入设备证书请求,并签发设备证书。所签发的证书类型为单证书。证书有效期由CA证书策略确定。

3.3.4.3       废除设备证书

废除设备证书,并删除设备信息。设备证书废除后,将永久失效。

3.3.4.4       下载设备证书

将设备证书以文件形式保存到本地。

3.3.5 系统管理

3.3.5.1       系统配置

1.基本信息

RA系统基本信息配置。

2.数据库信息配置

配置数据库访问地址、数据库名称、用户名和密码。

3.PMS服务器配置

配置PMS服务器访问地址。

3.3.5.2       日志管理

1.系统日志

查看系统日志列表,显示系统日志详细信息。

2.操作日志

查看使用人员操作日志。可根据时间、操作者姓名、业务等查询条件对查询结果进行过滤。

3.3.5.3       RA机构管理

管理本RA中心的各级下属RA机构。

3.3.5.4       信息统计

统计RA中心及其各级下属RA机构的用户信息、用户证书、管理员证书和设备证书等信息。

1.用户信息

      统计RA中心及其各级下属RA机构下的用户信息。

2.用户证书

      统计RA中心及其各级下属RA机构下各种类型用户证书的签发状况,可以点击“统计条件”按钮,按照起止时间来统计特定时间段内用户证书的签发状况。

3.企业证书

      统计RA中心及其各级下属RA机构下各种类型企业证书的签发状况,可以点击“统计条件”按钮,按照起止时间来统计特定时间段内企业证书的签发状况。

4.管理员证书

      统计RA中心及其各级下属RA机构管理员证书的签发状况,可以点击“统计条件”按钮,按照起止时间来统计特定时间段内管理员证书的签发状况

4.设备证书

统计RA中心各种设备证书的签发状况,可以点击“统计条件”按钮,按照起止时间来统计特定时间段内设备证书的签发状况

3.4   性能特点

1.系统能容纳100万数量级的用户信息及证书。

2.系统可支持500个使用人员同时操作。

3.对于每个操作,系统最长响应时间不高于10秒,平均响应时间不高于2秒。

4        RA架构及实现方法

4.1   RA机构/RA系统/RA产品

图表 7 RA机构/RA系统/RA产品图

4.2   RA产品边界

图表 8 RA产品边界图

4.3   RA系统架构

图表 9 RA系统架构图

4.4   RA用例图

图表 10 RA用例图

4.5   RA的状态机

图表 11 RA状态机图

4.6   WebFrame配置文件的相互关系

图表 12配置文件的相互关系图

4.7   基于Struts的FrontController

RA4.9.0Web层完全基于Struts1.1构建,Struts为我们实现了JSP Model 2中的Controller

JSP Model 2的基本流程如下图所示:

图表 13 JSP Model 2的基本流程图

Struts的核心是ActionServlet类,它接受浏览器发出的Request,将Request数据封装成ActionForm实例,调用Action处理请求,将处理结果forwardJSP页面输出。

RA中,FrontController直接使用ActionServletWebAction则是对Action的继承和重载,在WebAction中构造业务请求,调用BackController执行业务,并将业务的处理结果转换成jsp可处理的数据。

Struts1.1中增加了对module的支持,不同的module有自己的配置文件。在RA4.9.0中完全支持这个特性,客户化开发时可以根据需求将功能分类到不同的模块中。

Struts的核心配置文件是struts-config.xml,在该配置文件中主要定义Web层的页面流转和module相关的配置初始化。

4.8   基于Chain of Responsibility的BackController

Struts很好的实现了Web层的页面流转,但需要注意的是Struts并没有实现任何业务层的控制功能。这个功能在RA中是通过BackController实现的。

BackController的功能与FrontController非常类似,它接收前端(可以是Web层,也可以是Service层)发送过来的业务处理请求,调用该业务所对应的原子业务操作序列。这里的原子业务操作序列就是按照Chain of Responsibility设计模式设计的。

Chain of Responsibility的原义是“Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.”。在RA中的实现于原义有一点小小的区别,原义中强调“until an object handles it”,而在实现中,chain中的每一个object都要对request进行处理。

BackController的核心配置文件是business-config.xml,这个文件以树状结构定义了一个chain的集合,通过指定树的一个path就会执行该path所包含的所有业务。下表是demo系统中的一个实际例子:

<chains>

 <chain id="biz">

    <chain id="user">

      <chain id="info">

        <command id="conn" className="com.koal.ra.bizAction.db.DbConnectionAction"/>

        <command id="admin" className="com.koal.ra.bizAction.db.DbAdminLoadAction"/>

        <command id="log" className="com.koal.ra.bizAction.log.OprLogCreateAction" tableName="TB_LOG" primaryKey="log_id" uid="admin_id"/>

        <chain id="register">

          <command id="create_domain" className="com.koal.ra.bizAction.domain.CreateConstraintAction" factoryClass="com.koal.ra.domain.impl.BaseConstraintFactory" constraintColumn="userDomain"/>

          <command id="register" className="com.koal.ra.bizAction.db.DbCreateAction" tableName="TB_USER" primaryKey="userId"/>

          <command id="update_status" className="com.koal.ra.bizAction.db.DbUpdateStatusAction" tableName="TB_USER" statusName="userStatusId"/>

        </chain>

…………

当指定的path=”biz/user/info/register”就会执行下列的业务:

1.       conn:建立数据库连接和开始数据库事务

2.       admin:获得操作员信息

3.       log:记操作日志

4.       create_domain:创建约束域

5.       register:创建用户记录

6.       update_status:更新用户状态

4.9   基于Common Controls的表示层

RA与以前的RA版本相比,jsp代码减少了90%多,这主要归功于表示层所使用的“Common Controls”组件。“Common Controls”是德国SCC公司的商业化产品,它主要由一系列的tag库组成,这些tag库主要有:

1.       cc-ctrl:包含listtreetab等控件

2.       cc-form:包含formtextradio等控件,主要用于表单输入和输出

3.       cc-menu:包含menumenuitem等控件

Common Controls 组件的使用非常简单,下表是demo系统中的两个实际例子:

<%@ page contentType="text/html; charset=GBK" %>

<%@ taglib uri="/WEB-INF/tlds/cc-controls.tld" prefix="ctrl" %>

<%@ taglib uri="/WEB-INF/tlds/cc-forms.tld" prefix="forms" %>

<ctrl:list

 id="result"

 action="search"

 name="list"

 title="用户列表"

 rows="10"

 refreshButton="true">

 <ctrl:columndrilldown title="姓名"       property="value(userName)"       sortable="true" />

 <ctrl:columntext      title="性别"       property="value(userGender)"     sortable="true" />

 <ctrl:columntext      title="身份证号码" property="value(userIdno)"       sortable="true" />

 <ctrl:columntext      title="组织"       property="value(userOrg)"        sortable="true" />

 <ctrl:columntext      title="机构"       property="value(userOrgUnit)"    sortable="true" />

 <ctrl:columntext      title="联系电话"   property="value(userPhone)"      sortable="true" />

 <ctrl:columntext      title="电子邮件"   property="value(userEmail)"      sortable="true" />

 <ctrl:columntext      title="用户状态"   property="value(userStatusName)" sortable="true" />

 <ctrl:columntext      title="可选业务"   property="value(biz_todolist).asHtmlLinks" filter="false" />

</ctrl:list>

这个将显示用户列表,列表的数据是在WebAction中指定的。list控件对翻页、排序等提供了很好的支持。

<%@ page contentType="text/html; charset=GBK" %>

<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>

<%@ taglib uri="/WEB-INF/tlds/cc-forms.tld"    prefix="forms" %>

<html:form action="/register.do">

 <forms:form type="create" caption="用户信息 - 注册" formid="emptyForm">

    <forms:text label="姓名"       property="value(userName)"     size="25" required="true" />

    <forms:description label="性别">

      <select name="value(userGender)">

        <option value=""></option>

        <option value=""></option>

      </select>

    </forms:description>

    <forms:text label="出生日期"   property="value(userBirthday)" size="25" required="true" />

    <forms:text label="身份证号码" property="value(userIdno)"     size="25" required="true" />

    <forms:text label="国家"       property="value(userCountry)" size="25" required="true" />

    <forms:text label=""         property="value(userState)"    size="25" required="true" />

    <forms:text label="地市"       property="value(userCity)"     size="25" required="true" />

    <forms:text label="组织"       property="value(userOrg)"      size="25" required="true" />

    <forms:text label="机构"       property="value(userOrgUnit)" size="25" required="true" />

    <forms:text label="联系电话"   property="value(userPhone)"    size="25" required="true" />

    <forms:text label="联系地址"   property="value(userAddress)" size="25" required="true" />

    <forms:text label="电子邮件"   property="value(userEmail)"    size="25" required="true" />

    <forms:buttonsection default="btnSave">

      <forms:button type="submit" name="btnSave" value="保存"/>

    </forms:buttonsection>

 </forms:form>

</html:form>

这个例子将显示用户注册页,用户按“保存”按钮后,会触发WebAction中的save_onClick事件。

4.10     基于FSM(有限状态机)的业务流程定义

RA中使用了FSM来定义业务流程,这里所谓的业务流程其实是数据的状态迁移流程,与部署流程、发证流程等所谓的“流程”是不同的概念。

有限状态机由状态(status)、活动(activity)、状态迁移(transition)三大要素,下图是Demo系统中用户信息的有限状态机:

图表 14有限状态机图

RA中用XML文件来描述上面的状态转换图,从状态转换图到状态定义文件的转换目前是需要手工完成的,下表是上图所对应的fsm-config.xml文件。

为了统一业务的定义,在RA4.9.0的有限状态机中增加了一种无状态的transition,它实质上就是一个activity,这样做的好处是一个系统的所有业务都可以在fsm-config.xml文件中统一定义。

文本框: 
<fsms defaultfsm="info" />
  <fsm name="info" desc="公务员用户信息状态机">
    <activities>
      <activity name="register" desc="注册" command="/biz/user/info/register" action="user/info/register.do?value(biz)={tranz}"   />
      <activity name="update_0_0" desc="注册变更" command="/biz/user/info/update" action="user/info/update.do?value(userId)={userId}&amp;value(biz)={tranz}"   />
      <activity name="register_apply" desc="提交" command="/biz/user/info/tranz" action="user/info/doBiz.do?value(userId)={userId}&amp;value(biz)={tranz}"   />
      <activity name="register_review" desc="审核" command="/biz/user/info/tranz" action="user/info/doBiz.do?value(userId)={userId}&amp;value(biz)={tranz}"   />
      <activity name="register_accept" desc="审核" command="/biz/user/info/accept" action="user/info/doBiz.do?value(userId)={userId}&amp;value(biz)={tranz}"   />
      <activity name="unregister" desc="注销" command="/biz/user/info/unregister" action="user/info/unregister.do?value(userId)={userId}&amp;value(biz)={tranz}"   />
      <activity name="update" desc="变更" command="/biz/user/info/update" action="user/info/update.do?value(userId)={userId}&amp;value(biz)={tranz}"   />
      <activity name="update_apply" desc="提交" command="/biz/user/info/tranz" action="user/info/doBiz.do?value(userId)={userId}&amp;value(biz)={tranz}"   />
      <activity name="update_review" desc="审核" command="/biz/user/info/tranz" action="user/info/doBiz.do?value(userId)={userId}&amp;value(biz)={tranz}"   />
      <activity name="tranz" desc="状态迁移" command="/biz/user/info/tranz" action="user/info/doBiz.do?value(userId)={userId}&amp;value(biz)={tranz}"   />
      <activity name="search" desc="查询" command="/biz/user/info/search" action="user/info/search.do?value(biz)={tranz}"   />
      <activity name="detail" desc="详细信息" command="/biz/user/info/detail" action="user/info/detail.do?value(userId)={userId}&amp;value(biz)={tranz}"   />
    </activities>
  
   <statuses>
      <status id="0" name="register2apply" desc="注册待提交"  />
      <status id="1" name="register2review" desc="注册待审核"  />
      <status id="2" name="normal" desc="正常"  />
      <status id="3" name="register_refused" desc="注册拒绝"  />
      <status id="4" name="update2apply" desc="变更待提交"  />
      <status id="5" name="update2review" desc="变更待审核"  />
      <status id="6" name="update_refused" desc="变更拒绝"  />
      <status id="7" name="unregistered" desc="已注销"  />
    </statuses>
    

<transitions>


<transition name="register" desc="注册" activity="register" initstatus="*" finalstatus="register2apply"   />


<transition name="register_apply" desc="提交" activity="register_apply" initstatus="register2apply" finalstatus="register2review"   />


<transition name="register_accept" desc="接受" activity="register_accept" initstatus="register2review" finalstatus="normal"   />


<transition name="register_refuse" desc="拒绝" activity="register_review" initstatus="register2review" finalstatus="register_refused"   />


<transition name="update_apply" desc="提交" activity="update_apply" initstatus="update2apply" finalstatus="update2review"   />


<transition name="update_accept" desc="接受" activity="update_review" initstatus="update2review" finalstatus="normal"   />


<transition name="update_refuse" desc="拒绝" activity="update_review" initstatus="update2review" finalstatus="update_refused"   />


<transition name="update_0_0" desc="变更" activity="update_0_0" initstatus="register2apply" finalstatus="register2apply"   />


<transition name="update_2_4" desc="变更" activity="update" initstatus="normal" finalstatus="update2apply"   />


<transition name="update_3_0" desc="变更" activity="update" initstatus="register_refused" finalstatus="register2apply"   />


<transition name="update_4_4" desc="变更" activity="update" initstatus="update2apply" finalstatus="update2apply"   />


<transition name="update_6_4" desc="变更" activity="update" initstatus="update_refused" finalstatus="update2apply"   />


<transition name="unregister_0_7" desc="注销" activity="unregister" initstatus="register2apply" finalstatus="unregistered"   />


<transition name="unregister_2_7" desc="注销" activity="unregister" initstatus="normal" finalstatus="unregistered"   />


<transition name="unregister_3_7" desc="注销" activity="unregister" initstatus="register_refused" finalstatus="unregistered"   />


<transition name="unregister_4_7" desc="注销" activity="unregister" initstatus="update2apply" finalstatus="unregistered"   />


<transition name="unregister_6_7" desc="注销" activity="unregister" initstatus="update_refused" finalstatus="unregistered"   />



<transition name="search" desc="查询" activity="search"   />


<transition name="detail" desc="详细信息" activity="detail"   />


</transitions>

  </fsm>
</fsms>

4.11     基于Map的Form

Struts中使用ActionForm封装Form数据,ActionForm可以有三种实现方式:

1.       静态Bean的方式:继承ActionForm,直接为每一个form数据写setter/getter方法;

2.       动态Bean的方式:使用通用的DynaActionForm类,不需要写任何java代码,直接在struts-config.xml中定义form数据;

3.       基于Map的方式:继承ActionForm,用Map类型的成员变量存储所有form数据,只需要一个setter/getter方法,如setValue(String key, String value)/getValue(String key),在jsp页面中就可以直接通过key访问Map中的数据,如property="value(userIdno)"

RA中就使用了第三种方式,这样做的好处是:在Web层,数据项只与jsp文件相关,在struts-config.xml文件和WebAction中不会有任何与数据项相关的代码,这对减少定制开发的工作量和快速适应需求变更是至关重要的。

4.12     基于Struts-Tiles的页面布局

页面布局的定制涉及到两类文件,一类是页面布局JSP文件,另一类是页面布局定义XML文件。

1.                页面布局JSP文件:就是普通的JSP文件,在JSP中使用struts-tile提供的TAG,可以插入各种布局定义;

2.                页面布局定义XML文件:以典型的top/left/body/foot布局为例,说明定制页面布局的方法。

文件名

WEB-INF"common"layout"classic"layout.jsp

内容

<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>

<html>

 <head>

    <title><tiles:getAsString name="title"/></title>

 </head>

 <body leftmargin="0" topmargin="0">

    <table border="0" width="100%" height="100%" cellspacing="0" cellpadding="0">

      <tr>

        <td colspan="3" height="20">

          <tiles:insert attribute="header" />

        </td>

      </tr>

      <tr>

        <td width="140" valign="top">

          <tiles:insert attribute="menu"/>

        </td>

        <td width="20" valign="top">

        </td>

        <td width="*" valign="top" align="left">

          <tiles:insert attribute="body" />

        </td>

      </tr>

      <tr>

        <td colspan="3" height="20">

          <tiles:insert attribute="footer" />

        </td>

      </tr>

    </table>

 </body></html>

解释

这个JSP文件定义了如下的布局:

Header

Menu

Body

Footer

文件名

WEB-INF"common"layout"classic"header.jsp

内容

<center>KOAL RA 4.9.0 DEMO</center>

<hr>

解释

这个示例的header.jsp非常简单,只是显示了一个产品标识。实际使用中往往由美工进行设计,并会有一些链接。

文件名

WEB-INF"common"layout"classic"footer.jsp

内容

<hr>

<center>Copyright KOAL Software Co. Ltd. 1997-2003</center>

解释

这个示例的footer.jsp也非常简单,只是显示了一个公司标识。实际使用中往往由美工进行设计,并会有一些链接。

文件名

WEB-INF"common"layout"classic"tiles-config.xml

内容

<?xml version="1.0" encoding="GB2312"?>

<tiles-definitions>

 <definition name="classic" page="/WEB-INF/common/layout/classic/layout.jsp">

    <put name="title" value="Classic Layout"/>

    <put name="header" value="/WEB-INF/common/layout/classic/header.jsp"/>

    <put name="menu" value="/WEB-INF/common/layout/classic/menu.jsp"/>

    <put name="footer" value="/WEB-INF/common/layout/classic/footer.jsp"/>

    <put name="body" value="/WEB-INF/common/layout/classic/body.jsp"/>

 </definition>

</tiles-definitions>

解释

这个布局定义文件定义了基本的布局元素。这些元素都可以被重载,以显示不同的内容。在struts中可以直接forward到一个tiledefinition,如这个示例的classic,就会显示出layout.jsp

文件名

WEB-INF"module"sys"config"tiles-config.xml

内容

<?xml version="1.0" encoding="GB2312"?>

<tiles-definitions>

 

 <definition name="sys" extends="classic">

    <put name="title" value="证书注册中心-系统管理" />

    <put name="menu" value="/WEB-INF/module/sys/jsp/menu.jsp" />

 </definition>

 <definition name="about" extends="sys">

    <put name="title" value="证书注册中心-系统管理-关于" />

    <put name="body" value="/WEB-INF/module/sys/jsp/about.jsp" />

 </definition>

 <definition name="cfgINFO" extends="sys">

    <put name="title" value="证书注册中心-系统管理-基本信息配置" />

    <put name="body" value="/WEB-INF/module/sys/jsp/info.jsp" />

 </definition>

 <definition name="cfgDB" extends="sys">

    <put name="title" value="证书注册中心-系统管理-数据库配置" />

    <put name="body" value="/WEB-INF/module/sys/jsp/db.jsp" />

 </definition>

 <definition name="cfgCA" extends="sys">

    <put name="title" value="证书注册中心-系统管理-CA服务器配置" />

    <put name="body" value="/WEB-INF/module/sys/jsp/ca.jsp" />

 </definition>

 …………

</tiles-definitions>

解释

这个布局定义文件定义了“系统管理”模块的布局元素。注意extends的配置,它重载了先前对这些页面元素的定义,使他们指向新的页面。

然后,需要将页面布局的定义加入到struts-config.xml中,这样struts中才可以使用这些定义。如下表所示:

文件名

WEB-INF"module"sys"config"struts-config.xml

内容

 …………

 <plug-in className="org.apache.struts.tiles.TilesPlugin" >

    <set-property property="definitions-config"

      value=" /WEB-INF/common/layout/classic/tiles-config.xml,

          /WEB-INF/module/sys/config/tiles-config.xml" />

    <set-property property="moduleAware" value="true" />

    <set-property property="definitions-parser-validate" value="true" />

 </plug-in>

 …………

解释

Tiles的初始化是采用plug-in机制实现的,可以看到,这里初始化了两个布局定义文件,后面一个重载了前面一个的部分定义。

最后,在struts-config.xml中是这样使用页面布局的:

文件名

WEB-INF"module"sys"config"struts-config.xml

内容

   

    …………

    <action

      path="/about"

      type="org.apache.struts.actions.ForwardAction"

      parameter="about">

    </action>

    <action

      path="/cfgINFO"

      name="emptyForm"

      scope="request"

      type="com.koal.ra.webAction.ButtonAction"

      input="cfgINFO"

      parameter="cfg.cfgINFOLoad">

     

      <forward name="save" path="/cfgINFOSave.do" redirect="false"/>

    </action>

    …………

解释

注意这里的parameterinput,它们直接指向了tiles-config.xml中的定义。

5        RA总体效果

5.1   系统主页

图表 15系统主页

5.2   用户RA

图表 16系统主界面

5.2.1.1       用户查询

      选择界面左侧菜单目录用户查询,将会列出所有用户信息的列表,列表的“可选业务”栏中显示对应用户当前能进行的操作。      

图表 17查询界面(用户RA

5.2.1.2       证书签发

    当用户通过证书签发审核后,即可进行证书签发操作

图表 18签发证书列表(用户RA

图表 19证书签发界面(用户RA

5.3   企业RA

      企业是一类特殊的用户,所以企业RA的功能和操作流程与用户RA基本相同,只是在个别页面和名词上有所差异。

5.4   设备RA

主要负责RA设备证书的签发,废除,下载。

图表 20设备RA主界面

5.4.1 查询设备证书流程

      查看现有的设备证书及其信息:

图表 21设备证书列表

5.4.2 设备证书详细信息界面

      将设备证书以文件形式保存到本地。

图表 22设备证书详细信息界面

5.5   系统管理

      提供了配置RA系统的参数、日志管理、RA机构管理、信息统计等功能。

5.5.1 系统配置

      配置RA系统的基本信息以及与外部系统的相关参数。

图表 23系统配置主界面

5.5.2 日志管理

      提供给管理员查看系统日志和操作日志的功能。

5.5.2.1       系统日志

      系统日志记录了系统运行时的有关信息,日志存放的位置由log4j.property配置文件决定。

图表 24系统日志界面

5.5.2.2       操作日志

      操作日志记录了管理员进入RA系统后进行的所有操作信息,操作日志存放于数据库中。

图表 25操作日志界面

5.5.3 RA机构管理

      对该RA中心及其下属RA机构进行查看、创建、更新和删除操作。

图表 26查看RA机构界面

5.5.4 信息统计

      统计该RA中心及其各级下属RA机构的用户信息、用户证书、企业证书、管理员证书和设备证书等信息。

5.5.4.1       用户信息

      统计该RA中心及其各级下属RA机构下的用户信息。

图表 27 查看用户信息界面

5.5.4.2       用户证书

      统计RA总中心及其各级下属RA机构下各种类型用户证书的签发状况。

图表28统计用户证书界面

6        结束语

在整个PKI体系中,RA起到一个至关重要的作用,它负责对证书申请者进行资格审查,并决定是否同意给该申请者发放证书。CA中心以集中发放证书或网上发放证书为主要发证模式;在这种情况下,用户注册、注册审核、统一发证等各个业务步骤都必须统一化、规范化,这都可以由RA中心来实现。

最后我要感谢软件学院的所有领导和老师对我的细心指导及热情的帮助,没有他们,就没有今天的我即将顺利毕业,走向满意的工作岗位的机会。感谢格尔软件公司给我的这个实习机会,让我得到了成长与锻炼。

7        词汇表

CACertificate Authority证书管理系统,也称认证中心,具备有限的策略制定功能,担任具体的用户公钥证书的签发、生成和发布及CRL生成及发布职能

RARegister Authority 注册管理系统(指本系统),是受理和审核证书申请等业务的系统。

RA总中心:完整独立的RA系统,并为RA分中心提供证书功能服务和管理。

RA分中心:非完全独立的RA系统,作为RA总中心的分支机构,RA分中心依赖于RA总中心提供证书功能。RA分中心下只能添加RA机构。

RA机构:是对用户和管理员的逻辑划分,在RA机构下还可以有下属的RA机构。

数字证书:包含实体基本资料、公钥和扩展项的数据集,一般有加密证书和签名证书两种。

设备证书:为整个数字证书认证系统内的各功能系统(即设备)签发的数字证书,一般仅包含签名证书。

RA操作终端:PC机,RA操作人员在RA操作终端来使用本系统。

PKIPublic Key Infrastructure 公钥基础设施,是提供公钥加密和数字签名服务的系统或平台,目的是为了管理密钥和证书安全并负责验证数字证书持有者身份的一种体系。

证书认证系统:是对生存周期内的数字证书进行全过程管理的安全系统。

私钥:在公共密码系统中,用户的密钥对中只有用户本身才能持有的密钥。

公钥:在公共密码系统中,用户的密钥对中可以被其他用户所持有的密钥。

8        参考文献

1.            《公钥基础设施(PKI)实现和管理电子安全》[] Andrew Nash 等著 清华大学出版社

2.            Struts: http://jakarta.apache.org/struts

3.            Tiles: http://jakarta.apache.org/struts/userGuide/dev_tiles.html

4.            Validator:http://jakarta.apache.org/struts/userGuide/dev_validator.html

5.            Struts-Layout: http://struts.application-servers.com/

6.            Common-Controls: http://www.common-controls.com/

7.            《格尔RA产品客户化开发指南》

8.            《格尔RA产品高级需求》

9.            《格尔RA产品架构设计》

10.       《格尔RA产品用户手册》

posted @ 2008-05-31 13:12  山抹微云  阅读(10115)  评论(5编辑  收藏  举报