mirror of
https://github.com/yhirose/cpp-httplib.git
synced 2026-04-12 19:58:29 +00:00
Add Cookbook other topics (draft)
This commit is contained in:
70
docs-src/pages/en/cookbook/t04-mtls.md
Normal file
70
docs-src/pages/en/cookbook/t04-mtls.md
Normal file
@@ -0,0 +1,70 @@
|
||||
---
|
||||
title: "T04. Configure mTLS"
|
||||
order: 45
|
||||
status: "draft"
|
||||
---
|
||||
|
||||
Regular TLS verifies the server certificate only. **mTLS** (mutual TLS) adds the other direction: the client presents a certificate too, and the server verifies it. It's common for zero-trust API-to-API traffic and internal system authentication.
|
||||
|
||||
## Server side
|
||||
|
||||
Pass the CA used to verify client certificates as the third (and fourth) argument to `SSLServer`.
|
||||
|
||||
```cpp
|
||||
httplib::SSLServer svr(
|
||||
"server-cert.pem", // server certificate
|
||||
"server-key.pem", // server private key
|
||||
"client-ca.pem", // CA that signs valid client certs
|
||||
nullptr // CA directory (none)
|
||||
);
|
||||
|
||||
svr.Get("/", [](const httplib::Request &req, httplib::Response &res) {
|
||||
res.set_content("authenticated", "text/plain");
|
||||
});
|
||||
|
||||
svr.listen("0.0.0.0", 443);
|
||||
```
|
||||
|
||||
With this, any connection whose client certificate isn't signed by `client-ca.pem` is rejected at the handshake. By the time a handler runs, the client is already authenticated.
|
||||
|
||||
## Configure with in-memory PEM
|
||||
|
||||
```cpp
|
||||
httplib::SSLServer::PemMemory pem{};
|
||||
pem.cert_pem = server_cert.data();
|
||||
pem.cert_pem_len = server_cert.size();
|
||||
pem.key_pem = server_key.data();
|
||||
pem.key_pem_len = server_key.size();
|
||||
pem.client_ca_pem = client_ca.data();
|
||||
pem.client_ca_pem_len = client_ca.size();
|
||||
|
||||
httplib::SSLServer svr(pem);
|
||||
```
|
||||
|
||||
This is the clean way when you load certificates from environment variables or a secrets manager.
|
||||
|
||||
## Client side
|
||||
|
||||
On the client side, pass the client certificate and key to `SSLClient`.
|
||||
|
||||
```cpp
|
||||
httplib::SSLClient cli("api.example.com", 443,
|
||||
"client-cert.pem",
|
||||
"client-key.pem");
|
||||
|
||||
auto res = cli.Get("/");
|
||||
```
|
||||
|
||||
Note you're using `SSLClient` directly, not `Client`. If the private key has a password, pass it as the fifth argument.
|
||||
|
||||
## Read client info from a handler
|
||||
|
||||
To see which client connected from inside a handler, use `req.peer_cert()`. Details in T05. Access the Peer Certificate on the Server Side.
|
||||
|
||||
## Use cases
|
||||
|
||||
- **Microservice-to-microservice calls**: Issue a cert per service, use the cert as identity
|
||||
- **IoT device management**: Burn a cert into each device and use it to gate API access
|
||||
- **An alternative to internal VPN**: Put cert-based auth in front of public endpoints so internal resources can be reached safely
|
||||
|
||||
> **Note:** Issuing and revoking client certificates is more operational work than password-based auth. You'll need either an internal PKI setup or an automated flow using ACME-family tools.
|
||||
Reference in New Issue
Block a user