Signing ENUM XML tokens
In order to register an ENUM, a XML token (RFC5105) is signed by a Validation Agency to say that the user has a given phone number & so has the right to a ENUM registration; this token is sent by an ENUM Registrar to Nominet’s EPP server.
This process of signing a token isn’t entirely straightforward:
The simplest way to sign a token is to use the templatesign tool from the Apache XML Security project.
$ templatesign -r testVA.key password -c -x testVA.cert unsigned_token.xml > signed_token.xml
A token signed by templatesign is valid, as can be checked using checksig (from the same toolkit) or Oxygen. However when this token is included as part of an EPP Create command, the signature becomes invalid. It seems that templatesign doesn’t do the XML canonicalization quite right.
Aside:
To make an XML signature, a digest is taken of the XML data being signed; the data is “canonicalized” before calculating the digest. It seems that canonicalisation is more-or-less just a standard way of inserting whitespace. I’m surprised this is how it works because it’s rather fragile, compared to calculating the digest using the element names, attributes etc & ignoring the formatting.
One workaround for this is to run templatesign on the entire Create. Although this is satisfactory for testing, it does not work in the situation where a Validation Agency has to send a signed token to a Registrar, who then wraps this up into a Create command & sends that to Nominet’s EPP server.
It is possible to use Oxygen to sign a token (example) and this will do the canonicalization in such a way that when enveloped in a Create command, the signature remains valid. However, Oxygen is an interactive GUI tool and not suited to making an automated system.
Oxygen says that it uses the Java version of Apache XML Security. Looking at the examples that come with the Apache package (specifically GenEnveloped.java) gives us another option:
We’ve taken this example from the Apache library and made the appropriate changes to sign an ENUM token. I’ve packaged some example code
which contains:
- EnumTokenSigner.java - signs a token in such a way that it will validate even when enveloped in a Create command. It takes an unsigned token (as a Java String) for input, signs it and returns the signed token
- EnumTokenCreator.java - is one way to create an unsigned token. This could be done in any number of ways but using a DOM implementation easily handles absent optional elements.
- EnumTokenSignExample.java - is a simple test harness - it just loads files & calls the two above utility classes. You will at least have to edit this to set the path names of the keys & token properties. It does not (for example) do any of the error-checking that you would expect in production code.
- a Makefile
Key formats
Java uses a different key format (DER) than OpenSSL (PEM). It is necessary to convert a key+certificate to this format before using the Java tools. OpenSSL can perform the conversion:
$ openssl pkcs8 -topk8 -nocrypt -in yourVA_key.key -inform PEM -out yourVA_key.der -outform DER $ openssl x509 -in yourVA_cert.pem -inform PEM -out yourVA_cert.der -outform DER

(1 votes, average: 4 out of 5)
April 20th, 2009 at 1:45 pm
Thanks for the post this is very helpful information for me.
June 5th, 2009 at 6:59 am
If this token is not an opening tag, this method will return its corresponding node structure as returned by $token->text(), $token->tag_self_close(), etc.
Returns undef otherwise.