diff --git a/libmachine/provision/arch.go b/libmachine/provision/arch.go
index 86dc90cd74af3891cac264ba6d10b2ff39f16add..d9e216bbbbdc3ea252fc617d19a3da3f558a13b5 100644
--- a/libmachine/provision/arch.go
+++ b/libmachine/provision/arch.go
@@ -133,7 +133,9 @@ func (provisioner *ArchProvisioner) Provision(swarmOptions swarm.Options, authOp
 		return err
 	}
 
-	provisioner.AuthOptions = setRemoteAuthOptions(provisioner)
+	if err := setupRemoteAuthOptions(provisioner); err != nil {
+		return err
+	}
 
 	log.Debug("Configuring auth")
 	if err := ConfigureAuth(provisioner); err != nil {
diff --git a/libmachine/provision/boot2docker.go b/libmachine/provision/boot2docker.go
index ebe3b523ada36a4cec3848e0fbd78dfc7d0079ce..cba61c5852b3cd5bd064e5c7a424d9f3e4dee194 100644
--- a/libmachine/provision/boot2docker.go
+++ b/libmachine/provision/boot2docker.go
@@ -128,6 +128,10 @@ func (provisioner *Boot2DockerProvisioner) GetAuthOptions() auth.Options {
 	return provisioner.AuthOptions
 }
 
+func (provisioner *Boot2DockerProvisioner) SetAuthOptions(opts auth.Options) {
+	provisioner.AuthOptions = opts
+}
+
 func (provisioner *Boot2DockerProvisioner) GetSwarmOptions() swarm.Options {
 	return provisioner.SwarmOptions
 }
@@ -245,12 +249,10 @@ func (provisioner *Boot2DockerProvisioner) Provision(swarmOptions swarm.Options,
 		return err
 	}
 
-	if err = makeDockerOptionsDir(provisioner); err != nil {
+	if err := setupRemoteAuthOptions(provisioner); err != nil {
 		return err
 	}
 
-	provisioner.AuthOptions = setRemoteAuthOptions(provisioner)
-
 	if err = ConfigureAuth(provisioner); err != nil {
 		return err
 	}
diff --git a/libmachine/provision/coreos.go b/libmachine/provision/coreos.go
index dd1f0eb06013a8443b2ef4387acceade65400902..efa7e198d1b5f6c6a67d9b7936ae00b4a4e86125 100644
--- a/libmachine/provision/coreos.go
+++ b/libmachine/provision/coreos.go
@@ -118,13 +118,10 @@ func (provisioner *CoreOSProvisioner) Provision(swarmOptions swarm.Options, auth
 		return err
 	}
 
-	if err := makeDockerOptionsDir(provisioner); err != nil {
+	if err := setupRemoteAuthOptions(provisioner); err != nil {
 		return err
 	}
 
-	log.Debugf("Preparing certificates")
-	provisioner.AuthOptions = setRemoteAuthOptions(provisioner)
-
 	log.Debugf("Setting up certificates")
 	if err := ConfigureAuth(provisioner); err != nil {
 		return err
diff --git a/libmachine/provision/debian.go b/libmachine/provision/debian.go
index ce8bcc5e17635115493e8755e4daf48b7197e658..daa6cb62271899334b3637a665e5de9be353e581 100644
--- a/libmachine/provision/debian.go
+++ b/libmachine/provision/debian.go
@@ -120,7 +120,9 @@ func (provisioner *DebianProvisioner) Provision(swarmOptions swarm.Options, auth
 		return err
 	}
 
-	provisioner.AuthOptions = setRemoteAuthOptions(provisioner)
+	if err := setupRemoteAuthOptions(provisioner); err != nil {
+		return err
+	}
 
 	log.Debug("configuring auth")
 	if err := ConfigureAuth(provisioner); err != nil {
diff --git a/libmachine/provision/fake_provisioner.go b/libmachine/provision/fake_provisioner.go
index 7d4caaed9a43369eb3e70c7e4cb34d5cdf4a689f..1db64629fd6a422a73903e1f702cb767ccd061d3 100644
--- a/libmachine/provision/fake_provisioner.go
+++ b/libmachine/provision/fake_provisioner.go
@@ -43,6 +43,8 @@ func (fp *FakeProvisioner) GetAuthOptions() auth.Options {
 	return auth.Options{}
 }
 
+func (fp *FakeProvisioner) SetAuthOptions(opts auth.Options) {}
+
 func (fp *FakeProvisioner) GetSwarmOptions() swarm.Options {
 	return swarm.Options{}
 }
diff --git a/libmachine/provision/generic.go b/libmachine/provision/generic.go
index 24ad1b559991dd32d346a5f18d503cd1af87fef2..a060a143179dcf9ffe69f18be595f0eedaf18f8f 100644
--- a/libmachine/provision/generic.go
+++ b/libmachine/provision/generic.go
@@ -64,6 +64,10 @@ func (provisioner *GenericProvisioner) SetHostname(hostname string) error {
 	return nil
 }
 
+func (provisioner *GenericProvisioner) SetAuthOptions(opts auth.Options) {
+	provisioner.AuthOptions = opts
+}
+
 func (provisioner *GenericProvisioner) GetDockerOptionsDir() string {
 	return provisioner.DockerOptionsDir
 }
diff --git a/libmachine/provision/google_cos.go b/libmachine/provision/google_cos.go
index f0620f8886937ee84c235806595a00d46701a202..8cfbfabe5371c27e3c90fdbb0e91c739f3eaaace 100644
--- a/libmachine/provision/google_cos.go
+++ b/libmachine/provision/google_cos.go
@@ -89,8 +89,9 @@ func (p *GoogleCOSProvisioner) Provision(swarmOptions swarm.Options, authOptions
 		return err
 	}
 
-	log.Debugf("Preparing remote auth options")
-	p.AuthOptions = setRemoteAuthOptions(p)
+	if err := setupRemoteAuthOptions(p); err != nil {
+		return err
+	}
 
 	log.Debug("Configuring auth")
 	err = ConfigureAuth(p)
diff --git a/libmachine/provision/provisioner.go b/libmachine/provision/provisioner.go
index 81fc1ebedfb410471b173a9526df1b1d47f23f6c..a416e8515921d981c15ca1596ce4859993c1898c 100644
--- a/libmachine/provision/provisioner.go
+++ b/libmachine/provision/provisioner.go
@@ -50,6 +50,9 @@ type Provisioner interface {
 	// Return the auth options used to configure remote connection for the daemon.
 	GetAuthOptions() auth.Options
 
+	// Set auth options used to configure remote connection for the daemon.
+	SetAuthOptions(opts auth.Options)
+
 	// Get the swarm options associated with this host.
 	GetSwarmOptions() swarm.Options
 
diff --git a/libmachine/provision/rancheros.go b/libmachine/provision/rancheros.go
index a980b2bb79a74f0e65a81c78c71317b9bc556e92..2bc6bef5e34fc7e599e96d77e0ed26d7c60ff0a5 100644
--- a/libmachine/provision/rancheros.go
+++ b/libmachine/provision/rancheros.go
@@ -127,8 +127,9 @@ func (provisioner *RancherProvisioner) Provision(swarmOptions swarm.Options, aut
 		}
 	}
 
-	log.Debugf("Preparing certificates")
-	provisioner.AuthOptions = setRemoteAuthOptions(provisioner)
+	if err := setupRemoteAuthOptions(provisioner); err != nil {
+		return err
+	}
 
 	log.Debugf("Setting up certificates")
 	if err := ConfigureAuth(provisioner); err != nil {
diff --git a/libmachine/provision/redhat.go b/libmachine/provision/redhat.go
index 385bfde4f16d90288378ec4ede7f1f667e554eca..768165fd877731d238b11dda01bcf8cde113438d 100644
--- a/libmachine/provision/redhat.go
+++ b/libmachine/provision/redhat.go
@@ -165,12 +165,10 @@ func (provisioner *RedHatProvisioner) Provision(swarmOptions swarm.Options, auth
 		return err
 	}
 
-	if err := makeDockerOptionsDir(provisioner); err != nil {
+	if err := setupRemoteAuthOptions(provisioner); err != nil {
 		return err
 	}
 
-	provisioner.AuthOptions = setRemoteAuthOptions(provisioner)
-
 	if err := ConfigureAuth(provisioner); err != nil {
 		return err
 	}
diff --git a/libmachine/provision/suse.go b/libmachine/provision/suse.go
index 647a4e04947892e04f9c618d28f9a8719370363a..6586c6ddfa652a6f383fe89c1bdedf9e45f358f2 100644
--- a/libmachine/provision/suse.go
+++ b/libmachine/provision/suse.go
@@ -176,7 +176,9 @@ func (provisioner *SUSEProvisioner) Provision(swarmOptions swarm.Options, authOp
 		return err
 	}
 
-	provisioner.AuthOptions = setRemoteAuthOptions(provisioner)
+	if err := setupRemoteAuthOptions(provisioner); err != nil {
+		return err
+	}
 
 	log.Debug("Configuring auth")
 	if err := ConfigureAuth(provisioner); err != nil {
diff --git a/libmachine/provision/ubuntu_systemd.go b/libmachine/provision/ubuntu_systemd.go
index 21afa94998a12631f4ace9c5416786c39d8f23e5..900b9c0731aa569ac8b580611789bd29452c3ef3 100644
--- a/libmachine/provision/ubuntu_systemd.go
+++ b/libmachine/provision/ubuntu_systemd.go
@@ -130,7 +130,9 @@ func (provisioner *UbuntuSystemdProvisioner) Provision(swarmOptions swarm.Option
 		return err
 	}
 
-	provisioner.AuthOptions = setRemoteAuthOptions(provisioner)
+	if err := setupRemoteAuthOptions(provisioner); err != nil {
+		return err
+	}
 
 	log.Debug("configuring auth")
 	if err := ConfigureAuth(provisioner); err != nil {
diff --git a/libmachine/provision/ubuntu_upstart.go b/libmachine/provision/ubuntu_upstart.go
index 7f62ab2328640615c5ab19b3ee78d4b33acdf945..bea41d4d3b7c5d354b3f880a3d7f53c3da9cd766 100644
--- a/libmachine/provision/ubuntu_upstart.go
+++ b/libmachine/provision/ubuntu_upstart.go
@@ -143,12 +143,10 @@ func (provisioner *UbuntuProvisioner) Provision(swarmOptions swarm.Options, auth
 		return err
 	}
 
-	if err := makeDockerOptionsDir(provisioner); err != nil {
+	if err := setupRemoteAuthOptions(provisioner); err != nil {
 		return err
 	}
 
-	provisioner.AuthOptions = setRemoteAuthOptions(provisioner)
-
 	if err := ConfigureAuth(provisioner); err != nil {
 		return err
 	}
diff --git a/libmachine/provision/utils.go b/libmachine/provision/utils.go
index 0e211b8f07fe08780dc3ed5c325ebba8978c4c7c..f40820430ef2a64173ad37fa4d7d643f84e11212 100644
--- a/libmachine/provision/utils.go
+++ b/libmachine/provision/utils.go
@@ -34,7 +34,20 @@ func installDockerGeneric(p Provisioner, baseURL string) error {
 	return nil
 }
 
+func setupRemoteAuthOptions(p Provisioner) error {
+	err := makeDockerOptionsDir(p)
+	if err != nil {
+		return fmt.Errorf("(re)creating /etc/docker directory: %v", err)
+	}
+
+	p.SetAuthOptions(setRemoteAuthOptions(p))
+
+	return nil
+}
+
 func makeDockerOptionsDir(p Provisioner) error {
+	log.Debugf("(Re)creating /etc/docker if needed")
+
 	dockerDir := p.GetDockerOptionsDir()
 	if _, err := p.SSHCommand(fmt.Sprintf("sudo mkdir -p %s", dockerDir)); err != nil {
 		return err
@@ -44,6 +57,8 @@ func makeDockerOptionsDir(p Provisioner) error {
 }
 
 func setRemoteAuthOptions(p Provisioner) auth.Options {
+	log.Debugf("Preparing certificates")
+
 	dockerDir := p.GetDockerOptionsDir()
 	authOptions := p.GetAuthOptions()