$Id$ -*- Text -*- Python RPKI production tools. Requires Python 2.5. External Python packages required: - lxml, which in turn requires the libxml2 C libraries. FreeBSD: /usr/ports/devel/py-lxml - MySQLdb, which in turn requires MySQL client and server. I'm testing with MySQL 5.1. FreeBSD: /usr/ports/databases/py-MySQLdb - TLSLite, which pulls in other crypto packages. FreeBSD: /usr/ports/security/py-tlslite - Cryptlib, at the moment just to support TLSlite but may end up using it for other things later. FreeBSD: /usr/ports/security/cryptlib ...but the FreeBSD port doesn't (yet?) install the Python bindings, sigh, so at the moment you have to do that by hand: # cd /usr/ports/security/cryptlib # make install # cd work/bindings # python setup.py install # cd ../.. # make clean - Eventually I expect that this will require an event-handling package like Twisted, but I'm not there yet. - The testpoke tool (up-down protocol command line test client) also uses PyYAML, mostly for compatability with APNIC's equivalent tool. FreeBSD: /usr/ports/devel/py-yaml We also use a hacked copy of the Python OpenSSL Wrappers (POW) package, but our copy has enough modifications that it's expanded in the Subversion tree. Depending on how this all works out, I may end up splitting the POW.pkix module out of the POW package and using it with Cryptlib, as the POW.pkix package is 98% about doing ASN.1 in pure Python and only 2% about any kind of crypto. Current TO DO list: - Client side of expiration: how do we decide when to ask for a new cert from our parent? Tunable (preference, if so)? Waiting for the old one to die is not good. Reissue automatically when IRDB valid_until changes? - Parent side of revocation (child_cert objects) and CRL generation implemented but not yet tested. - Child side of revocation...Common Management Tasks page in the APNIC Wiki shows some states where revocation is triggered by the child after a delay. Other text in Common Management Tasks suggests that ca_detail also needs deferred transitions from pending to active. So added a deferred state transition timestamp to ca_detail object: How to model this? An enumerated state value (already have that, may need to rename states) and a timestamp (which may be NULL) for next scheduled transition? Is the next state always predictable from the current state or do we also need a next-state field? state := pending | active | deprecated | revoked timestamp := null |