register.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package functions
  2. import (
  3. "bytes"
  4. "crypto/ed25519"
  5. "crypto/rand"
  6. "encoding/json"
  7. "errors"
  8. "log"
  9. "net/http"
  10. "os"
  11. "github.com/gravitl/netmaker/logger"
  12. "github.com/gravitl/netmaker/netclient/config"
  13. "github.com/gravitl/netmaker/netclient/ncutils"
  14. "github.com/gravitl/netmaker/tls"
  15. )
  16. // Register - the function responsible for registering with the server and acquiring certs
  17. func Register(cfg *config.ClientConfig) error {
  18. if cfg.Server.Server == "" {
  19. return errors.New("no server provided")
  20. }
  21. if cfg.Server.AccessKey == "" {
  22. return errors.New("no access key provided")
  23. }
  24. //generate new key if one doesn' exist
  25. private, err := tls.ReadKey("/etc/netclient/client.key")
  26. if err != nil {
  27. _, *private, err = ed25519.GenerateKey(rand.Reader)
  28. if err != nil {
  29. return err
  30. }
  31. if err := tls.SaveKey(ncutils.GetNetclientPath(), "client.key", *private); err != nil {
  32. return err
  33. }
  34. }
  35. data := config.RegisterRequest{
  36. Key: *private,
  37. CommonName: tls.NewCName(os.Getenv("HOSTNAME")),
  38. }
  39. payload, err := json.Marshal(data)
  40. if err != nil {
  41. return err
  42. }
  43. url := "https://" + cfg.Server.API + "/api/server/register"
  44. log.Println("register at ", url)
  45. request, err := http.NewRequest(http.MethodPost, url, bytes.NewBuffer(payload))
  46. if err != nil {
  47. return err
  48. }
  49. request.Header.Set("Content-Type", "application/json")
  50. request.Header.Set("authorization", "Bearer "+cfg.Server.AccessKey)
  51. client := http.Client{}
  52. response, err := client.Do(request)
  53. if err != nil {
  54. return err
  55. }
  56. if response.StatusCode != http.StatusOK {
  57. return errors.New(response.Status)
  58. }
  59. var resp config.RegisterResponse
  60. if err := json.NewDecoder(response.Body).Decode(&resp); err != nil {
  61. return errors.New("unmarshal cert error " + err.Error())
  62. }
  63. //x509.Certificate.PublicKey is an interface so json encoding/decoding results in a string rather that []byte
  64. //the pubkeys are included in the response so the values in the certificate can be updated appropriately
  65. resp.CA.PublicKey = resp.CAPubKey
  66. resp.Cert.PublicKey = resp.CertPubKey
  67. if err := tls.SaveCert(ncutils.GetNetclientPath()+cfg.Server.Server+"/", "root.pem", &resp.CA); err != nil {
  68. return err
  69. }
  70. if err := tls.SaveCert(ncutils.GetNetclientPath()+cfg.Server.Server+"/", "client.pem", &resp.Cert); err != nil {
  71. return err
  72. }
  73. logger.Log(0, "certificates/key saved ")
  74. //join the network defined in the token
  75. return JoinNetwork(cfg, "", false)
  76. }