chore: rename quicproquo → quicprochat in docs, Docker, CI, and packaging
Rename all project references from quicproquo/qpq to quicprochat/qpc across documentation, Docker configuration, CI workflows, packaging scripts, operational configs, and build tooling. - Docker: crate paths, binary names, user/group, data dirs, env vars - CI: workflow crate references, binary names, artifact names - Docs: all markdown files under docs/, SDK READMEs, book.toml - Packaging: OpenWrt Makefile, init script, UCI config (file renames) - Scripts: justfile, dev-shell, screenshot, cross-compile, ai_team - Operations: Prometheus config, alert rules, Grafana dashboard - Config: .env.example (QPQ_* → QPC_*), CODEOWNERS paths - Top-level: README, CONTRIBUTING, ROADMAP, CLAUDE.md
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# QUIC + TLS 1.3
|
||||
|
||||
quicproquo uses QUIC (RFC 9000) with mandatory TLS 1.3 (RFC 9001) as its transport layer. This page explains how the `quinn` and `rustls` crates are integrated and what security properties the transport provides.
|
||||
quicprochat uses QUIC (RFC 9000) with mandatory TLS 1.3 (RFC 9001) as its transport layer. This page explains how the `quinn` and `rustls` crates are integrated and what security properties the transport provides.
|
||||
|
||||
## Why QUIC
|
||||
|
||||
@@ -15,11 +15,11 @@ QUIC provides several advantages over traditional TCP-based transports:
|
||||
|
||||
## Crate integration
|
||||
|
||||
quicproquo uses the following crates for QUIC and TLS:
|
||||
quicprochat uses the following crates for QUIC and TLS:
|
||||
|
||||
- **`quinn 0.11`** -- The async QUIC implementation for Tokio. Provides `Endpoint`, `Connection`, and bidirectional/uni-directional stream types.
|
||||
- **`quinn-proto 0.11`** -- The protocol-level types, including `QuicServerConfig` and `QuicClientConfig` wrappers that bridge `rustls` into `quinn`.
|
||||
- **`rustls 0.23`** -- The TLS implementation. quicproquo uses it in strict TLS 1.3 mode with no fallback to TLS 1.2.
|
||||
- **`rustls 0.23`** -- The TLS implementation. quicprochat uses it in strict TLS 1.3 mode with no fallback to TLS 1.2.
|
||||
- **`rcgen 0.13`** -- Self-signed certificate generation for development and testing.
|
||||
|
||||
### Server configuration
|
||||
@@ -30,7 +30,7 @@ The server builds its QUIC endpoint configuration with:
|
||||
let mut tls = rustls::ServerConfig::builder_with_protocol_versions(&[&TLS13])
|
||||
.with_no_client_auth()
|
||||
.with_single_cert(cert_chain, key)?;
|
||||
tls.alpn_protocols = vec![b"qpq".to_vec()];
|
||||
tls.alpn_protocols = vec![b"qpc".to_vec()];
|
||||
|
||||
let crypto = QuicServerConfig::try_from(tls)?;
|
||||
Ok(ServerConfig::with_crypto(Arc::new(crypto)))
|
||||
@@ -38,11 +38,11 @@ Ok(ServerConfig::with_crypto(Arc::new(crypto)))
|
||||
|
||||
Key points:
|
||||
|
||||
1. **TLS 1.3 strict mode**: `builder_with_protocol_versions(&[&TLS13])` ensures no TLS 1.2 fallback. This is a hard requirement: TLS 1.2 lacks the 0-RTT and full forward secrecy guarantees that quicproquo relies on.
|
||||
1. **TLS 1.3 strict mode**: `builder_with_protocol_versions(&[&TLS13])` ensures no TLS 1.2 fallback. This is a hard requirement: TLS 1.2 lacks the 0-RTT and full forward secrecy guarantees that quicprochat relies on.
|
||||
|
||||
2. **No client certificate authentication**: `with_no_client_auth()` means the server does not verify client certificates at the TLS layer. Client authentication is handled at the application layer via OPAQUE password authentication and Ed25519 identity keys. This is a deliberate design choice -- OPAQUE provides stronger authentication properties than TLS client certificates without requiring PKI infrastructure.
|
||||
|
||||
3. **ALPN negotiation**: The Application-Layer Protocol Negotiation extension is set to `b"qpq"`, advertising that this endpoint speaks the quicproquo v2 Protobuf framing protocol. Both client and server must agree on this protocol identifier or the TLS handshake fails.
|
||||
3. **ALPN negotiation**: The Application-Layer Protocol Negotiation extension is set to `b"qpc"`, advertising that this endpoint speaks the quicprochat v2 Protobuf framing protocol. Both client and server must agree on this protocol identifier or the TLS handshake fails.
|
||||
|
||||
4. **`QuicServerConfig` bridge**: The `quinn-proto` crate provides `QuicServerConfig::try_from(tls)` to adapt the `rustls::ServerConfig` for use with QUIC. This handles the QUIC-specific TLS parameters (transport parameters, QUIC header protection keys) automatically.
|
||||
|
||||
@@ -57,7 +57,7 @@ roots.add(CertificateDer::from(cert_bytes))?;
|
||||
let mut tls = rustls::ClientConfig::builder_with_protocol_versions(&[&TLS13])
|
||||
.with_root_certificates(roots)
|
||||
.with_no_client_auth();
|
||||
tls.alpn_protocols = vec![b"qpq".to_vec()];
|
||||
tls.alpn_protocols = vec![b"qpc".to_vec()];
|
||||
|
||||
let crypto = QuicClientConfig::try_from(tls)?;
|
||||
```
|
||||
@@ -89,11 +89,11 @@ Unlike the v1 Cap'n Proto RPC (which required `tokio::task::LocalSet` due to
|
||||
|
||||
## Certificate trust model
|
||||
|
||||
quicproquo currently uses a **trust-on-first-use (TOFU)** model with self-signed certificates:
|
||||
quicprochat currently uses a **trust-on-first-use (TOFU)** model with self-signed certificates:
|
||||
|
||||
1. On first start, the server generates a self-signed certificate using `rcgen::generate_simple_self_signed` with SANs for `localhost`, `127.0.0.1`, and `::1`.
|
||||
2. The certificate and private key are persisted to disk as DER files (default: `data/server-cert.der` and `data/server-key.der`).
|
||||
3. Clients must obtain the server's certificate file out-of-band and reference it via the `--ca-cert` flag or `QPQ_CA_CERT` environment variable.
|
||||
3. Clients must obtain the server's certificate file out-of-band and reference it via the `--ca-cert` flag or `QPC_CA_CERT` environment variable.
|
||||
|
||||
This model is adequate for development and single-server deployments. The roadmap includes:
|
||||
|
||||
@@ -143,18 +143,18 @@ The QUIC + TLS 1.3 layer provides:
|
||||
|
||||
| Environment Variable | CLI Flag | Default | Description |
|
||||
|---|---|---|---|
|
||||
| `QPQ_LISTEN` | `--listen` | `0.0.0.0:5001` | QUIC listen address |
|
||||
| `QPQ_TLS_CERT` | `--tls-cert` | `data/server-cert.der` | TLS certificate path |
|
||||
| `QPQ_TLS_KEY` | `--tls-key` | `data/server-key.der` | TLS private key path |
|
||||
| `QPQ_DATA_DIR` | `--data-dir` | `data` | Persistent storage directory |
|
||||
| `QPC_LISTEN` | `--listen` | `0.0.0.0:5001` | QUIC listen address |
|
||||
| `QPC_TLS_CERT` | `--tls-cert` | `data/server-cert.der` | TLS certificate path |
|
||||
| `QPC_TLS_KEY` | `--tls-key` | `data/server-key.der` | TLS private key path |
|
||||
| `QPC_DATA_DIR` | `--data-dir` | `data` | Persistent storage directory |
|
||||
|
||||
### Client
|
||||
|
||||
| Environment Variable | CLI Flag | Default | Description |
|
||||
|---|---|---|---|
|
||||
| `QPQ_CA_CERT` | `--ca-cert` | `data/server-cert.der` | Server certificate to trust |
|
||||
| `QPQ_SERVER_NAME` | `--server-name` | `localhost` | Expected TLS server name (must match certificate SAN) |
|
||||
| `QPQ_SERVER` | `--server` | `127.0.0.1:5001` | Server address (per-subcommand) |
|
||||
| `QPC_CA_CERT` | `--ca-cert` | `data/server-cert.der` | Server certificate to trust |
|
||||
| `QPC_SERVER_NAME` | `--server-name` | `localhost` | Expected TLS server name (must match certificate SAN) |
|
||||
| `QPC_SERVER` | `--server` | `127.0.0.1:5001` | Server address (per-subcommand) |
|
||||
|
||||
## Further reading
|
||||
|
||||
|
||||
Reference in New Issue
Block a user