Skip to content

New provisioner or add to ACME provisioner for Wire™ cert enrollment  #1054

@rohan-wire

Description

@rohan-wire

Issue details

We would like to use Smallstep to enroll X.509 certificates for the Wire end-to-end encrypted messaging application. Wire is entirely open source and supports federation (multiple servers communicating across domains).

In Wire each user can have multiple clients (ex: desktop, iOS, Android, web). In group conversations, clients then verify the certificates of the other clients in the chat. Messages for a group are encrypted only for the active clients of the users in the group. Each certificate needs to bind:

  • the identity key pair of the client (client is authoritative);
  • the wire handle (ex: @alice-smith@example.com) and display name of the user as authenticated by the IdP (IdP is authoritative); and
  • the client ID (Wire server is authoritative), for example SvPfLlwBQi-6oddVRrkqpw/04c7@example.com.

The resulting certificate might have the display name as a CN in the Subject, and URIs for the Wire handle (URI:im:%40alice-smith@example.com) and client ID (URI:im:SvPfLlwBQi-6oddVRrkqpw/04c7@example.com) in the SubjectAltName.

Envisioned example solution

Despite its traditional use with domain certs, I thought of modeling this with ACME because an order has to list the identifiers you want in a certificate and requires challenges to prove control over each identifier. The wire handle and display name could come from a preauthorization, and we could use a custom challenge to prove control of the client ID. (I prototyped a JWT usable for the challenge.) We also need the client to authenticate to the certificate enrollment server (for example using OAUTH/OIDC), which in ACME could be done when creating a new account.

We would like to either add this functionality to the ACME provisioner or create a new provisioner, probably using pieces of the OAUTH/OIDC provisioner and possibly the ACME provisioner.

In case you are wondering why we did not consider EAB, there is no direct relationship between the certificate server and the Wire server (which is authoritative for the client ID). The IdP has no reason to know the client IDs, which are internal identifiers, and change as new clients are added and removed.

Why is this needed?

End-to-end encryption of messaging is great, but a compromised or malicious server can still inject an extra client into communications unless there is an associated identity mechanism. There is clear way to do this using per-client X.509 certificates, providing improved privacy and confidence in encrypted messaging.

Some security properties we want:

  • a malicious clients cannot impersonate another client (even for the same user)
  • even collaborating with a malicious server in one domain, clients cannot impersonate a user in another domain
  • an attacker needs to compromise the Wire server AND the IdP to inject a malicious client into conversations.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions