Skip to content
Snippets Groups Projects
Select Git revision
1 result Searching

client.go

Blame
    • Niall Sheridan's avatar
      87ae7c73
      Add version string · 87ae7c73
      Niall Sheridan authored
      Add `lib.Version` to get updated at build time.
      Add --version flags to cashier and cashierd
      Send client version in the signing request
      Send server version in http response headers and in signing response
      Set version at build time
      87ae7c73
      History
      Add version string
      Niall Sheridan authored
      Add `lib.Version` to get updated at build time.
      Add --version flags to cashier and cashierd
      Send client version in the signing request
      Send server version in http response headers and in signing response
      Set version at build time
    client.go 4.59 KiB
    package client
    
    import (
    	"bufio"
    	"bytes"
    	"crypto/tls"
    	"encoding/base64"
    	"encoding/json"
    	"encoding/pem"
    	"fmt"
    	"io/ioutil"
    	"net/http"
    	"net/url"
    	"os"
    	"path"
    	"strings"
    	"time"
    
    	"github.com/nsheridan/cashier/lib"
    	"github.com/pkg/errors"
    	"golang.org/x/crypto/ssh"
    	"golang.org/x/crypto/ssh/agent"
    )
    
    var (
    	errNeedsReason = errors.New("reason required")
    )
    
    // SavePublicFiles installs the public part of the cert and key.
    func SavePublicFiles(prefix string, cert *ssh.Certificate, pub ssh.PublicKey) error {
    	if prefix == "" {
    		return nil
    	}
    	pubTxt := ssh.MarshalAuthorizedKey(pub)
    	certPubTxt := []byte(cert.Type() + " " + base64.StdEncoding.EncodeToString(cert.Marshal()))
    
    	_prefix := prefix + "/id_" + cert.KeyId
    
    	if err := ioutil.WriteFile(_prefix+".pub", pubTxt, 0644); err != nil {
    		return err
    	}
    	err := ioutil.WriteFile(_prefix+"-cert.pub", certPubTxt, 0644)
    
    	return err
    }
    
    // SavePrivateFiles installs the private part of the key.
    func SavePrivateFiles(prefix string, cert *ssh.Certificate, key Key) error {
    	if prefix == "" {
    		return nil
    	}
    	_prefix := prefix + "/id_" + cert.KeyId
    	pemBlock, err := pemBlockForKey(key)
    	if err != nil {
    		return err
    	}
    	err = ioutil.WriteFile(_prefix, pem.EncodeToMemory(pemBlock), 0600)
    	return err
    }
    
    // InstallCert adds the private key and signed certificate to the ssh agent.
    func InstallCert(a agent.Agent, cert *ssh.Certificate, key Key) error {
    	t := time.Unix(int64(cert.ValidBefore), 0)
    	lifetime := t.Sub(time.Now()).Seconds()
    	comment := fmt.Sprintf("%s [Expires %s]", cert.KeyId, t)
    	pubcert := agent.AddedKey{
    		PrivateKey:   key,
    		Certificate:  cert,
    		Comment:      comment,
    		LifetimeSecs: uint32(lifetime),