aboutsummaryrefslogtreecommitdiff
path: root/rpkid
diff options
context:
space:
mode:
Diffstat (limited to 'rpkid')
-rwxr-xr-xrpkid/irdbd.py2
-rwxr-xr-xrpkid/pubd.py4
-rwxr-xr-xrpkid/rootd.py6
-rw-r--r--rpkid/rpki/async.py4
-rw-r--r--rpkid/rpki/https.py250
-rw-r--r--rpkid/rpki/left_right.py6
-rw-r--r--rpkid/rpki/publication.py2
-rw-r--r--rpkid/rpki/rpki_engine.py4
-rw-r--r--rpkid/rpki/up_down.py2
-rw-r--r--rpkid/rpki/x509.py6
-rw-r--r--rpkid/testbed.py14
-rw-r--r--rpkid/testpoke.py9
12 files changed, 218 insertions, 91 deletions
diff --git a/rpkid/irdbd.py b/rpkid/irdbd.py
index 294a8cb6..a7c0b8a3 100755
--- a/rpkid/irdbd.py
+++ b/rpkid/irdbd.py
@@ -90,7 +90,7 @@ def handler(query, path, cb):
cb(200, rpki.left_right.cms_msg.wrap(r_msg, irdbd_key, irdbd_cert))
- except rpki.async.ExitNow:
+ except (rpki.async.ExitNow, SystemExit):
raise
except Exception, data:
diff --git a/rpkid/pubd.py b/rpkid/pubd.py
index 84a19ffe..f664f242 100755
--- a/rpkid/pubd.py
+++ b/rpkid/pubd.py
@@ -87,7 +87,7 @@ class pubd_context(object):
try:
self.sql.ping()
self.handler_common(query, None, done, (self.bpki_ta, self.irbe_cert))
- except rpki.async.ExitNow:
+ except (rpki.async.ExitNow, SystemExit):
raise
except Exception, data:
rpki.log.error(traceback.format_exc())
@@ -115,7 +115,7 @@ class pubd_context(object):
if config is None or config.bpki_crl is None:
raise rpki.exceptions.CMSCRLNotSet
self.handler_common(query, client, done, (self.bpki_ta, client.bpki_cert, client.bpki_glue), config.bpki_crl)
- except rpki.async.ExitNow:
+ except (rpki.async.ExitNow, SystemExit):
raise
except Exception, data:
rpki.log.error(traceback.format_exc())
diff --git a/rpkid/rootd.py b/rpkid/rootd.py
index 422ac5ce..aa2e7c2a 100755
--- a/rpkid/rootd.py
+++ b/rpkid/rootd.py
@@ -202,7 +202,7 @@ class cms_msg(rpki.up_down.cms_msg):
def up_down_handler(query, path, cb):
try:
q_msg = cms_msg.unwrap(query, (bpki_ta, child_bpki_cert))
- except rpki.async.ExitNow:
+ except (rpki.async.ExitNow, SystemExit):
raise
except Exception, data:
rpki.log.error(traceback.format_exc())
@@ -214,13 +214,13 @@ def up_down_handler(query, path, cb):
try:
q_msg.serve_top_level(None, done)
- except rpki.async.ExitNow:
+ except (rpki.async.ExitNow, SystemExit):
raise
except Exception, data:
rpki.log.error(traceback.format_exc())
try:
done(q_msg.serve_error(data))
- except rpki.async.ExitNow:
+ except (rpki.async.ExitNow, SystemExit):
raise
except Exception, data:
rpki.log.error(traceback.format_exc())
diff --git a/rpkid/rpki/async.py b/rpkid/rpki/async.py
index 1c295f76..53c9e4b2 100644
--- a/rpkid/rpki/async.py
+++ b/rpkid/rpki/async.py
@@ -49,7 +49,7 @@ class iterator(object):
#rpki.log.debug("Created iterator id %s file %s line %s function %s" % (id(self), self.caller_file, self.caller_line, self.caller_function))
try:
self.iterator = iter(iterable)
- except ExitNow:
+ except (ExitNow, SystemExit):
raise
except:
rpki.log.debug("Problem constructing iterator for %s" % repr(iterable))
@@ -172,7 +172,7 @@ class timer(object):
t = cls.queue.pop(0)
try:
t.handler()
- except ExitNow:
+ except (ExitNow, SystemExit):
raise
except Exception, e:
t.errback(e)
diff --git a/rpkid/rpki/https.py b/rpkid/rpki/https.py
index 9a86661a..60f50909 100644
--- a/rpkid/rpki/https.py
+++ b/rpkid/rpki/https.py
@@ -40,30 +40,23 @@ import time, socket, asyncore, asynchat, traceback, urlparse
import rpki.async, rpki.sundial, rpki.x509, rpki.exceptions, rpki.log
import POW
-import os
-if os.getlogin() != "sra":
- #
- # Have to keep this warning for now, but it has long since become
- # tedious while testing other code I have to finish first.
- #
- print "====== WARNING WARNING WARNING ======"
- print "THIS VERSION OF rpki.https DOES NOT SUPPORT TLS."
- print "CONNECTIONS ARE NOT SECURE."
- print "THIS IS A DEVELOPMENT VERSION, TLS WILL BE ADDED LATER."
- print "====== WARNING WARNING WARNING ======"
-
rpki_content_type = "application/x-rpki"
# ================================================================
-debug = False
+# Chatter about TLS certificates
+debug_tls_certs = True
+
+# Verbose chatter about HTTP streams
+debug = True
+# Whether we want persistent HTTP streams, when peer also supports them
want_persistent_client = True
want_persistent_server = True
-idle_timeout_default = rpki.sundial.timedelta(seconds = 90)
-active_timeout_default = idle_timeout_default
+# Default HTTP connection timeout (set very short for initial testing)
+default_timeout = rpki.sundial.timedelta(seconds = 90)
default_http_version = (1, 0)
@@ -181,33 +174,30 @@ def logger(self, msg):
class http_stream(asynchat.async_chat):
log = logger
+ tls = None
+ retry_read = None
+ retry_write = None
- idle_timeout = idle_timeout_default
- active_timeout = active_timeout_default
+ timeout = default_timeout
- def __init__(self, conn = None, cert = None, key = None, ta = None, dynamic_ta = None):
+ def __init__(self, conn = None):
asynchat.async_chat.__init__(self, conn = conn)
self.buffer = []
self.timer = rpki.async.timer(self.handle_timeout)
- self.cert = cert
- self.key = key
- self.ta = ta
- self.dynamic_ta = dynamic_ta
self.restart()
- def restart(self, idle = True):
+ def restart(self):
assert not self.buffer
self.chunk_handler = None
self.set_terminator("\r\n\r\n")
- timeout = self.idle_timeout if idle else self.active_timeout
- if timeout is not None:
- self.timer.set(timeout)
+ if self.timeout is not None:
+ self.timer.set(self.timeout)
else:
self.timer.cancel()
- def update_active_timeout(self):
- if self.active_timeout is not None:
- self.timer.set(self.active_timeout)
+ def update_timeout(self):
+ if self.timeout is not None:
+ self.timer.set(self.timeout)
else:
self.timer.cancel()
@@ -216,7 +206,7 @@ class http_stream(asynchat.async_chat):
Buffer the data
"""
self.buffer.append(data)
- self.update_active_timeout()
+ self.update_timeout()
def get_buffer(self):
val = "".join(self.buffer)
@@ -224,7 +214,7 @@ class http_stream(asynchat.async_chat):
return val
def found_terminator(self):
- self.update_active_timeout()
+ self.update_timeout()
if self.chunk_handler:
self.chunk_handler()
elif not isinstance(self.get_terminator(), str):
@@ -275,8 +265,9 @@ class http_stream(asynchat.async_chat):
self.handle_message()
def handle_error(self):
+ self.log("Error in HTTP stream handler")
print traceback.format_exc()
- self.log("Error in HTTP stream handler, closing")
+ self.log("Closing due to error")
self.close()
def handle_timeout(self):
@@ -285,19 +276,121 @@ class http_stream(asynchat.async_chat):
def handle_close(self):
self.log("Close event in HTTP stream handler")
- asynchat.async_chat.handle_close(self)
self.timer.cancel()
+ def send(self, data):
+ assert self.retry_read is None and self.retry_write is None
+ return self.tls.write(data)
+
+ def recv(self, buffer_size):
+ assert self.retry_read is None and self.retry_write is None
+ return self.tls.read(buffer_size)
+
+ def readable(self):
+ return self.retry_read is not None or (self.retry_write is None and asynchat.async_chat.readable(self))
+
+ def writeable(self):
+ return self.retry_write is not None or (self.retry_read is None and asynchat.async_chat.writeable(self))
+
+ def handle_read(self):
+ assert self.retry_write is None
+ if self.retry_read is not None:
+ thunk = self.retry_read
+ self.retry_read = None
+ self.log("Retrying TLS read %r" % thunk)
+ thunk()
+ else:
+ try:
+ asynchat.async_chat.handle_read(self)
+ except POW.WantReadError:
+ self.retry_read = self.handle_read
+ except POW.WantWriteError:
+ self.retry_write = self.handle_read
+ except POW.ZeroReturnError:
+ self.log("ZeroReturn in handle_read()")
+ self.close()
+ except POW.SSLUnexpectedEOFError:
+ self.log("SSLUnexpectedEOF in handle_read()")
+ self.close()
+
+ def handle_write(self):
+ assert self.retry_read is None
+ if self.retry_write is not None:
+ thunk = self.retry_write
+ self.retry_write = None
+ thunk()
+ self.log("Retrying TLS write %r" % thunk)
+ else:
+ asynchat.async_chat.handle_write(self)
+
+ def initate_send(self):
+ assert self.retry_read is None and self.retry_write is None
+ try:
+ asynchat.async_chat.initiate_send(self)
+ except POW.WantReadError:
+ self.retry_read = self.initiate_send
+ except POW.WantWriteError:
+ self.retry_write = self.initiate_send
+ except POW.ZeroReturnError:
+ self.log("ZeroReturn in initiate_send()")
+ self.close()
+ except POW.SSLUnexpectedEOFError:
+ self.log("SSLUnexpectedEOF in initiate_send()")
+ self.close()
+
+ def close(self):
+ self.log("Close requested")
+ assert self.retry_read is None and self.retry_write is None
+ if self.tls is not None:
+ try:
+ ret = self.tls.shutdown()
+ self.log("tls.shutdown() returned %d" % ret)
+ self.tls = None
+ asynchat.async_chat.close(self)
+ self.handle_close()
+ except POW.WantReadError:
+ self.retry_read = self.close
+ except POW.WantWriteError:
+ self.retry_write = self.close
+
class http_server(http_stream):
parse_type = http_request
- def __init__(self, conn, handlers, cert = None, key = None, ta = None, dynamic_ta = None):
+ def __init__(self, conn, handlers, cert = None, key = None, ta = (), dynamic_ta = None):
self.log("Starting")
self.handlers = handlers
- http_stream.__init__(self, conn = conn, cert = cert, key = key, ta = ta, dynamic_ta = dynamic_ta)
+ http_stream.__init__(self, conn = conn)
self.expect_close = not want_persistent_server
+ self.log("cert %r key %r ta %r dynamic_ta %r" % (cert, key, ta, dynamic_ta))
+
+ self.tls = POW.Ssl(POW.TLSV1_SERVER_METHOD)
+ if debug_tls_certs:
+ self.log("HTTPS server cert issuer %s [%s] subject %s [%s]" % (cert.getIssuer(), cert.hAKI(), cert.getSubject(), cert.hSKI()))
+ self.tls.useCertificate(cert.get_POW())
+ self.tls.useKey(key.get_POW())
+ ta = set(dynamic_ta() if dynamic_ta else ta)
+ ta.discard(None)
+ if not ta:
+ raise RuntimeError, "No trust anchor(s) specified, this is unlikely to work"
+ for x in ta:
+ if debug_tls_certs:
+ self.log("HTTPS trusted cert issuer %s [%s] subject %s [%s]" % (x.getIssuer(), x.hAKI(), x.getSubject(), x.hSKI()))
+ self.tls.trustCertificate(x.get_POW())
+ self.tls.setVerifyMode(POW.SSL_VERIFY_PEER | POW.SSL_VERIFY_FAIL_IF_NO_PEER_CERT)
+
+ self.tls.setFd(self.fileno())
+ self.tls_accept()
+
+ def tls_accept(self):
+ try:
+ self.tls.accept()
+ except POW.WantReadError:
+ self.retry_read = self.tls_accept
+ except POW.WantWriteError:
+ self.retry_write = self.tls_accept
+
def handle_no_content_length(self):
self.handle_message()
@@ -325,7 +418,7 @@ class http_server(http_stream):
if error is None:
try:
handler(self.msg.body, self.msg.path, self.send_reply)
- except rpki.async.ExitNow:
+ except (rpki.async.ExitNow, SystemExit):
raise
except Exception, edata:
print traceback.format_exc()
@@ -358,6 +451,7 @@ class http_listener(asyncore.dispatcher):
log = logger
def __init__(self, handlers, port = 80, host = "", cert = None, key = None, ta = None, dynamic_ta = None):
+ self.log("Listener cert %r key %r ta %r dynamic_ta %r" % (cert, key, ta, dynamic_ta))
asyncore.dispatcher.__init__(self)
self.handlers = handlers
self.cert = cert
@@ -370,7 +464,7 @@ class http_listener(asyncore.dispatcher):
self.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
self.bind((host, port))
self.listen(5)
- except rpki.async.ExitNow:
+ except (rpki.async.ExitNow, SystemExit):
raise
except:
self.handle_error()
@@ -380,7 +474,7 @@ class http_listener(asyncore.dispatcher):
self.log("Accepting connection")
try:
http_server(conn = self.accept()[0], handlers = self.handlers, cert = self.cert, key = self.key, ta = self.ta, dynamic_ta = self.dynamic_ta)
- except rpki.async.ExitNow:
+ except (rpki.async.ExitNow, SystemExit):
raise
except:
self.handle_error()
@@ -393,23 +487,58 @@ class http_client(http_stream):
parse_type = http_response
- def __init__(self, queue, hostport, cert = None, key = None, ta = None, dynamic_ta = None):
+ def __init__(self, queue, hostport, cert = None, key = None, ta = ()):
self.log("Creating new connection to %s" % repr(hostport))
- http_stream.__init__(self, cert = cert, key = key, ta = ta, dynamic_ta = dynamic_ta)
+ self.log("cert %r key %r ta %r" % (cert, key, ta))
+ http_stream.__init__(self)
self.queue = queue
self.hostport = hostport
self.state = "opening"
self.expect_close = not want_persistent_client
+ self.cert = cert
+ self.key = key
+ self.ta = set(ta)
+ self.ta.discard(None)
def start(self):
try:
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.connect(self.hostport)
- except rpki.async.ExitNow:
+ except (rpki.async.ExitNow, SystemExit):
raise
except:
self.handle_error()
+ def handle_connect(self):
+ self.log("Connected")
+ self.set_state("idle")
+
+ self.tls = POW.Ssl(POW.TLSV1_CLIENT_METHOD)
+ if debug_tls_certs:
+ self.log("HTTPS client cert issuer %s [%s] subject %s [%s]" % (self.cert.getIssuer(), self.cert.hAKI(), self.cert.getSubject(), self.cert.hSKI()))
+ self.tls.useCertificate(self.cert.get_POW())
+ self.tls.useKey(self.key.get_POW())
+ if not self.ta:
+ raise RuntimeError, "No trust anchor(s) specified, this is unlikely to work"
+ for x in self.ta:
+ if debug_tls_certs:
+ self.log("HTTPS trusted cert issuer %s [%s] subject %s [%s]" % (x.getIssuer(), x.hAKI(), x.getSubject(), x.hSKI()))
+ self.tls.trustCertificate(x.get_POW())
+ self.tls.setVerifyMode(POW.SSL_VERIFY_PEER | POW.SSL_VERIFY_FAIL_IF_NO_PEER_CERT)
+
+ self.tls.setFd(self.fileno())
+ self.tls_connect()
+
+ def tls_connect(self):
+ try:
+ self.tls.connect()
+ except POW.WantReadError:
+ self.retry_read = self.tls_connect
+ except POW.WantWriteError:
+ self.retry_write = self.tls_connect
+ else:
+ self.queue.send_request()
+
def set_state(self, state):
self.log("State transition %s => %s" % (self.state, state))
self.state = state
@@ -423,7 +552,7 @@ class http_client(http_stream):
self.set_state("request-sent")
msg.headers["Connection"] = "Close" if self.expect_close else "Keep-Alive"
self.push(msg.format())
- self.restart(idle = False)
+ self.restart()
def handle_message(self):
self.log("Message received, state %s" % self.state)
@@ -446,7 +575,7 @@ class http_client(http_stream):
else:
self.log("Idling")
self.set_state("idle")
- self.timer.set(self.idle_timeout)
+ self.update_timeout()
if self.msg.code == 200:
self.queue.return_result(self.msg)
@@ -454,11 +583,6 @@ class http_client(http_stream):
self.queue.return_result(rpki.exceptions.HTTPRequestFailed(
"HTTPS request failed with status %s, reason %s, response %s" % (self.msg.code, self.msg.reason, self.msg.body)))
- def handle_connect(self):
- self.log("Connected")
- self.set_state("idle")
- self.queue.send_request()
-
def handle_close(self):
http_stream.handle_close(self)
self.log("State %s" % self.state)
@@ -479,7 +603,7 @@ class http_client(http_stream):
self.queue.detach(self)
try:
raise
- except rpki.async.ExitNow:
+ except (rpki.async.ExitNow, SystemExit):
raise
except Exception, edata:
self.queue.return_result(edata)
@@ -488,15 +612,15 @@ class http_queue(object):
log = logger
- def __init__(self, hostport, cert = None, key = None, ta = None, dynamic_ta = None):
+ def __init__(self, hostport, cert = None, key = None, ta = ()):
self.log("Creating queue for %s" % repr(hostport))
+ self.log("cert %r key %r ta %r" % (cert, key, ta))
self.hostport = hostport
self.client = None
self.queue = []
self.cert = cert
self.key = key
self.ta = ta
- self.dynamic_ta = dynamic_ta
def request(self, *requests):
self.log("Adding requests %r" % requests)
@@ -504,7 +628,7 @@ class http_queue(object):
def restart(self):
if self.client is None:
- client = http_client(self, self.hostport, cert = self.cert, key = self.key, ta = self.ta, dynamic_ta = self.dynamic_ta)
+ client = http_client(self, self.hostport, cert = self.cert, key = self.key, ta = self.ta)
self.log("Attaching client %r" % client)
self.client = client
self.client.start()
@@ -525,6 +649,9 @@ class http_queue(object):
def return_result(self, result):
+ if not self.queue:
+ self.log("No caller, this should not happen. Dropping result %r" % result)
+
req = self.queue.pop(0)
self.log("Dequeuing request %r" % req)
@@ -536,7 +663,7 @@ class http_queue(object):
assert isinstance(result, Exception)
self.log("Returning exception %r to caller: %s" % (result, result))
req.errback(result)
- except rpki.async.ExitNow:
+ except (rpki.async.ExitNow, SystemExit):
raise
except:
self.log("Unhandled exception from callback")
@@ -553,9 +680,6 @@ def client(msg, client_key, client_cert, server_ta, url, callback, errback):
"""
Open client HTTPS connection, send a message, set up callbacks to
handle response.
-
- THIS VERSION DOES NOT DO TLS. THIS IS EXPERIMENTAL CODE. DO NOT
- USE IN PRODUCTION UNTIL TLS SUPPORT HAS BEEN ADDED.
"""
u = urlparse.urlparse(url)
@@ -583,8 +707,10 @@ def client(msg, client_key, client_cert, server_ta, url, callback, errback):
if debug:
rpki.log.debug("Created request %r for %r" % (request, hostport))
+ if not isinstance(server_ta, (tuple, list)):
+ server_ta = (server_ta,)
if hostport not in client_queues:
- client_queues[hostport] = http_queue(hostport)
+ client_queues[hostport] = http_queue(hostport, cert = client_cert, key = client_key, ta = server_ta)
client_queues[hostport].request(request)
# Defer connection attempt until after we've had time to process any
@@ -594,18 +720,18 @@ def client(msg, client_key, client_cert, server_ta, url, callback, errback):
rpki.log.debug("Scheduling connection startup for %r" % request)
rpki.async.timer(client_queues[hostport].restart, errback).set(None)
-def server(handlers, server_key, server_cert, port, host ="", client_ta = None, dynamic_https_trust_anchor = None):
+def server(handlers, server_key, server_cert, port, host ="", client_ta = (), dynamic_https_trust_anchor = None):
"""
Run an HTTPS server and wait (forever) for connections.
-
- THIS VERSION DOES NOT DO TLS. THIS IS EXPERIMENTAL CODE. DO NOT
- USE IN PRODUCTION UNTIL TLS SUPPORT HAS BEEN ADDED.
"""
if not isinstance(handlers, (tuple, list)):
handlers = (("/", handlers),)
- http_listener(port = port, handlers = handlers)
+ if not isinstance(client_ta, (tuple, list)):
+ server_ta = (client_ta,)
+
+ http_listener(port = port, handlers = handlers, cert = server_cert, key = server_key, ta = client_ta, dynamic_ta = dynamic_https_trust_anchor)
rpki.async.event_loop()
def build_https_ta_cache(certs):
diff --git a/rpkid/rpki/left_right.py b/rpkid/rpki/left_right.py
index f2936d72..17778b12 100644
--- a/rpkid/rpki/left_right.py
+++ b/rpkid/rpki/left_right.py
@@ -611,7 +611,7 @@ class child_elt(data_elt):
try:
q_msg.serve_top_level(self, done)
- except rpki.async.ExitNow:
+ except (rpki.async.ExitNow, SystemExit):
raise
except rpki.exceptions.NoActiveCA, data:
done(q_msg.serve_error(data))
@@ -658,7 +658,7 @@ class repository_elt(data_elt):
if len(r_msg) != 1 or isinstance(r_msg[0], rpki.publication.report_error_elt):
raise rpki.exceptions.BadPublicationReply, "Unexpected response from pubd: %s" % msg
callback()
- except rpki.async.ExitNow:
+ except (rpki.async.ExitNow, SystemExit):
raise
except Exception, edata:
errback(edata)
@@ -1044,7 +1044,7 @@ class msg(rpki.xml_utils.msg, left_right_namespace):
try:
q_pdu.gctx = gctx
q_pdu.serve_dispatch(r_msg, iterator, fail)
- except rpki.async.ExitNow:
+ except (rpki.async.ExitNow, SystemExit):
raise
except Exception, edata:
fail(edata)
diff --git a/rpkid/rpki/publication.py b/rpkid/rpki/publication.py
index 62a2ae08..a5b0437e 100644
--- a/rpkid/rpki/publication.py
+++ b/rpkid/rpki/publication.py
@@ -336,7 +336,7 @@ class msg(rpki.xml_utils.msg, publication_namespace):
q_pdu.gctx = gctx
q_pdu.client = client
q_pdu.serve_dispatch(r_msg, iterator, fail)
- except rpki.async.ExitNow:
+ except (rpki.async.ExitNow, SystemExit):
raise
except Exception, edata:
fail(edata)
diff --git a/rpkid/rpki/rpki_engine.py b/rpkid/rpki/rpki_engine.py
index 509ae509..6426c3d0 100644
--- a/rpkid/rpki/rpki_engine.py
+++ b/rpkid/rpki/rpki_engine.py
@@ -111,7 +111,7 @@ class rpkid_context(object):
if q_msg.type != "query":
raise rpki.exceptions.BadQuery, "Message type is not query"
q_msg.serve_top_level(self, done)
- except rpki.async.ExitNow:
+ except (rpki.async.ExitNow, SystemExit):
raise
except Exception, data:
rpki.log.error(traceback.format_exc())
@@ -137,7 +137,7 @@ class rpkid_context(object):
if child is None:
raise rpki.exceptions.ChildNotFound, "Could not find child %s" % child_id
child.serve_up_down(query, done)
- except rpki.async.ExitNow:
+ except (rpki.async.ExitNow, SystemExit):
raise
except Exception, data:
rpki.log.error(traceback.format_exc())
diff --git a/rpkid/rpki/up_down.py b/rpkid/rpki/up_down.py
index e5c323c2..d7d7ad80 100644
--- a/rpkid/rpki/up_down.py
+++ b/rpkid/rpki/up_down.py
@@ -625,7 +625,7 @@ class message_pdu(base_elt):
try:
self.payload.serve_pdu(self, r_msg, child, done, lose)
- except rpki.async.ExitNow:
+ except (rpki.async.ExitNow, SystemExit):
raise
except Exception, edata:
lose(edata)
diff --git a/rpkid/rpki/x509.py b/rpkid/rpki/x509.py
index 97088f15..d43618a2 100644
--- a/rpkid/rpki/x509.py
+++ b/rpkid/rpki/x509.py
@@ -771,7 +771,7 @@ class CMS_object(DER_object):
try:
cms = self.get_POW()
- except rpki.async.ExitNow:
+ except (rpki.async.ExitNow, SystemExit):
raise
except:
if self.print_on_der_error:
@@ -825,7 +825,7 @@ class CMS_object(DER_object):
try:
content = cms.verify(store)
- except rpki.async.ExitNow:
+ except (rpki.async.ExitNow, SystemExit):
raise
except:
if self.dump_on_verify_failure:
@@ -854,7 +854,7 @@ class CMS_object(DER_object):
try:
cms = self.get_POW()
- except rpki.async.ExitNow:
+ except (rpki.async.ExitNow, SystemExit):
raise
except:
raise rpki.exceptions.UnparsableCMSDER
diff --git a/rpkid/testbed.py b/rpkid/testbed.py
index 1d0ae22d..2451a5a7 100644
--- a/rpkid/testbed.py
+++ b/rpkid/testbed.py
@@ -198,7 +198,7 @@ def main():
a.setup_bpki_certs()
setup_publication(pubd_sql)
- setup_rootd(db.root.name, "SELF", y.get("rootd", {}))
+ setup_rootd(db.root, y.get("rootd", {}))
setup_rsyncd()
setup_rcynic()
@@ -1108,6 +1108,7 @@ def setup_bpki_cert_chain(name, ee = (), ca = ()):
Build a set of BPKI certificates.
"""
s = "exec >/dev/null 2>&1\n"
+ #s = "set -x\n"
for kind in ("TA",) + ee + ca:
d = { "name" : name,
"kind" : kind,
@@ -1129,15 +1130,15 @@ def setup_bpki_cert_chain(name, ee = (), ca = ()):
s += bpki_cert_fmt_6 % d
subprocess.check_call(s, shell = True)
-def setup_rootd(rpkid_name, rpkid_tag, rootd_yaml):
+def setup_rootd(rpkid, rootd_yaml):
"""
Write the config files for rootd.
"""
+ rpkid.cross_certify(rootd_name + "-TA", reverse = True)
rpki.log.info("Writing config files for %s" % rootd_name)
d = { "rootd_name" : rootd_name,
"rootd_port" : rootd_port,
- "rpkid_name" : rpkid_name,
- "rpkid_tag" : rpkid_tag,
+ "rpkid_name" : rpkid.name,
"rootd_sia" : rootd_sia,
"rsyncd_dir" : rsyncd_dir,
"openssl" : prog_openssl,
@@ -1146,6 +1147,7 @@ def setup_rootd(rpkid_name, rpkid_tag, rootd_yaml):
f.write(rootd_fmt_1 % d)
f.close()
s = "exec >/dev/null 2>&1\n"
+ #s = "set -x\n"
if not os.path.exists(rootd_name + ".key"):
s += rootd_fmt_2 % d
s += rootd_fmt_3 % d
@@ -1417,7 +1419,7 @@ bpki-ta = %(rootd_name)s-TA.cer
rootd-bpki-cert = %(rootd_name)s-RPKI.cer
rootd-bpki-key = %(rootd_name)s-RPKI.key
rootd-bpki-crl = %(rootd_name)s-TA.crl
-child-bpki-cert = %(rootd_name)s-%(rpkid_name)s.cer
+child-bpki-cert = %(rootd_name)s-TA-%(rpkid_name)s-SELF.cer
server-port = %(rootd_port)s
@@ -1478,8 +1480,6 @@ rootd_fmt_3 = '''\
%(openssl)s x509 -req -sha256 -in %(rootd_name)s.req -out %(rootd_name)s.cer -outform DER -extfile %(rootd_name)s.conf -extensions req_x509_rpki_ext \
-signkey %(rootd_name)s.key &&
ln -f %(rootd_name)s.cer %(rsyncd_dir)s &&
-%(openssl)s x509 -req -sha256 -in %(rpkid_name)s-%(rpkid_tag)s.req -out %(rootd_name)s-%(rpkid_name)s.cer -extfile %(rootd_name)s.conf -extensions req_x509_ext -text \
- -CA %(rootd_name)s-TA.cer -CAkey %(rootd_name)s-TA.key -CAcreateserial
'''
rcynic_fmt_1 = '''\
diff --git a/rpkid/testpoke.py b/rpkid/testpoke.py
index 4e31122f..3657fbe7 100644
--- a/rpkid/testpoke.py
+++ b/rpkid/testpoke.py
@@ -102,16 +102,18 @@ def query_up_down(q_pdu):
print r_xml
try:
r_msg.payload.check_response()
- except rpki.async.ExitNow:
+ except (rpki.async.ExitNow, SystemExit):
raise
except Exception, edata:
fail(edata)
- rpki.async.exit_event_loop()
+ #rpki.async.exit_event_loop()
+
+ rpki.https.want_persistent_client = False
rpki.https.client(
server_ta = [https_ta] + https_ca_certs,
client_key = https_key,
- client_cert = https_certs,
+ client_cert = https_cert,
msg = q_cms,
url = yaml_data["posturl"],
callback = done,
@@ -152,7 +154,6 @@ cms_ca_certs = get_PEM_chain("cms-ca-certs")
https_ta = get_PEM("ssl-ca-cert", rpki.x509.X509)
https_key = get_PEM("ssl-key", rpki.x509.RSA)
https_cert = get_PEM("ssl-cert", rpki.x509.X509)
-https_certs = get_PEM_chain("ssl-cert-chain", https_cert)
https_ca_certs = get_PEM_chain("ssl-ca-certs")
try: