-
Notifications
You must be signed in to change notification settings - Fork 5.8k
Description
Disclaimer: It's a bit hard to know whether the root cause is in Deno's scope or Cloudflare's scope, so I am posting an issue both in here and with Cloudflare support.
Description
When using Cloudflare WARP as an HTTPS proxy, deno is unable to fetch any resources as it errors with invalid peer certificate: BadSignature regardless of how Cloudflare's certificate is provided.
Context
Cloudflare WARP is a VPN client that can also act as an HTTPS proxy in an Enterprise setting (this is part of the Cloudflare Zero Trust suite of product). Effectively, Cloudflare acts as a man-in-the-middle for all HTTPS traffic when Cloudflare WARP is activated and configured to run as an HTTPS proxy. It therefore requires the endpoint to trust a certificate from Cloudflare, which can be downloaded here.
When using Deno, this certificate can be provided in one of three ways:
- Along the
--certCLI parameter. - By setting the environment variable
DENO_CERTto the path of the certificate. - By installing the certificate to the system's trust store and setting the environment variable
DENO_TLS_CA_STOREtosystem.
Regardless of how the certificate is provided, this fails. It may either be because of a defect of Cloudflare's proxy, or a defect in Deno's handling of custom certificates.
Steps to reproduce
- Install Cloudflare WARP, login to the appropriate Cloudflare team and configure the WARP client to enable the L7 proxy in the Zero Trust dashboard. Make sure that "Zero Trust" is toggled on the Cloudflare WARP client.
- Download the Cloudflare certificate in PEM format. Let's assume that it is stored at
~/cloudflare.pem. - Write a script that depends on a remote module that has not yet been cached (see example script). Let's assume that it is stored at
~/script.ts. - (Optionally: Bust the cache with
rm -r $(deno info --json | grep denoDir | cut -d: -f2 | sed 's/[" ,]//g').) - Run
deno run --cert ~/cloudflare.pem ~/script.ts.
This will fail with the following output:
error: Import 'https://deno.land/[email protected]/uuid/mod.ts' failed:
error sending request for url (https://deno.land/[email protected]/uuid/mod.ts):
error trying to connect:
invalid peer certificate: BadSignature
Example script
import { v1 } from "https://deno.land/[email protected]/uuid/mod.ts";
console.log(v1.generate());System settings
Output of deno --version:
deno 1.38.1 (release, aarch64-apple-darwin)
v8 12.0.267.1
typescript 5.2.2
OS: macOS Ventura 13.6.1
Cloudflare WARP version: 2023.9.252.0 (20230927.21)