RESTful EPP (EPP maar dan anders)
- Door: Maarten Wullink
- 26 april 2012 - 13:30 uur
Het Domeinnaamregistratiesysteem (DRS) van SIDN kan via twee verschillende kanalen worden aangesproken. Er is een Web-GUI, waarmee handmatig de DRS-handelingen kunnen worden uitgevoerd. En er is een EPP-interface (API), die erg geschikt is om op een geautomatiseerde manier DRS aan te spreken.[meer...]
EPP (Extensible Provisioning Protocol) is een op XML gebaseerd protocol en een internet standaard van de IETF. Het protocol beschrijft de interface en de input/output van een registratiesysteem. Wie geïnteresseerd is in de details, kan kijken naar RFC 5730, RFC 5731, RFC 5732, RFC 5733 en RFC 5734.
Bij SIDN wordt sinds de introductie van DRS5 gebruik gemaakt van EPP als vervanging van de voormalige e-mailformulieren. De EPP-interface maakt gebruik van een TCP-verbinding die met TLS wordt gecodeerd. Een cliënt maakt een connectie met de EPP-server en zal vervolgens XML-requests versturen. Dit werkt op zich prima, alleen hebben we gemerkt dat het gebruik van een ‘stateful’ TCP verbinding een aantal bezwaren kent.
Bezwaren van EPP
EPP is gedefinieerd als een ‘stateful protocol’. Dat wil zeggen dat de server van elke cliënt informatie moet bijhouden over de lopende sessie. Dat impliceert (in onze setup), dat de cliënt gedurende de duur van een sessie steeds bij dezelfde server moet terug komen voor een volgend EPP-verzoek. Onze load-balancers zorgen daar dan ook voor. Dat maakt het echter lastig om een bepaalde server, waarop sessies actief zijn, voor onderhoud uit de pool van beschikbare servers te halen. En het is jammer dat een load-balancer verzoeken niet simpelweg kan doorsturen naar de op dat moment minst belaste EPP-server. Als oplossing kan ‘session state’ op een andere manier worden bijgehouden, maar dat maakt de infrastructuur weer complexer.
Wanneer de TCP-verbinding van een lopende sessie onverwachts verbroken wordt (zonder eerst het <logout> commando te versturen), bestaat de EPP-sessie nog steeds op de server. Dat kan een probleem opleveren, aangezien bij SIDN sprake is van een maximaal aantal simultane sessies. Wanneer nieuwe sessies worden opgezet, terwijl de oude sessie nog niet is opgeruimd, kan een registrar tegen een sessie-limiet aan lopen. Ook hier moet dus omheen worden gewerkt.
Internet draft: RESTful EPP (REPP)
Toen we aan het nadenken waren over dit onderwerp, ontstond het idee om EPP te gaan doen op een ‘stateless’ manier, dus op een manier waarop ‘state’ niet meer bijgehouden hoeft te worden. Dat idee hebben we uitgewerkt in een internet-draft, waarvan versie ‘00’ onlangs is ingediend bij de IETF.
We hebben er bij ons idee voor gekozen om gebruik te maken van ‘Representational state transfer’ (REST), een bepaalde software-architectuurstijl, die de laatste jaren toenemende belangstelling geniet.
De oplossing moest zo dicht mogelijk bij de bestaande EPP-standaarden blijven, vonden we, omdat deze wereldwijd al veel wordt gebruikt. Daarnaast hadden we de volgende wensen:
- Stateless;
- XML-gebruik minimaliseren;
- Simpel te integreren.
Het was al snel duidelijk dat een ‘stateless’ API veel van de bezwaren zou oplossen. Stateless is de natuurlijke tegenhanger van stateful. HTTP is het misschien wel bekendste voorbeeld van een stateless protocol.
REST is een architectuurstijl die bovenop HTTP is gedefinieerd. Met REST is het mogelijk om een API te ontwerpen die eenvoudig leesbaar is en ook eenvoudig te gebruiken is. REST definieert een zogenaamde ‘resource’, die een object definieert waarop een operatie moet worden uitgevoerd. Deze operatie wordt bepaald door de ‘HTTP method’, zoals GET of POST. Een API die werkt volgens de principes van REST wordt aangeduid als ‘RESTful’ API. De nieuwe interface heeft dan ook de naam REPP gekregen, wat staat voor “RESTful EPP”.
Eigenlijk werkt REPP heel eenvoudig. Een domein <check> commando is bijvoorbeeld:
HEAD /rest/v1/domains/sidn.nl
Met de RESTful EPP-interface wordt een EPP-commando dus niet meer verstuurd door middel van een XML request, maar als een REST resource. Bijvoorbeeld een domeinnaam-resource “/rest/v1/domains/sidn.nl” en een HTTP methode die aangeeft wat er met deze resource moet gebeuren, bijvoorbeeld een GET voor een <info> of een HEAD voor een <check> commando.
Zie hieronder het verschil tussen een RESTful en een stateful domeinnaam check:
RESTful
HEAD /rest/v1/domains/sidn.nl
X-REPP-cltrid: ABC-12345
Stateful
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<command>
<check>
<domain:check
xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
<domain:name>sidn.nl </domain:name>
</domain:check>
</check>
<clTRID>ABC-12345</clTRID>
</command>
</epp>
Het verschil t.o.v. het huidige EPP is, dat er minder XML nodig is en een aantal commando’s veel efficiënter zijn geworden. De <login> en <logout> commando’s zijn zelfs helemaal niet meer nodig.
Er is een nieuwe EPP-extensie ontworpen welke gebruikt kan worden om, als het nodig is, een EPP XML request naar de server te versturen. Daarnaast is een ‘mapping’ gemaakt van de bestaande EPP-commandostructuur naar een RESTful-interface in de vorm van een verzameling van URL’s.
Het resultaat is een hybride oplossing, een API die bestaat uit een mix van een EPP-extensie en een ‘EPP protocol mapping’. Of het resultaat officieel nog EPP genoemd kan worden was al snel onderwerp van discussie. Dit, omdat REPP afwijkt van een duidelijke uitspraak uit RFC 5730, namelijk dat EPP stateful moet zijn. En dat was het nou net niet :-)
Referentie implementatie
Om het resultaat te testen is er een referentie implementatie gemaakt, maar dat is iets voor het volgende artikel.
Onze draft is te lezen op: http://tools.ietf.org/html/draft-wullink-restful-epp-00 .










