AUTH-3455: Generate short-lived ssh cert per hostname
This commit is contained in:
		
							parent
							
								
									da4d0b2bae
								
							
						
					
					
						commit
						63833b07dd
					
				|  | @ -387,7 +387,7 @@ func sshGen(c *cli.Context) error { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if err := sshgen.GenerateShortLivedCertificate(appInfo, cfdToken); err != nil { | 	if err := sshgen.GenerateShortLivedCertificate(originURL, cfdToken); err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -12,6 +12,7 @@ import ( | ||||||
| 	"io" | 	"io" | ||||||
| 	"io/ioutil" | 	"io/ioutil" | ||||||
| 	"net/http" | 	"net/http" | ||||||
|  | 	"net/url" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"github.com/coreos/go-oidc/jose" | 	"github.com/coreos/go-oidc/jose" | ||||||
|  | @ -51,8 +52,8 @@ type errorResponse struct { | ||||||
| var mockRequest func(url, contentType string, body io.Reader) (*http.Response, error) = nil | var mockRequest func(url, contentType string, body io.Reader) (*http.Response, error) = nil | ||||||
| 
 | 
 | ||||||
| // GenerateShortLivedCertificate generates and stores a keypair for short lived certs
 | // GenerateShortLivedCertificate generates and stores a keypair for short lived certs
 | ||||||
| func GenerateShortLivedCertificate(appInfo *cfpath.AppInfo, token string) error { | func GenerateShortLivedCertificate(appURL *url.URL, token string) error { | ||||||
| 	fullName, err := cfpath.GenerateAppTokenFilePathFromURL(appInfo.AppDomain, appInfo.AppAUD, keyName) | 	fullName, err := cfpath.GenerateSSHCertFilePathFromURL(appURL, keyName) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -9,7 +9,9 @@ import ( | ||||||
| 	"io/ioutil" | 	"io/ioutil" | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"net/http/httptest" | 	"net/http/httptest" | ||||||
|  | 	"net/url" | ||||||
| 	"os" | 	"os" | ||||||
|  | 	"strings" | ||||||
| 	"testing" | 	"testing" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
|  | @ -32,11 +34,12 @@ type signingArguments struct { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func TestCertGenSuccess(t *testing.T) { | func TestCertGenSuccess(t *testing.T) { | ||||||
| 	appInfo := &cfpath.AppInfo{AppAUD: "abcd1234", AppDomain: "mySite.com"} | 	url, _ := url.Parse("https://cf-test-access.com/testpath") | ||||||
| 	token := tokenGenerator() | 	token := tokenGenerator() | ||||||
| 
 | 
 | ||||||
| 	fullName, err := cfpath.GenerateAppTokenFilePathFromURL(appInfo.AppDomain, appInfo.AppAUD, keyName) | 	fullName, err := cfpath.GenerateSSHCertFilePathFromURL(url, keyName) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
|  | 	assert.True(t, strings.HasSuffix(fullName, "/cf-test-access.com-testpath-cf_key")) | ||||||
| 
 | 
 | ||||||
| 	pubKeyName := fullName + ".pub" | 	pubKeyName := fullName + ".pub" | ||||||
| 	certKeyName := fullName + "-cert.pub" | 	certKeyName := fullName + "-cert.pub" | ||||||
|  | @ -65,7 +68,7 @@ func TestCertGenSuccess(t *testing.T) { | ||||||
| 		return w.Result(), nil | 		return w.Result(), nil | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	err = GenerateShortLivedCertificate(appInfo, token) | 	err = GenerateShortLivedCertificate(url, token) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 
 | 
 | ||||||
| 	exist, err := config.FileExists(fullName) | 	exist, err := config.FileExists(fullName) | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ package token | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"net/url" | ||||||
| 	"os" | 	"os" | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
| 	"strings" | 	"strings" | ||||||
|  | @ -11,6 +12,16 @@ import ( | ||||||
| 	"github.com/cloudflare/cloudflared/config" | 	"github.com/cloudflare/cloudflared/config" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | // GenerateSSHCertFilePathFromURL will return a file path for creating short lived certificates
 | ||||||
|  | func GenerateSSHCertFilePathFromURL(url *url.URL, suffix string) (string, error) { | ||||||
|  | 	configPath, err := getConfigPath() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  | 	name := strings.Replace(fmt.Sprintf("%s%s-%s", url.Hostname(), url.EscapedPath(), suffix), "/", "-", -1) | ||||||
|  | 	return filepath.Join(configPath, name), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // GenerateAppTokenFilePathFromURL will return a filepath for given Access org token
 | // GenerateAppTokenFilePathFromURL will return a filepath for given Access org token
 | ||||||
| func GenerateAppTokenFilePathFromURL(appDomain, aud string, suffix string) (string, error) { | func GenerateAppTokenFilePathFromURL(appDomain, aud string, suffix string) (string, error) { | ||||||
| 	configPath, err := getConfigPath() | 	configPath, err := getConfigPath() | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue