Главная » Java, Web, XML » Средства Java для шифрования XML

0

Фирма IBM выпустила пакет интерфейсов и классов XSS4J (XML Security Suite for Java), реализующих спецификацию "XML Encryption", рекомендации RFC 3275, RFC 3076, методы авторизации и получения сертификатов, методы приведения к каноническому виду. Пакет XSS4J можно свободно скопировать, он доступен по адресу

http://www-106.ibm.com/developerworks/webservices/library/xmlsecuritysuite/.

Для применения классов и интерфейсов пакета XSS4J достаточно добавить полученный при копировании архив xss4j.jar в библиотеку классов J2SE SDK, например, в каталог                                              или добавить путь к

архиву в переменную                  Пакет XSS4J требует для своей работы на

личия стандартного Java Security API, входящего в состав J2SE SDK. Кроме того, нужен XML-анализатор, например, Apache Xerces2, и XSLT- процессор, например, Apache Xalan-J. Пакет XSS4J входит в состав не раз упоминавшегося в этой книге набора IBM WSTK и в состав интегрированной среды разработки IBM WebSphere Studio.

Сообщество Apache Software Foundation выпустило пакет "Apache XML Security", доступный по адресу http://xml.apache.org/security/. В него входят средства шифрования, реализующие спецификацию "XML Encryption", и средства создания цифровой подписи по рекомендациям RFC 3275 и RFC 3076. Пакет можно использовать отдельно или в составе других инструментальных средств XML. Он входит, например, в набор средств создания Web-служб Apache Axis, рассмотренный нами в главе 3.

В листинге 8.3 показан пример клиента Web-службы, создающего SOAP- послание, подписывающего его цифровой подписью, отправляющего подписанное послание Web-службе, и ожидающего от нее ответа.

Перед тем как запустить клиентскую программу следует сгенерировать ключи и сертификат и записать их в стандартное хранилище ключей Java — файл                      Это можно сделать утилитой                   из набора J2SE SDK,

набрав следующую командную строку:

keytool -genkey и ответив на вопросы утилиты.

Листинг 8.3. Клиент Web-службы, отправляющий подписанное SOAP-послание

import org.apache.axis.*; import org.apache.axis.client.*;

import import import import

import import

import org.w3c.com.*; import

import j

import j ava. security. *;

import j ava.security.cert.X509Certificate;

public class ClientAxis{

static SOAPEnvelope env = new SOAPEnvelope () ;

public static void main (String [] args) {

if (args.length != 3){

System.err.println("Usage: java ClientAxis" +

" <keystorePassword> <privateKeyPassword>M + " <distinguishedName>") ; } System.exit(0);

try{

Options opts = new Options(args);

Service service = new Service () ;

Call call = (Call)service.createCall() ;

call.setTargetEndpointAddress(

new java.net.URL(opts.getURL()) ) ;

sbe = new XMLUtils.StringToElement(

"http://localhost:8080/EchoService", "getName", " ") ) ; env.addBodyElement(sbe);

sign(args[0], args[l], args[2]);

System.out.println("\nRequest: " ) ;

XMLUtils.PrettyElementToStream(env.getAsDOMO, System.out); call.invoke(env);

=

System.out.println("\nResponse: " ) ; XMLUtils.PrettyElementToStream(

mc.getResponseMessage().getSOAPEnvelope().getAsDOM(), System.out);

)catch(Exceptione) {

e.printStackTtace () ;

}

}

private static void sign(String keystorePassword, String privateKeyPassword, String certificateAlias){

try{

env. addMapping (new Mapping (

"http://schemas.xmlsoap.org/soap/security/2000-12",

"SOAP-SEC"));

env.addAttribute(Constants.URI_S0AP11_ENV,

"actor", "some-uri"); env.addAttribute(Constants.URI_S0AP11__ENV, "mustUnderstand ‘ ‘, "1" ) ;

SOAPHeaderElement header = new SOAPHeaderElement( XMLUtils.StringToElement(

"http://schemas.xmlsoap.org/soap/security/2000-12", "Signature", " ") ) ;

env.addHeader(header);

Document doc = soap2dom(env) ;

KeyStore ks = KeyStore.getlnstance("JKS"); FilelnputStream fis = new FileInputStream(".keystore") ;

ks.load(fis, keystorePassword.toCharArray());

PrivateKey privateKey =

privateKeyPassword.toCharArray());

Element soapHeaderElement =

(Element)((Element)doc.getFirstChild()).

getElementsByTagNameNS("*", "Header").item(O);

Element soapSignatureElement = (Element)soapHeaderElement.

getElementsByTagNameNS("*", "Signature").item(O);

XMLSignature sig = new XMLSignature(doc, "http://xml-security", XMLSignature.ALGO_ID_SIGNATURE_DSA);

soapSignatureElement.appendChild(sig.getElementO); sig.addDocument("#Body");

X509Certificate cert =

(X509Certificate)ks.getCertificate(certificateAlias);

sig.addKeylnfo(cert);

sig.addKeylnfo(cert.getPublicKey());

sig.sign(privateKey);

Canonicalizer cl4n = Canonicalizer.getInstance(

Canonicalizer.ALG0_ID_C14N_WITH_C0MMENTS);

byte[] canonicalMessage = cl4n.canonicalizeSubtree (doc);

IrputScuree is = new inputsource(

new java.io.ByteArraylnputStream(canonicalMessage));

DeserializationContextlmpl dser = null;

AxisClient tmpEngine =

new AxisClient(new NullProvider());

MessageContext msgContext -

newMessageContext (tmpEngine) ;

dser = new DeserializationContextlmpl(is, msgContext, Message.REQUEST) ,-

dser.parse();

}catch(Exceptione) {

e.printStackTrace () ;

throw new RuntimeException (e. toString () ) ;

}

}

private static Document soap2ciom(S0AIEnvelcpfi env) throws Exception!

StringWriter writer = new StringWriter();

SerializationContextlmpl ctx =

new SerializationContextlmpl(writer);

env.output(ctx); writer.close();

Reacer reacer = new StringReader(writer.getBuffer().toString()); Document coc = XMLUtils.newDocument(new InputSource(reader)); if (cbc == null) throw new Exception () ; return coc;

}

}

Существует еще много коммерческих и свободно распространяемых средств шифрования документов XML. Каждый месяц появляются новые средства, их списки можно просмотреть на сайтах Интернета, посвященных XML.

Литература:

Хабибуллин И. Ш. Разработка Web-служб средствами Java. — СПб.: БХВ-Петербург, 2003. — 400 с: ил.

По теме:

  • Комментарии