I Servizi dell'architettura Web Services Tito Flagella tito@link.it Lorenzo Nardi nardi80@gmail.com
La struttura del messaggio SOAP Un messaggio SOAP consiste di: Envelope, identifica il contenuto del messaggio e include: Header, opzionali, contengono informazioni relative al messaggio (meta-dati) Body, contiene i documenti XML di richiesta o di risposta 2
Struttura di un messaggio SOAP <?xml version= 1.0?> <soap:envelope xmlns:soap= http://schemas.xml.soap.org/soap/ envelope/ > <soap:header> (opzionale) </soap:header> <soap:body> (payload, obbligatorio) </soap:body> </soap:envelope> 3
SOAP: Header e Body Supponiamo di inviare i dati di un'ordine. I dati relativi alla business logic dell'applicazione (dettagli degli articoli, indirizzo di spedizione,...) saranno inseriti nel body. I meta-dati, necessari per l'attivazione di funzionalita' aggiuntive (Quality of Service, come sicurezza o affidabilità) saranno inseriti modularmente nell'header. 4
Gli Header SOAP L'header è un generico contenitore di informazione di controllo Può contenere un numero arbitrario di elementi da qualunque namespace L'elemento header è opzionale 5
Gli Header SOAP (2) Un elemento dell'header ha due attributi speciali: mustunderstand, che puo assumere i valori: 1, indica che il ricevente deve sapere gestire l Header, altrimenti deve restituire un messaggio di Fault 0, o attributo non presente, indica che il ricevente può ignorare l Header e continuare nella gestione del messaggio. l actor che specifica l URI dell endpoint che deve gestirlo. 6
Progettare un servizio Infrastrutturale Cosa significa definire un nuovo servizio architetturale: Introdurre un nuovo header-name; Definire la sintassi xml dell'header (la specifica SOAP lascia piena liberta' di estensione) Specifica xsd Assegnare una semantica non ambigua ai possibili contenuti dell'header sintatticamente ammissibili Tipicamente quanto sopra corrisponde alla specifica di un servizio architetturale WS-Addressing WS-Security Alcuni servizi utilizzano anche pacchetti applicativi per lo scambio di informazioni tra le componenti Necessari per mettere a disposizione al programmatore funzionalita' a livello infrastrutturale 7
WS-Addressing SOAP non è completamente neutrale rispetto al trasporto Ad esempio il destinatario non è incluso nel pacchetto ma è l'indirizzo del canale di trasporto Questi problemi rendono difficile gestire profili asincroni in cui la risposta non arriva sulla stessa connessione http della richiesta. WS-Addressing risolve queste problematiche tramite l'introduzione di appositi header: wsa:to, wsa:action, wsa.messageid, wsa:from, wsa:replyto, wsa:faultto 8
WS-Addressing (2) To: (obbligatorio)indica l'endpoint a cui e' destinato il messaggio Action: (obbligatorio) indica l'operazione o l'azione che deve esser presa per questo messaggio. ReplyTo: (opzionale) specifica la locazione a cui inviare la risposta. Se non specificato o settato ad anonymous usa il canale previsto dal livello trasporto FaultTo: (opzionale) Simile al replyto, ma per i messaggi di errore. MessageId: (opzionale nei Oneway) indica un identificatore univoco del messaggio RelatesTo: (obbligatorio nelle risposte) nei messaggi di risposta indica il MessageId della richiesta. http://www.srdc.metu.edu.tr/webpage/seminars/webservices/ws-addressing.ppt 9
WS-ReliableMessaging Alcuni livelli di trasporto non forniscono garanzie sull'effettiva consegna dei messaggi ai destinatari Sorry, HTTP non è un protocollo affidabile... WS-ReliableMessaging definisce un layer applicativo che fornisce garanzie di affidabilità anche per livelli di trasporto non affidabili 10
WS-Relaibale Messaging Endpoint A Endpoint B Establish Protocol Preconditions (Policy exchange, endpoint resolution, establishing trust) Create Sequence Create Sequence Response (Identifier=http://fabrikam.com) Message 1 Message 2 Message 3, LastMessage Sequence Acknowledgement (Acknowledgement Range=1,3) Message 2, AckRequested Sequence Acknowledgement (Acknowledgement Range=1..3) Terminate Sequence 11
Creazione della Sequenza <soap:envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:header xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing"> <MessageID>urn:uuid:4eb39189-47ee-4d50-9cb3-fe8b4e8e1538</MessageID> <To>http://localhost:8080/ese8/Ordine</To> <ReplyTo><Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous </Address></ReplyTo> <FaultTo><Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous< /Address></FaultTo> <Action>http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequence</Action> </soap:header> <soap:body> <ns2:createsequence xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:ns2="http://schemas.xmlsoap.org/ws/2005/02/rm"> <ns2:acksto><address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymo us</address></ns2:acksto> <ns2:expires>pt0s</ns2:expires> <ns2:offer> <ns2:identifier>urn:uuid:6c80ba54-6ba6-4df1-ab0e-2897c773a319</ns2:identifier> <ns2:expires>pt0s</ns2:expires> </ns2:offer> </ns2:createsequence> </soap:body></soap:envelope> 12
Risposta alla creazione sequenza <soap:envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:header xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing"> <MessageID>urn:uuid:6bd5e6e7-246c-430f-b5fb-40f4ef49b5b6</MessageID> <To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</To> <RelatesTo>urn:uuid:4eb39189-47ee-4d50-9cb3-fe8b4e8e1538</RelatesTo> <Action>http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequenceResponse </Action> </soap:header> <soap:body> <ns2:createsequenceresponse> <ns2:identifier>urn:uuid:b22e24bc-6e74-46cf-9c42-bf7faf1bbdbe</ns2:identifier> <ns2:expires>p0y0m0dt0h0m0.0s</ns2:expires> <ns2:accept> <ns2:acksto> <Address>http://localhost:8080/ese8/Ordine</Address> </ns2:acksto> </ns2:accept> </ns2:createsequenceresponse> </soap:body></soap:envelope> 13
Invio Messaggio <soap:envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:header> <MessageID >urn:uuid:2334fc6f-d89a-46ae-baba-a70d24300e88</messageid> <To>...</To> <ReplyTo>...</ReplyTo> <FaultTo>...</FaultTo> <Action>http://rivenditore.org/SubmitOrdine</Action> <wsrm:sequence xmlns:wsrm="http://schemas.xmlsoap.org/ws/2005/02/rm"> <wsrm:identifier>urn:uuid:b22e24bc-6e74-46cf-9c42-bf7faf1bbdbe</wsrm:identifier> <wsrm:messagenumber>1</wsrm:messagenumber> </wsrm:sequence> </soap:header> <soap:body> <ordine>...</ordine> </soap:body> </soap:envelope> 14
Messaggio di Ack <soap:envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:header> <MessageID>...</MessageID> <To>...</To> <ReplyTo>...</ReplyTo> <Action>http://schemas.xmlsoap.org/ws/2005/02/rm/SequenceAcknowledgement</A ction> <wsrm:sequenceacknowledgement xmlns:wsrm="http://schemas.xmlsoap.org/ws/2005/02/rm"> <wsrm:identifier>urn:uuid:b22e24bc-6e74-46cf-9c42-bf7faf1bbdbe</wsrm:identifier> <wsrm:acknowledgementrange Lower="1" Upper="1" /> <wsrm:acknowledgementrange Lower="3" Upper="3" /> </wsrm:sequenceacknowledgement> </soap:header> <soap:body/> </soap:envelope> Domanda: come procede la conversazione? 15
Transazioni nel mondo Web Service Abbiamo analizzato le problematiche relative all'accesso concorrente in un database Immaginiamo adesso di analizzare quelle stesse problematiche in un ambiente distribuito Una delle operazioni parte di una stessa transazione può non terminare con successo decretando il fallimento delle altre. Come coordinare tutti i servizi coinvolti? Aggiungere le note problematiche delle comunicazioni remote. Tempi estesi a causa del livello di trasporto. Le risorse non possono essere impegnate a tempo indefinito 16
WS-Coordination e WS-Transaction WS-Coordination definisce un framework generico per il coordinamento di un servizio all'interno di un'attivita che puo' coinvolgere piu' servizi. WS-Transaction estende questo framework con due modalita' aggiuntive Atomic Transaction: per transazioni di breve durata. Se una attivita' fallisce, vengono abortite tutte le attivita' della transazione. Business Activity: per transazioni di lunga durata. Modifiche subito permanenti (committate) gestendo le operazioni di compensazione in caso di rollback. 17
Configurazione in CXF Nel file beans.xml di CXF <cxf:bus> <cxf:features> <cxf:logging/> <wsa:addressing/> <wsrm-mgr:reliablemessaging> <wsrm-policy:rmassertion> <wsrm-policy:baseretransmissioninterval Milliseconds="4000"/> <wsrm-policy:acknowledgementinterval Milliseconds="2000"/> </wsrm-policy:rmassertion> </wsrm-mgr:reliablemessaging> </cxf:features> </cxf:bus> 18
Gestione a carico del programmatore Come utilizzare i servizi nelle applicazioni: Dipende dall'ambiente di programmazione In Java JAX-WS offre un supporto generico per operare sugli header Handler, MessageLevelService su messaggio SOAP completo Resta il problema di operare sulla semantica dello specifico servizio JAX-WS permette di accedere all'xml ma non ha nessun supporto per la gestione delle funzionalita' specifiche del servizio Per questo si usano API non standard (es, per la sicurezza WSS4J, XWSS,...) 19
Uso degli handler in JAX-WS public class SOAPLoggingHandler implements SOAPHandler<SOAPMessageContext> {... public boolean handlemessage(soapmessagecontext smc) { logtosystemout(smc); return true; } public boolean handlefault(soapmessagecontext smc) { logtosystemout(smc); return true; } public void close(messagecontext messagecontext) { }... 20
Uso degli Handler in JAX-WS private void logtosystemout(soapmessagecontext smc) { Boolean outboundproperty = (Boolean) smc.get (MessageContext.MESSAGE_OUTBOUND_PROPERTY); if (outboundproperty.booleanvalue()) { out.println("\noutbound message:"); } else { out.println("\ninbound message:"); } } SOAPMessage message = smc.getmessage(); try { message.writeto(out); out.println(""); } catch (Exception e) { out.println("exception in handler: " + e); } 21
Annotazione dell'header @HandlerChain(file = "My_service_handler.xml") My_Service_Handler.xml: <handler-chains xmlns="http://java.sun.com/xml/ns/javaee"> <handler-chain> <handler> <handler-name>mysoaphandler</handler-name> <handler-class>my.implementing.class</handler-class> </handler> <handler>... </handler>... </handler-chain> </handler-chains> 22
Gestione a carico dell'infrastruttura Configurazione dell'application Server per operare sui servizi in maniera trasparente rispetto all'applicazione: Applicazione opera sul body ed ignora gli header L'infrastruttura opera sugli header, in funzione della configurazione impostata per quel servizio Le configurazioni dell'ambiente non sono standard ma dipendono dallo specifico ambiente 23
http/https https (Hypertext Transfer Protocol over Secure Socket Layer) è uno schema di URI usato per indicare una connessione HTTP sicura Il protocollo e' esattamente lo stesso protocollo HTTP, ma la richiesta e la risposta viaggiano su una connessione SSL Richiede quindi certificati x509 e supporta: cifratura del canale autenticazione server Autenticazione client Per default e' usata la porta 443, anzichè la porta 80 24
Sicurezza End2End SSL is only for point to point connections Only usable for a few protocols (mainly HTTP) Only transport of whole document is encrypted Header information no longer readable Routing information (proxy, ws Intermediaries) Calling a set of Web Services? Asynchronous call of Web Services not possible Data unprotected upon reaching the server Authentication of origin lost if more than one service is involved 25
Firma 26
Verifica della Firma 27
Firma Digitale 28
XML Signature RFC 3275: Digitally sign document and represent in XML Result is (still) an XML document XPath to locate and identify parts to be signed Multiple signatures can be added to one document Choose parts of documents to sign Calculate digest (or hash sum) of each part (after canonization) Build <SignedInfo> element (contains digest, used algorithms, XPath) Calculate digest of SignedInfo and sign it -> <SignatureValue> SignedInfo, SignatureValue, KeyInfo are added to document in <Signature> 29
XML Encryption Encrypting or decrypting whole or partial XML document or binary data References XML Signature specification <EncryptedData> element(s) in SOAP body (and header) Can encrypt leaf element or element tree http://www.w3.org/encryption/2001 30
WS-Security (1) Comunicazioni con intermediari WS-Security fornisce gli strumenti necessari a garantire la sicurezza e la flessibilita' necessarie ad effettuare comunicazioni di dati sensibili in presenza di punti intermedi Authentication Signature Ecnryption Non repudiation 31
WS-Security (2) <S:Envelope xmlns:s="..."> <S:Header> <wsse:security xmlns:wsse="..."> <wsse:usernametoken> <wsse:username>alice</wsse:username> <wsse:password>pwd</wsse:password> </wsse:usernametoken> </wsse:security> <S:Header> <S:Body>...</S:Body> <S:Envelope xmlns:s="..."> 32
WS-Security (3) 33
Security Message <S: Envelope xmlns:s= http:// xmlns:wsse= http:// xmlns:xenc= http:// <S:Header> <wsse:security> <wsse:binarysecuritytoken> ID= MyToken </wsse:binarysecuritytoken> <xenc:encryptedkey> <xenc:referencelist> <xenc:datareference URI= #enc /> </xenc:referencelist> </xenc:encryptedkey> <ds:signature> </ds:signature> </wsse:security> </S:Header> Key used to encrypt message Contains signature algorithm, key info, and signature value Key used for the signature
Configurazione WS-Security Usiamo lo strumento XWSS (XML and Web Service security), un framework java per WS-Security Predisponiamo un file di configurazione xml nel formato supportato da XWSS Predisponiamo un handler che invoca XWSS, passandogli come input la configurazione predisposta Agganciamo l'header al servizio usando l'annotazione JAX-WS 35
Configurazione XWSS per UsernameToken <xwss:securityconfiguration dumpmessages="true" xmlns:xwss=" http://java.sun.com/xml/ns/xwss/config"> <xwss:usernametoken name="ron" password="nor"/> <xwss:requireusernametoken/> </xwss:securityconfiguration> 36
Handler per Processare l'header XWSSProcessorFactory factory = XWSSProcessorFactory.newInstance(); XWSSProcessor cprocessor = factory.createprocessorforsecurityconfiguration(configfile, handler); ProcessingContext context = new ProcessingContext(); context.setsoapmessage(msg); // Gestione Lato Client // Gestisco il messaggio (decifro, controllo firma etc..) secondo la configurazione passata SOAPMessage securemsg = cprocessor.secureoutboundmessage(context); //Gestione Lato Server // Gestisco il messaggio (decifro, controllo firma etc..) secondo la configurazione passata SOAPMessage verifiedmsg= sprocessor.verifyinboundmessage(context); 37
Trasporto di uno UsernameToken <SOAP-ENV:Envelope xmlns:soap- ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Header> <wsse:security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401- wss-wssecurity-secext-1.0.xsd" SOAP-ENV:mustUnderstand="1"> <wsse:usernametoken xmlns:wsu="http://docs.oasisopen.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:id="xwssgid-1210628119633-78222534"> <wsse:username>ron</wsse:username> <wsse:password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wssusername-token-profile-1.0#PasswordDigest"></wsse:Password> <wsse:nonce EncodingType="http://docs.oasisopen.org/wss/2004/01/oasis-200401-wss-soap-messagesecurity-1.0#Base64Binary">RPHDMIc+/Jn+E7Zf6aMziWJr</wsse:Nonce> <wsu:created>2008-05-12t21:35:19z</wsu:created> </wsse:usernametoken> </wsse:security> </SOAP-ENV:Header> <SOAP-ENV:Body>... </SOAP-ENV:Body> </SOAP-ENV:Envelope> 38
Configurazione Encryption <xwss:securityconfiguration dumpmessages="true" xmlns:xwss="http://java.sun.com/xml/ns/xwss/config"> <xwss:encrypt> <xwss:x509token certificatealias="s1as"/> </xwss:encrypt> </xwss:securityconfiguration> Possiamo aggiungere l'elemento <xwss:encryptiontarget> per indicare l'elemento da cifrare(nella forma namespace.localname). Se non viene specificato di default cripta il body. <xwss:encryptiontarget type="qname">{http://rivenditore.org/}ordine</xwss:target> 39
Busta cifrata WS-Sec (1) <SOAP-ENV:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Header> <wsse:security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wsswssecurity-secext-1.0.xsd" SOAP-ENV:mustUnderstand="1"> <wsse:binarysecuritytoken xmlns:wsu="http://docs.oasisopen.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-messagesecurity-1.0#Base64Binary" ValueType="http://docs.oasisopen.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" wsu:id="xwssgid-1210630311275-1894529781">miic8z...y84oe</wsse:binaryse curitytoken> <xenc:encryptedkey xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"> <xenc:encryptionmethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5"/> <ds:keyinfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> <wsse:securitytokenreference> <wsse:reference URI="#XWSSGID-1210630311275-1894529781" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-tokenprofile-1.0#X509v3"/> </wsse:securitytokenreference></ds:keyinfo> <xenc:cipherdata><xenc:ciphervalue>p7hsj9mw...xkye4e=</xenc:ciphervalue> </xenc:cipherdata> <xenc:referencelist><xenc:datareference URI="#XWSSGID-1210630312066-953587955"/> </xenc:referencelist> 40
Busta Cifrata WS-Sec (2) </xenc:encryptedkey> </wsse:security> </SOAP-ENV:Header> <SOAP-ENV:Body> <xenc:encrypteddata xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" Id="XWSSGID-1210630312066-953587955" Type="http://www.w3.org/2001/04/xmlenc#Content"> <xenc:encryptionmethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledescbc"/> <xenc:cipherdata> <xenc:ciphervalue>q33vnnqinm1najh2en...hd +YnIqQU=</xenc:CipherValue> </xenc:cipherdata> </xenc:encrypteddata> </SOAP-ENV:Body> </SOAP-ENV:Envelope> 41
Configurazione Firma <xwss:securityconfiguration dumpmessages="true" xmlns:xwss="http://java.sun.com/xml/ns/xwss/config" > <xwss:sign> <xwss:x509token certificatealias="xws-security-client"/> <xwss:signaturetarget type="qname" value="soap-body"/> </xwss:sign> <xwss:requiresignature/> </xwss:securityconfiguration> Indica il certificato e la parte da firmare. Viene in automatico aggiunto anche il timestamp, obbligatorio quando si firma. 42
Estratto Busta Firmata <SOAP-ENV:Envelope xmlns:soap-env="..."> <SOAP-ENV:Header> <wsse:security xmlns:wsse="..." SOAP-ENV:mustUnderstand="1"> <wsse:binarysecuritytoken...>...</wsse:binarysecuritytoken> <ds:signature xmlns:ds="..."> <ds:signedinfo> <ds:canonicalizationmethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">... </ds:canonicalizationmethod> <ds:signaturemethod Algorithm="...#rsa-sha1"/> <ds:reference URI="#XWSSGID-12106336689631575868911">... </ds:reference> <ds:reference URI="#XWSSGID-1210633668967598841935">...</ds:Reference> </ds:signedinfo> <ds:signaturevalue>2mp...em0=</ds:signaturevalue> <ds:keyinfo>... </ds:keyinfo></ds:signature> <wsu:timestamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurityutility-1.0.xsd" wsu:id="xwssgid-1210633668967598841935"> <wsu:created>2008-05-12t23:07:48z</wsu:created><wsu:expires>2008-05-12t23:07:53z</wsu:expires> </wsu:timestamp> </wsse:security> </SOAP-ENV:Header> <SOAP-ENV:Body...> <ordine>...</ordine> </SOAP-ENV:Body></SOAP-ENV:Envelope> 43
WS-Policy WS-Policy fornisce uno standard per descrivere requisiti e capacita' di un Web Service E' possibile integrarlo nel WSDL, di modo che i fruitori siano informati delle linee guida e dei QoS richiesti per usare il servizio Se cifrare il messaggio, con quale algoritmo, se implementare WS-RM o WS-A etc.. I tools possono creare stub gia' configurati per soddisfare i requisiti descritti (non tutto puo' essere automatizzato). WS-Policy definisce elementi estensibili utilizzati da altre specifiche per facilitarne la descrizione es. WS-SecurityPolicy 44
WS-Trust e WS-SecureConversation Estendono la specifica WS-Security WS-Trust consente di fornire il proprio token ad un'apposito servizio per ottenere un nuovo token utile quando ad esempio un client si identifica con un protocollo che il server non supporta o quando il server non riconosce le credenziali del client (Identity Management) WS-SecureConversation stabilisce il concetto di security context una sorta di sessione che consente di autenticarsi una sola volta alleviando l'overhead introdotto. 45
WS-SecureConversation Why introduce WS-SecureConversation? Consider the functions of WS-Security message integrity message confidentiality single message authentication 46
WS-SecureConversation What if senders and receivers need to exchange multiple messages? 47
WS-SecureConversation A Feasible Solution Encrypt all messages with a security token issued by a token issuing service. Drawback: the size of each message can become a performance bottleneck. 48
WS-SecureConversation A Better Solution WS-SecureConvsation Similar to SSL Introduce a security context A SecurityContextToken is applied. Once created, the messages are smaller and can be processed faster by both ends. 49
WS-SecureConversation Goals Define how security contexts are established Specify how derived keys are computed and passed Non-Goals Define how trust is established or determined that is done by WS-Trust 50