diff --git a/cmd/gotenberg/main.go b/cmd/gotenberg/main.go index 4759d7d6..c9fa4e0b 100644 --- a/cmd/gotenberg/main.go +++ b/cmd/gotenberg/main.go @@ -28,7 +28,7 @@ func main() { systemLogger.DebugOpf(op, "configuration: %+v", config) if !config.DisableGoogleChrome() { // start Google Chrome headless. - if err := chrome.Start(systemLogger); err != nil { + if err := chrome.Start(systemLogger, config.IgnoreCertificateErrors()); err != nil { systemLogger.FatalOp(op, err) } } diff --git a/internal/pkg/chrome/chrome.go b/internal/pkg/chrome/chrome.go index a2250cfc..adf9a03f 100644 --- a/internal/pkg/chrome/chrome.go +++ b/internal/pkg/chrome/chrome.go @@ -16,11 +16,11 @@ import ( ) // Start starts Google Chrome headless in background. -func Start(logger xlog.Logger) error { +func Start(logger xlog.Logger, urlIgnoreCertificateErrors bool) error { const op string = "chrome.Start" logger.DebugOp(op, "starting new Google Chrome headless process on port 9222...") resolver := func() error { - cmd, err := cmd(logger) + cmd, err := cmd(logger, urlIgnoreCertificateErrors) if err != nil { return err } @@ -32,7 +32,7 @@ func Start(logger xlog.Logger) error { // if the process failed to start correctly, // we have to restart it. if !isViable(logger) { - return restart(logger, cmd.Process) + return restart(logger, cmd.Process, urlIgnoreCertificateErrors) } return nil } @@ -42,7 +42,7 @@ func Start(logger xlog.Logger) error { return nil } -func cmd(logger xlog.Logger) (*exec.Cmd, error) { +func cmd(logger xlog.Logger, urlIgnoreCertificateErrors bool) (*exec.Cmd, error) { const op string = "chrome.cmd" binary := "google-chrome-stable" args := []string{ @@ -66,6 +66,11 @@ func cmd(logger xlog.Logger) (*exec.Cmd, error) { "--mute-audio", "--no-first-run", } + + if urlIgnoreCertificateErrors { + args = append(args, "--ignore-certificate-errors") + } + cmd, err := xexec.Command(logger, binary, args...) if err != nil { return nil, xerror.New(op, err) @@ -93,7 +98,7 @@ func kill(logger xlog.Logger, proc *os.Process) error { return nil } -func restart(logger xlog.Logger, proc *os.Process) error { +func restart(logger xlog.Logger, proc *os.Process, urlIgnoreCertificateErrors bool) error { const op string = "chrome.restart" logger.DebugOp(op, "restarting Google Chrome headless process using port 9222...") resolver := func() error { @@ -101,7 +106,7 @@ func restart(logger xlog.Logger, proc *os.Process) error { if err := kill(logger, proc); err != nil { return err } - cmd, err := cmd(logger) + cmd, err := cmd(logger, urlIgnoreCertificateErrors) if err != nil { return err } @@ -113,7 +118,7 @@ func restart(logger xlog.Logger, proc *os.Process) error { // if the process failed to restart correctly, // we have to restart it again. if !isViable(logger) { - return restart(logger, cmd.Process) + return restart(logger, cmd.Process, urlIgnoreCertificateErrors) } return nil } diff --git a/internal/pkg/conf/conf.go b/internal/pkg/conf/conf.go index 45d1bce1..73757f2d 100644 --- a/internal/pkg/conf/conf.go +++ b/internal/pkg/conf/conf.go @@ -40,6 +40,8 @@ const ( // DefaultGoogleChromeRpccBufferSizeEnvVar contains the name // of the environment variable "DEFAULT_GOOGLE_CHROME_RPCC_BUFFER_SIZE". DefaultGoogleChromeRpccBufferSizeEnvVar string = "DEFAULT_GOOGLE_CHROME_RPCC_BUFFER_SIZE" + // Allow self signed certificates when using a remote url + URLIgnoreCertificateErrorsEnvVar string = "URL_IGNORE_CERTIFICATE_ERRORS" ) // Config contains the application @@ -53,6 +55,7 @@ type Config struct { defaultListenPort int64 disableGoogleChrome bool disableUnoconv bool + urlIgnoreCertificateErrors bool logLevel xlog.Level rootPath string maximumGoogleChromeRpccBufferSize int64 @@ -75,6 +78,7 @@ func DefaultConfig() Config { rootPath: "/", maximumGoogleChromeRpccBufferSize: 104857600, // ~100 MB defaultGoogleChromeRpccBufferSize: 1048576, // 1 MB + urlIgnoreCertificateErrors: false, } } @@ -188,6 +192,14 @@ func FromEnv() (Config, error) { if err != nil { return c, err } + urlIgnoreCertificateErrors, err := xassert.BoolFromEnv( + URLIgnoreCertificateErrorsEnvVar, + c.urlIgnoreCertificateErrors, + ) + c.urlIgnoreCertificateErrors = urlIgnoreCertificateErrors + if err != nil { + return c, err + } return c, nil } result, err := resolver() @@ -274,3 +286,10 @@ func (c Config) MaximumGoogleChromeRpccBufferSize() int64 { func (c Config) DefaultGoogleChromeRpccBufferSize() int64 { return c.defaultGoogleChromeRpccBufferSize } + +// IgnoreCertificateErrors returns true if +// Google Chrome should ignore certificate errors +// in case of self signed certificates for example. +func (c Config) IgnoreCertificateErrors() bool { + return c.urlIgnoreCertificateErrors +} diff --git a/test/cmd/chrome.go b/test/cmd/chrome.go index 73d96474..ad5e5e7c 100644 --- a/test/cmd/chrome.go +++ b/test/cmd/chrome.go @@ -14,7 +14,7 @@ func main() { systemLogger.FatalOp(op, err) } // start Google Chrome headless. - if err := chrome.Start(systemLogger); err != nil { + if err := chrome.Start(systemLogger, config.IgnoreCertificateErrors()); err != nil { systemLogger.FatalOp(op, err) } }