Files
next.js/Cargo.toml
T
Benjamin WoodruffandGitHub 56fed4d6b4 Turbopack: Add an option to use system TLS certificates (fixes #79060, fixes #79059) (#81818)
It's common in enterprise environments for employers to MITM all HTTPS traffic on employee machines to enforce network policies or to detect and block malware. For this to work, they install custom CA roots into the system store. Applications must read from this store.

The default behavior of `reqwests` is to bundle the mozilla CA roots into the application, and only trust those. This is reasonable given some of the tradeoffs of the current rustls resolver implementations they use, but long-term it's better for most applications to just use the system CA store.

This provides an opt-in experimental option for using the system CA store. We may use system CA certs by default in the future once https://github.com/seanmonstar/reqwest/issues/2159 is resolved.

Fixes #79059
Fixes #79060

### Testing

- Install [mitmproxy](https://docs.mitmproxy.org/stable/overview/installation/).
- Install the generated mitmproxy CA cert to the system store: https://docs.mitmproxy.org/stable/concepts/certificates/
- Run `./mitmdump` (with no arguments)
- Run an example app that uses google fonts:

```
pnpm pack-next --project ~/shadcn-ui/apps/v4 --no-js-build -- --release
cd ~/shadcn-ui/apps/v4
pnpm i
NEXT_TURBOPACK_EXPERIMENTAL_USE_SYSTEM_TLS_CERTS=0 HTTP_PROXY=localhost:8080 HTTPS_PROXY=localhost:8080 pnpm dev
NEXT_TURBOPACK_EXPERIMENTAL_USE_SYSTEM_TLS_CERTS=1 HTTP_PROXY=localhost:8080 HTTPS_PROXY=localhost:8080 pnpm dev
```

When system TLS certs are disabled, we get warnings like this:

```
 ⚠ [next]/internal/font/google/geist_mono_77f2790.module.css
Error while requesting resource
There was an issue establishing a connection while requesting https://fonts.googleapis.com/css2?family=Geist+Mono:wght@400&display=swap.

Import trace:
  [next]/internal/font/google/geist_mono_77f2790.module.css
  [next]/internal/font/google/geist_mono_77f2790.js
  ./apps/v4/lib/fonts.ts
  ./apps/v4/app/layout.tsx
```

And mitmproxy shows the handshakes failing

![Screenshot 2025-07-21 at 1.11.11 PM.png](https://graphite-user-uploaded-assets-prod.s3.amazonaws.com/HAZVitxRNnZz8QMiPn4a/2efc4b97-f50e-412c-9daf-5cdd00a6d82b.png)

When system TLS certs are enabled, the app works.
2025-07-23 18:02:54 -07:00

449 lines
12 KiB
TOML

[workspace]
resolver = "2"
members = [
"scripts/send-trace-to-jaeger",
"crates/napi",
"crates/wasm",
"crates/next-api",
"crates/next-build-test",
"crates/next-build",
"crates/next-core",
"crates/next-custom-transforms",
"turbopack/crates/*",
"turbopack/crates/*/fuzz",
"turbopack/xtask",
]
exclude = ["crates/next-error-code-swc-plugin"]
[workspace.lints.clippy]
too_many_arguments = "allow"
[workspace.lints.rust]
unexpected_cfgs = { level = "warn", check-cfg = ['cfg(rust_analyzer)', 'cfg(fuzzing)'] }
# This crate is particularly sensitive to compiler optimizations
[profile.dev.package.turbo-persistence]
opt-level = 1
# Set the options for dependencies (not crates in the workspace), this mostly impacts cold builds
[profile.dev.package."*"]
opt-level = 1
# Set the settings for build scripts and proc-macros.
[profile.dev.build-override]
opt-level = 3
[profile.release]
[profile.release.package]
[profile.release.package.turbopack-ecmascript]
opt-level = 3
[profile.release.package.turbopack-core]
opt-level = 3
[profile.release.package.next-core]
opt-level = 3
[profile.release.package.lightningcss]
opt-level = "s"
[profile.release.package.lightningcss-napi]
opt-level = "s"
[profile.release.package.swc_ecma_ast]
opt-level = 3
[profile.release.package.next-api]
opt-level = 3
[profile.release.package.wasmer-wasix]
opt-level = "s"
[profile.release.package.cranelift-codegen]
opt-level = "s"
[profile.release.package.turbo-tasks]
opt-level = 3
[profile.release.package.turbopack-node]
opt-level = 3
[profile.release.package.turbopack-dev-server]
opt-level = 3
[profile.release.package.swc_ecma_minifier]
opt-level = 3
[profile.release.package.swc]
opt-level = 3
[profile.release.package.turbopack-css]
opt-level = 3
[profile.release.package.swc_ecma_compat_es2015]
opt-level = "s"
[profile.release.package.turbo-tasks-fs]
opt-level = 3
[profile.release.package.swc_ecma_parser]
opt-level = 3
[profile.release.package.turbopack]
opt-level = 3
[profile.release.package.turbopack-browser]
opt-level = 3
[profile.release.package.turbo-tasks-backend]
opt-level = 3
[profile.release.package.styled_jsx]
opt-level = "s"
[profile.release.package.next-custom-transforms]
opt-level = 3
[profile.release.package.wast]
opt-level = "s"
[profile.release.package.wasmparser]
opt-level = "s"
[profile.release.package.browserslist-rs]
opt-level = "s"
[profile.release.package.tokio]
opt-level = 3
[profile.release.package.reqwest]
opt-level = "s"
[profile.release.package.swc_ecma_transforms_proposal]
opt-level = "s"
[profile.release.package.turbopack-resolve]
opt-level = 3
[profile.release.package.swc_ecma_transforms_optimization]
opt-level = 3
[profile.release.package.swc_ecma_transforms_base]
opt-level = 3
[profile.release.package.regex-automata]
opt-level = 3
[profile.release.package.auto-hash-map]
opt-level = 3
[profile.release.package.webc]
opt-level = "s"
[profile.release.package.turbopack-nodejs]
opt-level = 3
[profile.release.package.turbopack-trace-server]
opt-level = 3
[profile.release.package.swc_ecma_transforms_module]
opt-level = "s"
[profile.release.package.swc_ecma_transforms_typescript]
opt-level = 3
[profile.release.package.swc_css_prefixer]
opt-level = "s"
[profile.release.package.zstd-sys]
opt-level = 3
[profile.release.package.swc_sourcemap]
opt-level = 3
[profile.release.package.turbopack-wasm]
opt-level = 3
[profile.release.package.rustls]
opt-level = "s"
[profile.release.package.turbopack-ecmascript-plugins]
opt-level = 3
[profile.release.package.handlebars]
opt-level = "s"
[profile.release.package.swc_ecma_compat_bugfixes]
opt-level = "s"
[profile.release.package.h2]
opt-level = "s"
[profile.release.package.swc_ecma_compat_es2022]
opt-level = "s"
[profile.release.package.wasmer-config]
opt-level = "s"
[profile.release.package.wasmer-compiler]
opt-level = "s"
[profile.release.package.swc_ecma_utils]
opt-level = 3
[profile.release.package.regex-syntax]
opt-level = "s"
[profile.release.package.turbopack-image]
opt-level = 3
[profile.release.package.turbo-tasks-env]
opt-level = 3
[profile.release.package.napi]
opt-level = 3
[profile.release.package.mdxjs]
opt-level = "s"
[profile.release.package.serde_json]
opt-level = 3
[profile.release.package.swc_plugin_runner]
opt-level = "s"
[profile.release.package.markdown]
opt-level = "s"
[profile.release.package.swc_ecma_preset_env]
opt-level = "s"
[profile.release.package.turbo-tasks-fetch]
opt-level = 3
[profile.release.package.swc_ecma_visit]
opt-level = 3
[profile.release.package.turbopack-mdx]
opt-level = "s"
[profile.release.package.autocfg]
opt-level = "s"
[profile.release.package.image]
opt-level = 3
[profile.release.package.serde]
opt-level = 3
# Use a custom profile for CI where many tests are performance sensitive but we still want the additional validation of debug-assertions
[profile.release-with-assertions]
inherits = "release"
debug-assertions = true
overflow-checks = true
[workspace.dependencies]
# Workspace crates
next-api = { path = "crates/next-api" }
next-build = { path = "crates/next-build" }
next-core = { path = "crates/next-core" }
next-custom-transforms = { path = "crates/next-custom-transforms" }
# Turbopack
auto-hash-map = { path = "turbopack/crates/turbo-tasks-auto-hash-map" }
turbo-prehash = { path = "turbopack/crates/turbo-prehash" }
turbo-rcstr = { path = "turbopack/crates/turbo-rcstr" }
turbo-dyn-eq-hash = { path = "turbopack/crates/turbo-dyn-eq-hash" }
turbo-esregex = { path = "turbopack/crates/turbo-esregex" }
turbo-persistence = { path = "turbopack/crates/turbo-persistence" }
turbo-tasks-malloc = { path = "turbopack/crates/turbo-tasks-malloc", default-features = false }
turbo-tasks = { path = "turbopack/crates/turbo-tasks" }
turbo-tasks-backend = { path = "turbopack/crates/turbo-tasks-backend" }
turbo-tasks-build = { path = "turbopack/crates/turbo-tasks-build" }
turbo-tasks-bytes = { path = "turbopack/crates/turbo-tasks-bytes" }
turbo-tasks-env = { path = "turbopack/crates/turbo-tasks-env" }
turbo-tasks-fetch = { path = "turbopack/crates/turbo-tasks-fetch" }
turbo-tasks-fs = { path = "turbopack/crates/turbo-tasks-fs" }
turbo-tasks-hash = { path = "turbopack/crates/turbo-tasks-hash" }
turbo-tasks-macros = { path = "turbopack/crates/turbo-tasks-macros" }
turbo-tasks-macros-shared = { path = "turbopack/crates/turbo-tasks-macros-shared" }
turbo-tasks-testing = { path = "turbopack/crates/turbo-tasks-testing" }
turbopack = { path = "turbopack/crates/turbopack" }
turbopack-bench = { path = "turbopack/crates/turbopack-bench" }
turbopack-nodejs = { path = "turbopack/crates/turbopack-nodejs" }
turbopack-cli-utils = { path = "turbopack/crates/turbopack-cli-utils" }
turbopack-core = { path = "turbopack/crates/turbopack-core" }
turbopack-create-test-app = { path = "turbopack/crates/turbopack-create-test-app" }
turbopack-css = { path = "turbopack/crates/turbopack-css" }
turbopack-browser = { path = "turbopack/crates/turbopack-browser" }
turbopack-dev-server = { path = "turbopack/crates/turbopack-dev-server" }
turbopack-ecmascript = { path = "turbopack/crates/turbopack-ecmascript" }
turbopack-ecmascript-plugins = { path = "turbopack/crates/turbopack-ecmascript-plugins", default-features = false }
turbopack-ecmascript-runtime = { path = "turbopack/crates/turbopack-ecmascript-runtime" }
turbopack-ecmascript-hmr-protocol = { path = "turbopack/crates/turbopack-ecmascript-hmr-protocol" }
turbopack-env = { path = "turbopack/crates/turbopack-env" }
turbopack-image = { path = "turbopack/crates/turbopack-image" }
turbopack-json = { path = "turbopack/crates/turbopack-json" }
turbopack-mdx = { path = "turbopack/crates/turbopack-mdx" }
turbopack-node = { path = "turbopack/crates/turbopack-node" }
turbopack-resolve = { path = "turbopack/crates/turbopack-resolve" }
turbopack-static = { path = "turbopack/crates/turbopack-static" }
turbopack-swc-utils = { path = "turbopack/crates/turbopack-swc-utils" }
turbopack-test-utils = { path = "turbopack/crates/turbopack-test-utils" }
turbopack-trace-server = { path = "turbopack/crates/turbopack-trace-server" }
turbopack-trace-utils = { path = "turbopack/crates/turbopack-trace-utils" }
turbopack-wasm = { path = "turbopack/crates/turbopack-wasm" }
# SWC crates
swc_core = { version = "34", features = [
"ecma_loader_lru",
"ecma_loader_parking_lot",
"parallel_rayon",
] }
testing = "15.0.0"
# Keep consistent with preset_env_base through swc_core
browserslist-rs = "0.19.0"
mdxjs = "1.0.3"
modularize_imports = "0.93.0"
styled_components = "0.121.0"
styled_jsx = "0.97.0"
swc_emotion = "0.97.0"
swc_relay = "0.67.0"
react_remove_properties = "0.47.0"
remove_console = "0.48.0"
preset_env_base = "5.0.0"
# General Deps
chromiumoxide = { version = "0.5.4", features = [
"tokio-runtime",
], default-features = false }
# For matching on errors from chromiumoxide. Keep in
# sync with chromiumoxide's tungstenite requirement.
tungstenite = "0.20.1"
# flate2_zlib requires zlib, use flate2_rust
allsorts = { version = "0.14.0", default-features = false, features = [
"flate2_rust",
] }
anyhow = "1.0.98"
async-compression = { version = "0.3.13", default-features = false, features = [
"gzip",
"tokio",
] }
async-trait = "0.1.64"
bitfield = "0.18.0"
bytes = "1.1.0"
bytes-str = "0.2.7"
chrono = "0.4.23"
clap = { version = "4.5.2", features = ["derive"] }
concurrent-queue = "2.5.0"
console-subscriber = "0.4.1"
const_format = "0.2.30"
criterion = { package = "codspeed-criterion-compat", version = "2.10.1" }
crossbeam-channel = "0.5.8"
dashmap = "6.1.0"
data-encoding = "2.3.3"
divan = { version = "2.10.1", package = "codspeed-divan-compat" }
dhat = { version = "0.3.2" }
dunce = "1.0.3"
either = "1.9.0"
erased-serde = "0.4.5"
futures = "0.3.31"
futures-util = "0.3.31"
futures-retry = "0.6.0"
hashbrown = "0.14.5"
image = { version = "0.25.0", default-features = false }
indexmap = "2.7.1"
indoc = "2.0.0"
itertools = "0.10.5"
lightningcss = { version = "1.0.0-alpha.67", features = [
"serde",
"visitor",
"into_owned",
"browserslist"
] }
lightningcss-napi = { version = "0.4.4", default-features = false, features = [
"visitor",
] }
markdown = "1.0.0-alpha.18"
mime = "0.3.16"
napi = { version = "2", default-features = false, features = [
"napi3",
"serde-json",
"tokio_rt",
"error_anyhow",
# Lightningcss uses this features
"napi4",
"napi5",
"compat-mode"
] }
notify = "8.1.0"
once_cell = "1.17.1"
owo-colors = "3.5.0"
parcel_selectors = "0.28.2"
parking_lot = "0.12.1"
pathdiff = "0.2.1"
petgraph = "0.6.3"
pin-project-lite = "0.2.9"
postcard = "1.0.4"
proc-macro2 = "1.0.79"
qstring = "0.7.2"
quick_cache = { version = "0.6.14" }
quote = "1.0.23"
rand = "0.9.0"
rayon = "1.10.0"
regex = "1.10.6"
regress = "0.10.3"
reqwest = { version = "0.12.22", default-features = false }
ringmap = "0.1.3"
roaring = "0.10.10"
rstest = "0.16.0"
rustc-hash = "2.1.1"
semver = "1.0.16"
serde = { version = "1.0.217", features = ["derive"] }
serde_json = "1.0.138"
serde_bytes = "0.11.15"
serde_path_to_error = "0.1.16"
serde_qs = "0.13.0"
serde_with = "3.12.0"
smallvec = { version = "1.13.1", features = [
"serde",
"const_generics",
"union",
"const_new",
] }
swc_sourcemap = "9.3.3"
strsim = "0.11.1"
shrink-to-fit = "0.2.10"
syn = "2.0.100"
tempfile = "3.20.0"
thread_local = "1.1.8"
thiserror = "1.0.48"
tokio = "1.43.0"
tokio-util = { version = "0.7.13", features = ["io", "rt"] }
tracing = "0.1.37"
tracing-subscriber = "0.3.16"
triomphe = { git = "https://github.com/sokra/triomphe", branch = "sokra/unstable" }
unsize = "1.1.0"
url = "2.2.2"
urlencoding = "2.1.2"
vergen = { version = "9.0.6", features = [
"cargo",
] }
vergen-gitcl = { version = "1.0.8", features = [
"cargo",
] }
webbrowser = "0.8.7"
[patch.crates-io]
hyper = { git = "https://github.com/bgw/hyper-rs.git", branch = "v1.6.0-with-macos-intel-miscompilation-workaround" }
mdxjs = { git = "https://github.com/mischnic/mdxjs-rs.git", branch = "swc-core-32" }
lightningcss = { git = "https://github.com/parcel-bundler/lightningcss.git", branch = "mischnic/bump-browserslist" }
parcel_selectors = { git = "https://github.com/parcel-bundler/lightningcss.git", branch = "mischnic/bump-browserslist" }