55
66import vscode from 'vscode'
77import { getLogger } from '../logger/logger'
8+ import { tmpdir } from 'os'
9+ import { join } from 'path'
10+ import * as nodefs from 'fs' // eslint-disable-line no-restricted-imports
811
912interface ProxyConfig {
1013 proxyUrl : string | undefined
14+ noProxy : string | undefined
15+ proxyStrictSSL : boolean | true
1116 certificateAuthority : string | undefined
1217}
1318
@@ -23,11 +28,11 @@ export class ProxyUtil {
2328 * See documentation here for setting the environement variables which are inherited by Flare LS process:
2429 * https://github.com/aws/language-server-runtimes/blob/main/runtimes/docs/proxy.md
2530 */
26- public static configureProxyForLanguageServer ( ) : void {
31+ public static async configureProxyForLanguageServer ( ) : Promise < void > {
2732 try {
2833 const proxyConfig = this . getProxyConfiguration ( )
2934
30- this . setProxyEnvironmentVariables ( proxyConfig )
35+ await this . setProxyEnvironmentVariables ( proxyConfig )
3136 } catch ( err ) {
3237 this . logger . error ( `Failed to configure proxy: ${ err } ` )
3338 }
@@ -41,21 +46,30 @@ export class ProxyUtil {
4146 const proxyUrl = httpConfig . get < string > ( 'proxy' )
4247 this . logger . debug ( `Proxy URL Setting in VSCode Settings: ${ proxyUrl } ` )
4348
49+ const noProxy = httpConfig . get < string > ( 'noProxy' )
50+ if ( noProxy ) {
51+ this . logger . info ( `Using noProxy from VS Code settings: ${ noProxy } ` )
52+ }
53+
54+ const proxyStrictSSL = httpConfig . get < boolean > ( 'proxyStrictSSL' , true )
55+
4456 const amazonQConfig = vscode . workspace . getConfiguration ( 'amazonQ' )
4557 const proxySettings = amazonQConfig . get < {
4658 certificateAuthority ?: string
4759 } > ( 'proxy' , { } )
4860
4961 return {
5062 proxyUrl,
63+ noProxy,
64+ proxyStrictSSL,
5165 certificateAuthority : proxySettings . certificateAuthority ,
5266 }
5367 }
5468
5569 /**
5670 * Sets environment variables based on proxy configuration
5771 */
58- private static setProxyEnvironmentVariables ( config : ProxyConfig ) : void {
72+ private static async setProxyEnvironmentVariables ( config : ProxyConfig ) : Promise < void > {
5973 const proxyUrl = config . proxyUrl
6074 // Set proxy environment variables
6175 if ( proxyUrl ) {
@@ -64,11 +78,61 @@ export class ProxyUtil {
6478 this . logger . debug ( `Set proxy environment variables: ${ proxyUrl } ` )
6579 }
6680
67- // Set certificate bundle environment variables if configured
81+ // set NO_PROXY vals
82+ const noProxy = config . noProxy
83+ if ( noProxy ) {
84+ process . env . NO_PROXY = noProxy
85+ this . logger . debug ( `Set NO_PROXY environment variable: ${ noProxy } ` )
86+ }
87+
88+ const strictSSL = config . proxyStrictSSL
89+ // Handle SSL certificate verification
90+ if ( ! strictSSL ) {
91+ process . env . NODE_TLS_REJECT_UNAUTHORIZED = '0'
92+ this . logger . info ( 'SSL verification disabled via VS Code settings' )
93+ return // No need to set CA certs when SSL verification is disabled
94+ }
95+
96+ // Set certificate bundle environment variables if user configured
6897 if ( config . certificateAuthority ) {
6998 process . env . NODE_EXTRA_CA_CERTS = config . certificateAuthority
7099 process . env . AWS_CA_BUNDLE = config . certificateAuthority
71100 this . logger . debug ( `Set certificate bundle path: ${ config . certificateAuthority } ` )
101+ } else {
102+ // Fallback to system certificates if no custom CA is configured
103+ await this . setSystemCertificates ( )
104+ }
105+ }
106+
107+ /**
108+ * Sets system certificates as fallback when no custom CA is configured
109+ */
110+ private static async setSystemCertificates ( ) : Promise < void > {
111+ try {
112+ const tls = await import ( 'tls' )
113+ // @ts -ignore Get system certificates
114+ const systemCerts = tls . getCACertificates ( 'system' )
115+ // @ts -ignore Get any existing extra certificates
116+ const extraCerts = tls . getCACertificates ( 'extra' )
117+ const allCerts = [ ...systemCerts , ...extraCerts ]
118+ if ( allCerts && allCerts . length > 0 ) {
119+ this . logger . debug ( `Found ${ allCerts . length } certificates in system's trust store` )
120+
121+ const tempDir = join ( tmpdir ( ) , 'aws-toolkit-vscode' )
122+ if ( ! nodefs . existsSync ( tempDir ) ) {
123+ nodefs . mkdirSync ( tempDir , { recursive : true } )
124+ }
125+
126+ const certPath = join ( tempDir , 'vscode-ca-certs.pem' )
127+ const certContent = allCerts . join ( '\n' )
128+
129+ nodefs . writeFileSync ( certPath , certContent )
130+ process . env . NODE_EXTRA_CA_CERTS = certPath
131+ process . env . AWS_CA_BUNDLE = certPath
132+ this . logger . debug ( `Set system certificate bundle path: ${ certPath } ` )
133+ }
134+ } catch ( err ) {
135+ this . logger . error ( `Failed to extract system certificates: ${ err } ` )
72136 }
73137 }
74138}
0 commit comments