Proposal 157: Make certificate downloads specific

Nick Mathewson nickm at
Tue Dec 2 22:22:04 UTC 2008

Here's a pretty simple proposal I wrote to fix one of the issues in
bug 854.

Filename: 157-specific-cert-download.txt
Title: Make certificate downloads specific
Version: $Revision: 17448 $
Last-Modified: $Date: 2008-12-02 17:20:47 -0500 (Tue, 02 Dec 2008) $
Author: Nick Mathewson
Created: 2-Dec-2008
Status: Open
Target: 0.2.1.x


  Tor's directory specification gives two ways to download a certificate:
  by its identity fingerprint, or by the digest of its secret key.  Both
  are error-prone.  We propose a new download mechanism to make sure that
  clients get the certificates they want.


  When a client wants a certificate to verify a consensus, it has two choices
     - Download by identity key fingerprint.  In this case, the client risks
       getting a certificate for the same authority, but with a different
       signing key than the one used to sign the consensus.

     - Download by signing key fingerprint.  In this case, the client risks
       getting a forged certificate that contains the right signing key
       signed with the wrong identity key.  (Since caches are willing to
       cache certs from authorities they do not themselves recognize, the
       attacker wouldn't need to compromise an authority's key to do this.)

Current solution:

  Clients fetch by identity keys, and re-fetch with backoff if they don't get
  certs with the signing key they want.

Proposed solution:

  Phase 1: Add a URL type for clients to download certs by identity _and_
  signing key fingerprint.  Unless both fields match, the client doesn't
  accept the certificate(s).  Clients begin using this method when their
  randomly chosen directory cache supports it.

  Phase 1A: Simultaneously, add a cross-certification element to

  Phase 2: Once many directory caches support phase 1, clients should prefer
  to fetch certificates using that protocol when available.

  Phase 2A: Once all authorities are generating cross-certified certificates
  as in phase 1A, require cross-certification.

Specification additions:

  The key certificate whose identity key fingerprint is <F> and whose signing
  key fingerprint is <S> should be available at:


  As usual, clients may request multiple certificates using:


  Clients SHOULD use this format whenever they know both key fingerprints for
  a desired certificate.

  Certificates SHOULD contain the following field (at most once):

  "cross-cert" NL CrossSignature NL

  where CrossSignature is a signature, made using the certificate's signing
  key, of the digest of the PKCS1-padded hash of the certificate's identity
  key.  For backward compatibility with broken versions of the parser, we
  wrap the base64-encoded signature in -----BEGIN ID SIGNATURE---- and
  -----END ID SIGNATURE----- tags.  (See bug 880.) Implementations MUST allow
  the "ID " portion to be omitted, however.

  When encountering a certificate with a cross-cert entry, implementations
  MUST verify that the

  (In a future version of this specification, cross-cert entries will be

Why cross-certify too?

  Cross-certification protects clients who haven't updated yet, by reducing
  the number of caches that are willing to hold and serve bogus certificates.


  This is related to part 2 of bug 854.

More information about the tor-dev mailing list