TLS 1.3 signer adapter

The TLS signer is a library that provides a TLS 1.3 signature callback hook. Modern TLS libraries (OpenSSL, BoringSSL, rustls) support asynchronous signature callbacks; the Confium TLS signer plugs in and routes each handshake signature through a threshold session.

When to choose the TLS signer

  • You operate a high-value TLS-terminating service (banking, identity provider, government, root CA).
  • A single signing key on the terminator is a structural risk.
  • You want signing authority split across multiple parties or regions.
  • You can tolerate ~150ms handshake overhead (typical for a cross-region threshold session).

Install (Rust)

[dependencies]
confium-tls-signer = "0.3"
rustls = "0.23"   # or your TLS library of choice

Usage with rustls

use rustls::sign::SigningKey;
use confium_tls_signer::ThresholdSigningKey;

let signing_key = ThresholdSigningKey::new(
    "tcp://coordinator.internal:7443",
    my_cert_public_key,
    "ECDSA-P256",
)?;

// Hand this to rustls as the server's signing key.
let server_config = ServerConfig::builder()
    .with_no_client_auth()
    .with_certifier(cert_chain, vec![signing_key]);

Each TLS handshake that requires a signature triggers a threshold session. The output is a standard ECDSA-P256 signature; the client sees nothing different.

Usage with OpenSSL 3.0

OpenSSL 3.0’s provider API supports signing callbacks. Use the confium-openssl-provider and configure it for the TLS handshake algorithm:

[algorithms]
ECDSA-P256 = "confium"

See the OpenSSL adapter docs for details.

Latency considerations

A TLS handshake adds ~150ms with a cross-region threshold session. For high-traffic sites:

  • Co-locate coordinator with terminator. Drops to ~30ms.
  • Batch handshakes per session. A threshold session can produce multiple signatures per round, amortizing the round-trip cost.
  • Cache session resumption tickets aggressively. Resumption doesn’t require a new signature, so resumed connections have zero threshold overhead.
  • Use session tickets with shorter validity. Forces more frequent full handshakes (more threshold sessions), but each session can batch.

Compatibility

TLS library Status
rustls ✅ full support via SigningKey trait.
OpenSSL 3.0 ✅ via the provider API.
BoringSSL ✅ via the provider API (OpenSSL-compatible).
wolfSSL ⏳ callback API exists; integration in progress.
Java JSSE ✅ via the JCE provider + SunJSSE.
Go crypto/tls crypto.Signer interface — adapter in progress.

High-availability considerations

For high-traffic TLS deployments, deploy the coordinator redundantly:

  • Multiple coordinator processes behind a load balancer.
  • Shared transparency log state across coordinators (via the transparency log service).
  • Each coordinator talks to the same signer set.
  • Client-side TLS handshakes hit any available coordinator; the threshold session is stateless across coordinators (state is in the signers + transparency log).

See also