@@ -12,6 +12,7 @@ import (
12
12
"math/big"
13
13
"net"
14
14
"os"
15
+ "os/exec"
15
16
"path/filepath"
16
17
"sync"
17
18
"time"
@@ -293,6 +294,69 @@ func (cm *CertificateManager) generateServerCertificate(hostname string) (*tls.C
293
294
return tlsCert , nil
294
295
}
295
296
297
+ // InstallCACertificate installs the CA certificate into the system trust store
298
+ func (cm * CertificateManager ) InstallCACertificate () error {
299
+ // Get CA certificate in PEM format
300
+ caCertPEM , err := cm .GetCACertPEM ()
301
+ if err != nil {
302
+ return fmt .Errorf ("failed to get CA certificate: %v" , err )
303
+ }
304
+
305
+ // Install system-wide certificate (Linux)
306
+ if err := cm .installSystemCertificate (caCertPEM ); err != nil {
307
+ cm .logger .Warn ("Failed to install system certificate, continuing anyway" , "error" , err )
308
+ }
309
+
310
+ // Set up environment variables for tool-specific trust
311
+ if err := cm .setupEnvironmentVariables (); err != nil {
312
+ cm .logger .Warn ("Failed to setup environment variables" , "error" , err )
313
+ }
314
+
315
+ cm .logger .Info ("CA certificate trust setup completed" )
316
+ return nil
317
+ }
318
+
319
+ // installSystemCertificate installs the CA certificate system-wide on Linux
320
+ func (cm * CertificateManager ) installSystemCertificate (caCertPEM []byte ) error {
321
+ // Write certificate to system certificate directory
322
+ certPath := "/usr/local/share/ca-certificates/boundary-ca.crt"
323
+ if err := os .WriteFile (certPath , caCertPEM , 0644 ); err != nil {
324
+ return fmt .Errorf ("failed to write certificate to %s: %v" , certPath , err )
325
+ }
326
+
327
+ // Update system certificate store
328
+ cmd := exec .Command ("update-ca-certificates" )
329
+ if output , err := cmd .CombinedOutput (); err != nil {
330
+ return fmt .Errorf ("failed to update ca certificates: %v, output: %s" , err , output )
331
+ }
332
+
333
+ cm .logger .Info ("System CA certificate installed" , "path" , certPath )
334
+ return nil
335
+ }
336
+
337
+ // setupEnvironmentVariables sets up environment variables for tool-specific certificate trust
338
+ func (cm * CertificateManager ) setupEnvironmentVariables () error {
339
+ caCertPath := filepath .Join (cm .configDir , "ca-cert.pem" )
340
+
341
+ // Set environment variables for various tools
342
+ envVars := map [string ]string {
343
+ "SSL_CERT_FILE" : caCertPath ,
344
+ "REQUESTS_CA_BUNDLE" : caCertPath ,
345
+ "CURL_CA_BUNDLE" : caCertPath ,
346
+ "NODE_EXTRA_CA_CERTS" : caCertPath ,
347
+ }
348
+
349
+ for key , value := range envVars {
350
+ if err := os .Setenv (key , value ); err != nil {
351
+ cm .logger .Warn ("Failed to set environment variable" , "key" , key , "error" , err )
352
+ } else {
353
+ cm .logger .Debug ("Set environment variable" , "key" , key , "value" , value )
354
+ }
355
+ }
356
+
357
+ return nil
358
+ }
359
+
296
360
// GetConfigDir returns the configuration directory path
297
361
func GetConfigDir () (string , error ) {
298
362
homeDir , err := os .UserHomeDir ()
0 commit comments