《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 通信與網(wǎng)絡(luò) > 設(shè)計(jì)應(yīng)用 > 基于JAVA的XKMS服務(wù)簡(jiǎn)單模型實(shí)現(xiàn)
基于JAVA的XKMS服務(wù)簡(jiǎn)單模型實(shí)現(xiàn)
孟 翔1,,3,,薛萬(wàn)國(guó)2
1.中國(guó)科學(xué)技術(shù)大學(xué),北京100039; 2.解放軍總醫(yī)院 計(jì)算機(jī)中心,,北京100853,;3.解放軍
摘要: 使用JAVA語(yǔ)言及相應(yīng)的軟件包,按照XKMS服務(wù)規(guī)范,,建立XKMS服務(wù)模型,,解決在電子病歷系統(tǒng)中涉及PKI系統(tǒng)的密鑰服務(wù)問(wèn)題。
Abstract:
Key words :

摘   要: 使用JAVA語(yǔ)言及相應(yīng)的軟件包,,按照XKMS服務(wù)規(guī)范,,建立XKMS服務(wù)模型,解決在電子病歷系統(tǒng)中涉及PKI系統(tǒng)的密鑰服務(wù)問(wèn)題,。
關(guān)鍵詞: XKMS  XML語(yǔ)言  公鑰體系認(rèn)證PKI  電子病歷

  電子病歷是以電子化方式管理的有關(guān)個(gè)人健康狀態(tài)和醫(yī)療保健行為的信息,。本文所述的電子病歷是基于可擴(kuò)展標(biāo)記語(yǔ)言XML(Extensible Markup Language1.0)技術(shù)實(shí)現(xiàn)的。電子病歷的安全性問(wèn)題涉及完整性,、非否認(rèn)性,、機(jī)密性等,這些問(wèn)題都需要PKI系統(tǒng)的支持,。本文將以一個(gè)簡(jiǎn)單示例介紹XKMS(XML Key Management Specification,,XML密鑰管理規(guī)范)的模型實(shí)現(xiàn),實(shí)現(xiàn)一個(gè)請(qǐng)求公鑰的服務(wù),,為電子病歷XML文檔的加密和簽名提供基于公鑰體系結(jié)構(gòu)PKI(Public Key Infrastructure)的XKMS服務(wù)基礎(chǔ),。
1  XKMS概述
  在加強(qiáng)Web業(yè)務(wù)的安全性方面功不可沒(méi)。但從技術(shù)層面講,,它要求每個(gè)用戶和應(yīng)用程序都要驗(yàn)證與之通信的每個(gè)用戶的身份,,以確保對(duì)方的身份真實(shí)有效。實(shí)際上PKI將所有的信任決定都拋給了用戶,,這要求復(fù)雜的程序庫(kù)和配置信息,。由于PKI的部署過(guò)于復(fù)雜繁瑣,成本昂貴,,因此一直沒(méi)有得到普及應(yīng)用,。
  XML簽名規(guī)范和加密規(guī)范規(guī)定了如何簽名和加密XML文檔,這有助于執(zhí)行關(guān)鍵任務(wù)的應(yīng)用程序使用基于XML的Web服務(wù),。在處理數(shù)字簽名和加密文檔時(shí)要使用PKI,。為方便PKI與XML應(yīng)用程序以及使用這些程序的Web服務(wù)進(jìn)行集成,Microsoft,、Verisign和WebMethods共同發(fā)起,,由W3C發(fā)布了XKMS。XKMS的目標(biāo)就是解決PKI的這些問(wèn)題,。XKMS綜合了XML的互操作性和PKI的安全性,,提供了基于PKI保密應(yīng)用程序的一個(gè)簡(jiǎn)單方法,。應(yīng)用程序可以簡(jiǎn)單地將所有PKI處理程序任務(wù)委托給某個(gè)第三方信任服務(wù),而不是由自己對(duì)復(fù)雜的PKI函數(shù)進(jìn)行編碼,,這樣就可以將工作重點(diǎn)集中在業(yè)務(wù)邏輯上,。
  XKMS簡(jiǎn)化了XML簽名和加密機(jī)制在XML應(yīng)用程序中的使用。XKMS將PKI協(xié)議和數(shù)據(jù)格式替換成基于XML的協(xié)議,,使用XML詞匯來(lái)表示PKI并且支持SOAP消息和WSDL,,使得XKMS服務(wù)對(duì)于平臺(tái)、供應(yīng)商和傳輸協(xié)議都是中立的,,能夠平穩(wěn)地適應(yīng)Web服務(wù)的開(kāi)發(fā)環(huán)境等,。XKMS主要應(yīng)用在客戶對(duì)客戶、應(yīng)用服務(wù)器對(duì)客戶,、服務(wù)器對(duì)服務(wù)器等環(huán)境中,,信任的決定由一個(gè)公共的服務(wù)器完成,XKMS客戶僅需配置服務(wù)器的URI地址和服務(wù)器用來(lái)簽名答復(fù)的證書,。使用不同的URI,,可支持不同的信任模型。XKMS的請(qǐng)求/響應(yīng)都是封裝在SOAP請(qǐng)求/響應(yīng)中的,。
2  XKMS內(nèi)容
  XKMS由XML密鑰信息服務(wù)規(guī)范(XKISS)和XML密鑰注冊(cè)服務(wù)規(guī)范(XKRSS)組成,。XKISS負(fù)責(zé)處理與XML簽名和加密相關(guān)的公鑰處理及驗(yàn)證;XKRSS則用于對(duì)密鑰對(duì)進(jìn)行注冊(cè),。
  XKISS服務(wù)主要支持定位服務(wù)和驗(yàn)證服務(wù)二種操作,。利用定位服務(wù)可以基于標(biāo)識(shí)符信息來(lái)定位和檢索已經(jīng)注冊(cè)的公鑰。在XML簽名環(huán)境中,,<ds:KeyInfo>元素使服務(wù)可以對(duì)數(shù)字簽名進(jìn)行驗(yàn)證,在XML加密環(huán)境中,,<ds:KeyInfo>元素則指定了用于對(duì)文檔進(jìn)行加密的密鑰信息,,<ds:KeyInfo>元素構(gòu)成了這二大密碼學(xué)功能的基礎(chǔ)。定位服務(wù)能夠解析<ds:KeyInfo>元素并向客戶提供所需的公鑰信息,。定位服務(wù)僅限于檢索而不能進(jìn)行驗(yàn)證,。驗(yàn)證服務(wù)能夠驗(yàn)證密鑰對(duì)標(biāo)識(shí)符信息的綁定和有效性狀態(tài)。
  XKRSS的目的是為了響應(yīng)一個(gè)完整的,、基于XML的密鑰生命周期管理協(xié)議的需求,,它支持四種操作,即密鑰的注冊(cè),、重發(fā),、取消和恢復(fù)。
  XKMS目前最新的工作草案是2004年4月發(fā)布的(見(jiàn)http://www.w3.org/TR/2004/CR-xkms2-20040405),,其中定義了具體的XKMS語(yǔ)法和元素,。
3  實(shí)現(xiàn)過(guò)程
  本文示例使用JAVA語(yǔ)言,,利用JAXM(Java API for XML Messaging)軟件包和Apache Axis 1.1工程,在Jakarta Tomcat5服務(wù)器上簡(jiǎn)單演示XKMS中的一種LocateRequest服務(wù),。JAXM使用JAVA平臺(tái)進(jìn)行XML消息通信,。AXIS是Apache的一個(gè)開(kāi)放源代碼項(xiàng)目,是基于JAVA,、SOAP規(guī)范的Web服務(wù)的實(shí)現(xiàn),,它是目前比較出色的SOAP Web容器。Tomcat也是Apache的一個(gè)開(kāi)放源代碼項(xiàng)目,,是一個(gè)優(yōu)秀的Servlet/JSP容器,。
3.1 客戶端
  在客戶端程序中,按照XKMS規(guī)范格式,,生成一個(gè)簡(jiǎn)單的XKMS請(qǐng)求的SOAP消息,,請(qǐng)求內(nèi)容是定位一個(gè)使用者在PKI密鑰庫(kù)中的公鑰??蛻舳顺绦蛉缦拢?br /> public class Request {
   public static void main(String[] args) {
      try {
  SOAPConnectionFactory scFactory=SOAPConnection-Factory.newInstance( ),;
  SOAPConnection con=scFactory.createConnection( );
                  //創(chuàng)建SOAP連接
  MessageFactory factory=MessageFactory.newInstance( ),;
  SOAPMessage message=factory.createMessage( ),;
                   //創(chuàng)建消息
  SOAPPart soapPart=message.getSOAPPart( );//獲取SOAPPart對(duì)象
  SOAPEnvelope envelope=soapPart.getEnvelope( ),;
                   //獲取SOAPEnvelope對(duì)象
  SOAPBody body=envelope.getBody( ),;//獲取SOAPBody對(duì)象
  Name NLocate=envelope.createName(″LocateRequest″,
  ″xkms″,,″http://www.w3.org/TR/CR-xkms2-20040405″),;
                 //創(chuàng)建LocateRequest元素
  SOAPElement Locate=body.addBodyElement(NLocate);
                 //添加LocateRequest元素
    //根據(jù)XKMS格式創(chuàng)建XML元素及內(nèi)容,,代碼省略…,,創(chuàng)建的內(nèi)容結(jié)果見(jiàn)下面的請(qǐng)求信息
  URLEndpoint endpoint=new URLEndpoint(//創(chuàng)建
                  //URLEndpoint對(duì)象
  ″http://localhost:9999/axis/services/XKMSServices″);
  SOAPMessage response=con.call(message, endpoint),;
                  //發(fā)送請(qǐng)求消息,,接收響應(yīng)消息
  con.close( );
  response.writeTo(System.out),;//顯示接收到的消息
  啟用Apache AXIS 的TCPMonitor收到發(fā)送的SOAP消息,,如下:

  在上面的SOAP消息中,<soapenv:Body>元素中的內(nèi)容就是XKMS的請(qǐng)求信息,,以<xkms:LocateRequest>元素為開(kāi)始,,請(qǐng)求返回一個(gè)用戶的公鑰名稱KeyName和公鑰值KeyValue。
3.2 服務(wù)器端
  服務(wù)器端由Tomcat5+AXIS1.1構(gòu)成SOAP服務(wù)器,,接收客戶端程序發(fā)送的消息,,對(duì)消息進(jìn)行解析,,提取請(qǐng)求信息和要求返回的信息,進(jìn)行處理,,返回XKMS響應(yīng),。服務(wù)器端應(yīng)先建立PKI,這里使用Keytools工具,,先建立一個(gè)用戶的RSA密鑰對(duì),,存儲(chǔ)在Keystore中,以便使用,。
  keytool-genkey-alias mengxiang-keyalg RSA-dname ″CN=301,,OU=301,O=301,,L=HaiDian,,S=BeiJing,C=CN″-keypass password-keystore KeyStore-storepass password-storetype JKS
服務(wù)器端接收請(qǐng)求消息,,解析內(nèi)容,,檢索密鑰庫(kù)中用戶的公鑰,進(jìn)行BASE64轉(zhuǎn)換,,按照XKMS規(guī)范生成XKMS響應(yīng)消息,,返回響應(yīng)消息。服務(wù)器端程序簡(jiǎn)示代碼如下:
  public class XKMSServices {
  public Document echoElements(Document elems) {
try {
  MessageContext msgC=MessageContext.getCurrentContext( ),;
             //獲取MessageContext對(duì)象
  Message request=msgC.getRequestMessage( ),;//獲取消息
  SOAPPart sp=request.getSOAPPart( );
  SOAPEnvelope se=sp.getEnvelope( ),;
  SOAPBody sb=se.getBody( ),;
  Iterator it1=sb.getChildElements( );//遍歷元素,,提取信息
  FileInputStream in=new FileInputStream(name),;
               //導(dǎo)入Keystore
  KeyStore ks=KeyStore.getInstance(″JKS″);
  ks.load(in,,pass.toCharArray());
  Certificate c=ks.getCertificate(alias),;//獲取用戶數(shù)字證書
  in.close( ),;
  RSAPublicKey PKey=(RSAPublicKey)c.getPublicKey( );
              //獲取用戶RSA公鑰
  BigInteger BE=PKey.getPublicExponent( ),;//提取指數(shù)
  BigInteger BM=PKey.getModulus( ),;//提取模數(shù)
  byte[ ] bbe=BE.toByteArray( );
  byte[ ] bbm=BM.toByteArray( ),;
  sun.misc.BASE64Encoder encoder=new sun.misc.
  BASE64Encoder( ),;//BSAE64轉(zhuǎn)換類
  String sbe=encoder.encode(bbe),;//BSAE64轉(zhuǎn)換
  String sbm=encoder.encode(bbm);
  DocumentBuilderFactory dbf=DocumentBuilderFactory.
          newInstance( ),;//生成響應(yīng)消息
  DocumentBuilder db=dbf.newDocumentBuilder( ),;
  document=db.newDocument( );
  Element root=document.createElement(″xkms:LocateResult″),;
  root.setAttribute(″xmlns:ds″,,″http://www.w3.org/2000/09/
     xmldsig#″);
      //按照XKMS語(yǔ)法格式創(chuàng)建響應(yīng)消息,,代碼省略創(chuàng)建的內(nèi)容結(jié)果見(jiàn)下面的響應(yīng)SOAP消息
  document.appendChild(root),;
  return document;//返回響應(yīng)
  AXIS 的TCPMonitor接收到響應(yīng)的SOAP消息,,省略SOAP頭形式如下:

  在以上響應(yīng)消息中,,<xkms:LocateResult>元素中包含了XKMS的響應(yīng)內(nèi)容,其中返回了用戶的公鑰名和公鑰值,。<ds:Modulus>中包含了公鑰的模數(shù)的BSAE64編碼后的值,,<ds:Exponent>中包含了公鑰的指數(shù)的BSAE64編碼后的值??蛻舳顺绦蚪邮盏巾憫?yīng)信息后,,可對(duì)其進(jìn)行解析,提取出模數(shù)和指數(shù)字符串,,進(jìn)行反BASE64編碼,,就獲得了真正的模數(shù)和指數(shù)。這樣就可以對(duì)電子病歷XML文檔進(jìn)行加密處理,。
4  總  結(jié)
  XKMS目前仍處于發(fā)展階段,,還將會(huì)進(jìn)一步修訂。實(shí)用過(guò)程中,,還需開(kāi)發(fā)緊密結(jié)合XKMS的API,,將XKMS客戶端和服務(wù)器端的程序模塊化,實(shí)現(xiàn)XKISS和XKRSS中的其他服務(wù),。
參考文獻(xiàn)
1   Nagappan R,,Skoczylas R著,龐太剛,,陶程譯.JAVA Web服務(wù)開(kāi)發(fā).北京:清華大學(xué)出版社,,2004
2   Galbraith B著,吳旭超,,王黎譯.WEB服務(wù)安全性高級(jí)編程. 北京:清華大學(xué)出版社,,2003
3   徐迎曉.JAVA安全性編程實(shí)例.北京:清華大學(xué)出版社,2003
4   Dournaee B著,,周永彬,,賀也平,,劉娟譯.XML安全基礎(chǔ).北京:清華大學(xué)出版社,2003

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載,。