Bun's TLS support is built in, powered by BoringSSL. To enable TLS, pass both key and cert.
Bun.serve({
tls: {
key: Bun.file("./key.pem"), // [!code ++]
cert: Bun.file("./cert.pem"), // [!code ++]
},
});
The key and cert fields expect the contents of your TLS key and certificate, not a path to it. Each can be a string, BunFile, TypedArray, Buffer, or an array of those. Bun uses only the last key/cert pair in an array; to serve several certificates, pass an array of tls objects, each with a serverName (see SNI below).
Bun.serve({
tls: {
key: Bun.file("./key.pem"), // BunFile
key: fs.readFileSync("./key.pem"), // Buffer
key: fs.readFileSync("./key.pem", "utf8"), // string
key: [Bun.file("./key1.pem"), Bun.file("./key2.pem")], // array of above
},
});
Passphrase
If your private key is encrypted with a passphrase, provide a value for passphrase to decrypt it.
Bun.serve({
tls: {
key: Bun.file("./key.pem"),
cert: Bun.file("./cert.pem"),
passphrase: "my-secret-passphrase", // [!code ++]
},
});
CA Certificates
Pass ca to override the trusted CA certificates. By default, the server trusts the list of well-known CAs curated by Mozilla; setting ca replaces that list.
Bun.serve({
tls: {
key: Bun.file("./key.pem"), // path to TLS key
cert: Bun.file("./cert.pem"), // path to TLS cert
ca: Bun.file("./ca.pem"), // path to root CA certificate // [!code ++]
},
});
Client certificates (mTLS)
A server asks clients for a certificate only when requestCert is true. ca on its own does not: it names the CAs that client certificates are verified against.
Bun.serve({
tls: {
key: Bun.file("./key.pem"),
cert: Bun.file("./cert.pem"),
ca: Bun.file("./client-ca.pem"), // CA that issues the client certificates
requestCert: true, // [!code ++]
},
});
With requestCert: true, the server refuses a client that sends no certificate or one that ca does not verify. Set rejectUnauthorized: false to accept those clients too. The NODE_TLS_REJECT_UNAUTHORIZED environment variable does not change this for a server.
Certificate revocation lists
Pass crl to refuse peer certificates that a CA has revoked. It takes the PEM contents of one or more CRLs, in the same value types as ca. On a server it applies to client certificates, so use it with requestCert.
Bun.serve({
tls: {
key: Bun.file("./key.pem"),
cert: Bun.file("./cert.pem"),
ca: Bun.file("./client-ca.pem"),
requestCert: true,
crl: Bun.file("./client-ca.crl.pem"), // [!code ++]
},
});
Diffie-Hellman
To override Diffie-Hellman parameters:
Bun.serve({
tls: {
dhParamsFile: "/path/to/dhparams.pem", // path to Diffie Hellman parameters // [!code ++]
},
});
Server name indication (SNI)
To configure the server name indication (SNI) for the server, set the serverName field in the tls object.
Bun.serve({
tls: {
serverName: "my-server.com", // SNI // [!code ++]
},
});
To allow multiple server names, pass an array of objects to tls, each with a serverName field.
Bun.serve({
tls: [
{
key: Bun.file("./key1.pem"),
cert: Bun.file("./cert1.pem"),
serverName: "my-server1.com", // [!code ++]
},
{
key: Bun.file("./key2.pem"),
cert: Bun.file("./cert2.pem"),
serverName: "my-server2.com", // [!code ++]
},
],
});
If two entries share a serverName, the later entry replaces the earlier one. This matches tls.Server#addContext(). A trailing dot is ignored, so my-server1.com. and my-server1.com name the same host. Names are compared case-insensitively, and a * stands for exactly one label on every transport: *.my-server1.com matches a.my-server1.com but not a.b.my-server1.com.