Browse Source

First pass at lego-based cert retriever.

(Holy dependencies, batman)
master
Chris Smith 5 years ago
parent
commit
f74d2f0aac
3 changed files with 481 additions and 2 deletions
  1. 49
    2
      go.mod
  2. 181
    0
      go.sum
  3. 251
    0
      lego.go

+ 49
- 2
go.mod View File

@@ -1,17 +1,64 @@
1 1
 module github.com/csmith/dotege
2 2
 
3 3
 require (
4
+	contrib.go.opencensus.io/exporter/ocagent v0.4.6 // indirect
5
+	github.com/Azure/azure-sdk-for-go v26.1.0+incompatible // indirect
6
+	github.com/Azure/go-autorest v11.5.0+incompatible // indirect
7
+	github.com/JamesClonk/vultr v0.0.0-20190227191206-c034fac6873e // indirect
4 8
 	github.com/Microsoft/go-winio v0.4.11 // indirect
9
+	github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87 // indirect
10
+	github.com/akamai/AkamaiOPEN-edgegrid-golang v0.7.3 // indirect
11
+	github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190228100301-04069f0b8c3f // indirect
12
+	github.com/aws/aws-sdk-go v1.17.7 // indirect
13
+	github.com/cenkalti/backoff v2.1.1+incompatible // indirect
14
+	github.com/cloudflare/cloudflare-go v0.8.5 // indirect
15
+	github.com/cpu/goacmedns v0.0.1 // indirect
16
+	github.com/decker502/dnspod-go v0.2.0 // indirect
17
+	github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect
18
+	github.com/dimchansky/utfbom v1.1.0 // indirect
19
+	github.com/dnsimple/dnsimple-go v0.23.0 // indirect
5 20
 	github.com/docker/distribution v2.7.1+incompatible // indirect
6 21
 	github.com/docker/docker v1.13.1
7 22
 	github.com/docker/go-connections v0.4.0 // indirect
8 23
 	github.com/docker/go-units v0.3.3 // indirect
24
+	github.com/exoscale/egoscale v0.14.3 // indirect
25
+	github.com/fatih/structs v1.1.0 // indirect
26
+	github.com/go-ini/ini v1.42.0 // indirect
27
+	github.com/google/go-querystring v1.0.0 // indirect
28
+	github.com/google/uuid v1.1.1 // indirect
29
+	github.com/gophercloud/gophercloud v0.0.0-20190227173556-cfa8434422e7 // indirect
30
+	github.com/iij/doapi v0.0.0-20180911005243-8803795a9b7b // indirect
31
+	github.com/json-iterator/go v1.1.5 // indirect
32
+	github.com/juju/ratelimit v1.0.1 // indirect
33
+	github.com/kolo/xmlrpc v0.0.0-20181023172212-16bdd962781d // indirect
34
+	github.com/linode/linodego v0.7.1 // indirect
35
+	github.com/miekg/dns v1.1.4 // indirect
36
+	github.com/mitchellh/go-homedir v1.1.0 // indirect
37
+	github.com/mitchellh/mapstructure v1.1.2 // indirect
38
+	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
39
+	github.com/modern-go/reflect2 v1.0.1 // indirect
40
+	github.com/namedotcom/go v0.0.0-20180403034216-08470befbe04 // indirect
41
+	github.com/nrdcg/auroradns v1.0.0 // indirect
42
+	github.com/nrdcg/goinwx v0.6.0 // indirect
9 43
 	github.com/opencontainers/go-digest v1.0.0-rc1 // indirect
44
+	github.com/ovh/go-ovh v0.0.0-20181109152953-ba5adb4cf014 // indirect
10 45
 	github.com/pkg/errors v0.8.1 // indirect
46
+	github.com/sacloud/libsacloud v1.15.0 // indirect
47
+	github.com/sirupsen/logrus v1.3.0 // indirect
11 48
 	github.com/stretchr/testify v1.3.0 // indirect
49
+	github.com/timewasted/linode v0.0.0-20160829202747-37e84520dcf7 // indirect
50
+	github.com/transip/gotransip v5.8.2+incompatible // indirect
51
+	github.com/xenolf/lego v2.2.0+incompatible
12 52
 	go.uber.org/atomic v1.3.2 // indirect
13 53
 	go.uber.org/multierr v1.1.0 // indirect
14 54
 	go.uber.org/zap v1.9.1
15
-	golang.org/x/net v0.0.0-20190213061140-3a22650c66bd // indirect
16
-	golang.org/x/sys v0.0.0-20190213121743-983097b1a8a3 // indirect
55
+	golang.org/x/crypto v0.0.0-20190228050851-31a38585487a // indirect
56
+	golang.org/x/net v0.0.0-20190213061140-3a22650c66bd
57
+	golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421 // indirect
58
+	golang.org/x/time v0.0.0-20181108054448-85acf8d2951c // indirect
59
+	google.golang.org/api v0.1.0 // indirect
60
+	gopkg.in/ini.v1 v1.42.0 // indirect
61
+	gopkg.in/ns1/ns1-go.v2 v2.0.0-20181211201113-a57b2a18aab6 // indirect
62
+	gopkg.in/resty.v1 v1.12.0 // indirect
63
+	gopkg.in/square/go-jose.v2 v2.3.0 // indirect
17 64
 )

+ 181
- 0
go.sum View File

@@ -1,7 +1,46 @@
1
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
2
+cloud.google.com/go v0.34.0 h1:eOI3/cP2VTU6uZLDYAoic+eyzzB9YyGmJ7eIjl8rOPg=
3
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
4
+contrib.go.opencensus.io/exporter/ocagent v0.4.6 h1:xVeoJwnzMbseoL9YWhohR6SN/GncvP1p/fznasLkT/E=
5
+contrib.go.opencensus.io/exporter/ocagent v0.4.6/go.mod h1:YuG83h+XWwqWjvCqn7vK4KSyLKhThY3+gNGQ37iS2V0=
6
+git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
7
+github.com/Azure/azure-sdk-for-go v26.1.0+incompatible h1:uCdb+BMC9UuASbdJ+ObaRAglOYBs9OVb8BifoB+8ur4=
8
+github.com/Azure/azure-sdk-for-go v26.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
9
+github.com/Azure/go-autorest v11.5.0+incompatible h1:zp9GQJhEX+EBqEYC2MEGQ+gjKFEPRAWtfwcmstS2hGk=
10
+github.com/Azure/go-autorest v11.5.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
11
+github.com/JamesClonk/vultr v0.0.0-20190227191206-c034fac6873e h1:l9pxunkqzV2TXLGWiPiWHzCVbplZ2tOeuI0ClGd03WE=
12
+github.com/JamesClonk/vultr v0.0.0-20190227191206-c034fac6873e/go.mod h1:k9Jhe7M4bxsOOTMtsXQ0Hj7R7vw0FW4Q4jVJrPis9a8=
1 13
 github.com/Microsoft/go-winio v0.4.11 h1:zoIOcVf0xPN1tnMVbTtEdI+P8OofVk3NObnwOQ6nK2Q=
2 14
 github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=
15
+github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87 h1:xPMsUicZ3iosVPSIP7bW5EcGUzjiiMl1OYTe14y/R24=
16
+github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87/go.mod h1:iGLljf5n9GjT6kc0HBvyI1nOKnGQbNB66VzSNbK5iks=
17
+github.com/akamai/AkamaiOPEN-edgegrid-golang v0.7.3 h1:dykhpMRJv9SJt7zyG5whKRiirHLckuDFN1hVUj7+oW0=
18
+github.com/akamai/AkamaiOPEN-edgegrid-golang v0.7.3/go.mod h1:eXWHAoXwqXM7CFZpE8zdz9OVRk4G8BCR1mDwYvIyFsA=
19
+github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190228100301-04069f0b8c3f h1:hcD9FiDpFFs36OuTb3s44L9BpDmf1PUhst6JVqhpLn0=
20
+github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190228100301-04069f0b8c3f/go.mod h1:T9M45xf79ahXVelWoOBmH0y4aC1t5kXO5BxwyakgIGA=
21
+github.com/aws/aws-sdk-go v1.17.7 h1:/4+rDPe0W95KBmNGYCG+NUvdL8ssPYBMxL+aSCg6nIA=
22
+github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
23
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
24
+github.com/cenkalti/backoff v2.1.1+incompatible h1:tKJnvO2kl0zmb/jA5UKAt4VoEVw1qxKWjE/Bpp46npY=
25
+github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
26
+github.com/census-instrumentation/opencensus-proto v0.1.0-0.20181214143942-ba49f56771b8 h1:gUqsFVdUKoRHNg8fkFd8gB5OOEa/g5EwlAHznb4zjbI=
27
+github.com/census-instrumentation/opencensus-proto v0.1.0-0.20181214143942-ba49f56771b8/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
28
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
29
+github.com/cloudflare/cloudflare-go v0.8.5 h1:k1iz+H2jIL8OnS+bGhNQ6GPldi7VCo2tuWmfQ4kMiDI=
30
+github.com/cloudflare/cloudflare-go v0.8.5/go.mod h1:8KhU6K+zHUEWOSU++mEQYf7D9UZOcQcibUoSm6vCUz4=
31
+github.com/cpu/goacmedns v0.0.1 h1:GeIU5chKys9zmHgOAgP+bstRaLqcGQ6HJh/hLw9hrus=
32
+github.com/cpu/goacmedns v0.0.1/go.mod h1:sesf/pNnCYwUevQEQfEwY0Y3DydlQWSGZbaMElOWxok=
3 33
 github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
4 34
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
35
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
36
+github.com/decker502/dnspod-go v0.2.0 h1:6dwhUFCYbC5bgpebLKn7PrI43e/5mn9tpUL9YcYCdTU=
37
+github.com/decker502/dnspod-go v0.2.0/go.mod h1:qsurYu1FgxcDwfSwXJdLt4kRsBLZeosEb9uq4Sy+08g=
38
+github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
39
+github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
40
+github.com/dimchansky/utfbom v1.1.0 h1:FcM3g+nofKgUteL8dm/UpdRXNC9KmADgTpLKsu0TRo4=
41
+github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8=
42
+github.com/dnsimple/dnsimple-go v0.23.0 h1:HGHL2ShLGSLsPIGGhA6940uT70lTrqoClYbazoHK+D4=
43
+github.com/dnsimple/dnsimple-go v0.23.0/go.mod h1:0FYu4qVNv/UcfZPNwa9zi68IkggJu3TIwM54D7rhmI4=
5 44
 github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug=
6 45
 github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
7 46
 github.com/docker/docker v1.13.1 h1:IkZjBSIc8hBjLpqeAbeE5mca5mNgeatLHBy3GO78BWo=
@@ -10,22 +49,164 @@ github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKoh
10 49
 github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
11 50
 github.com/docker/go-units v0.3.3 h1:Xk8S3Xj5sLGlG5g67hJmYMmUgXv5N4PhkjJHHqrwnTk=
12 51
 github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
52
+github.com/exoscale/egoscale v0.14.3 h1:e5NJdsJ54TMrHDOJBDr1TAWTgM6QQkrfvjRp/MoC5hg=
53
+github.com/exoscale/egoscale v0.14.3/go.mod h1:SHSox0l8ud/I8Q6joR7Oj96DFer0mdo1cQzb7dmZgro=
54
+github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
55
+github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
56
+github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
57
+github.com/go-ini/ini v1.42.0 h1:TWr1wGj35+UiWHlBA8er89seFXxzwFn11spilrrj+38=
58
+github.com/go-ini/ini v1.42.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
59
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
60
+github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E=
61
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
62
+github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
63
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
64
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
65
+github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
66
+github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
67
+github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
68
+github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
69
+github.com/gophercloud/gophercloud v0.0.0-20190227173556-cfa8434422e7 h1:xBfDeSdmORZWYPc0NdQNn7RotVOlg2ZAp/9qCkMuCXI=
70
+github.com/gophercloud/gophercloud v0.0.0-20190227173556-cfa8434422e7/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8=
71
+github.com/grpc-ecosystem/grpc-gateway v1.5.0 h1:WcmKMm43DR7RdtlkEXQJyo5ws8iTp98CyhCCbOHMvNI=
72
+github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
73
+github.com/iij/doapi v0.0.0-20180911005243-8803795a9b7b h1:FggChB6PC8OugG7sAlG2oueeXlljdNDQTpVdOYxHDQo=
74
+github.com/iij/doapi v0.0.0-20180911005243-8803795a9b7b/go.mod h1:QMZY7/J/KSQEhKWFeDesPjMj+wCHReeknARU3wqlyN4=
75
+github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM=
76
+github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
77
+github.com/json-iterator/go v1.1.5 h1:gL2yXlmiIo4+t+y32d4WGwOjKGYcGOuyrg46vadswDE=
78
+github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
79
+github.com/juju/ratelimit v1.0.1 h1:+7AIFJVQ0EQgq/K9+0Krm7m530Du7tIz0METWzN0RgY=
80
+github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk=
81
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
82
+github.com/kolo/xmlrpc v0.0.0-20181023172212-16bdd962781d h1:Ai2G9HFG0t5IlYCvaJeLM7vT5TDGKhmZ8kIXolUrvy0=
83
+github.com/kolo/xmlrpc v0.0.0-20181023172212-16bdd962781d/go.mod h1:o03bZfuBwAXHetKXuInt4S7omeXUu62/A845kiycsSQ=
84
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
85
+github.com/linode/linodego v0.7.1 h1:4WZmMpSA2NRwlPZcc0+4Gyn7rr99Evk9bnr0B3gXRKE=
86
+github.com/linode/linodego v0.7.1/go.mod h1:ga11n3ivecUrPCHN0rANxKmfWBJVkOXfLMZinAbj2sY=
87
+github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
88
+github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
89
+github.com/mattn/go-tty v0.0.0-20180219170247-931426f7535a/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE=
90
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
91
+github.com/miekg/dns v1.1.4 h1:rCMZsU2ScVSYcAsOXgmC6+AKOK+6pmQTOcw03nfwYV0=
92
+github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
93
+github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
94
+github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
95
+github.com/mitchellh/go-vnc v0.0.0-20150629162542-723ed9867aed/go.mod h1:3rdaFaCv4AyBgu5ALFM0+tSuHrBh6v692nyQe3ikrq0=
96
+github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
97
+github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
98
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
99
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
100
+github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
101
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
102
+github.com/namedotcom/go v0.0.0-20180403034216-08470befbe04 h1:o6uBwrhM5C8Ll3MAAxrQxRHEu7FkapwTuI2WmL1rw4g=
103
+github.com/namedotcom/go v0.0.0-20180403034216-08470befbe04/go.mod h1:5sN+Lt1CaY4wsPvgQH/jsuJi4XO2ssZbdsIizr4CVC8=
104
+github.com/nrdcg/auroradns v1.0.0 h1:b+NpSqNG6HzMqX2ohGQe4Q/G0WQq8pduWCiZ19vdLY8=
105
+github.com/nrdcg/auroradns v1.0.0/go.mod h1:6JPXKzIRzZzMqtTDgueIhTi6rFf1QvYE/HzqidhOhjw=
106
+github.com/nrdcg/goinwx v0.6.0 h1:vO4ieYy/YeYq08G9acSaoUvd+5NGpD4pzpyZMS3Hw7o=
107
+github.com/nrdcg/goinwx v0.6.0/go.mod h1:Yr0foJtWXDn72OqtUeJ7OUo2GkF4cJE9QGX5tfBeBaA=
13 108
 github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ=
14 109
 github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
110
+github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
111
+github.com/ovh/go-ovh v0.0.0-20181109152953-ba5adb4cf014 h1:37VE5TYj2m/FLA9SNr4z0+A0JefvTmR60Zwf8XSEV7c=
112
+github.com/ovh/go-ovh v0.0.0-20181109152953-ba5adb4cf014/go.mod h1:joRatxRJaZBsY3JAOEMcoOp05CnZzsx4scTxi95DHyQ=
15 113
 github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
16 114
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
17 115
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
18 116
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
117
+github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
118
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
119
+github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
120
+github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
121
+github.com/sacloud/libsacloud v1.15.0 h1:pGl4dNwxGFQT1UqykhZsRj7QcSjA/cMePimlQW/F+do=
122
+github.com/sacloud/libsacloud v1.15.0/go.mod h1:ukUUnigTFBzC2x/JTPpCmBjWTMOJ7yaPSF/Z0+eXnQg=
123
+github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
124
+github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
125
+github.com/sirupsen/logrus v1.3.0 h1:hI/7Q+DtNZ2kINb6qt/lS+IyXnHQe9e90POfeewL/ME=
126
+github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
127
+github.com/skratchdot/open-golang v0.0.0-20160302144031-75fb7ed4208c/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog=
19 128
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
129
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
130
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
20 131
 github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
21 132
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
133
+github.com/timewasted/linode v0.0.0-20160829202747-37e84520dcf7 h1:CpHxIaZzVy26GqJn8ptRyto8fuoYOd1v0fXm9bG3wQ8=
134
+github.com/timewasted/linode v0.0.0-20160829202747-37e84520dcf7/go.mod h1:imsgLplxEC/etjIhdr3dNzV3JeT27LbVu5pYWm0JCBY=
135
+github.com/transip/gotransip v5.8.2+incompatible h1:aNJhw/w/3QBqFcHAIPz1ytoK5FexeMzbUCGrrhWr3H0=
136
+github.com/transip/gotransip v5.8.2+incompatible/go.mod h1:uacMoJVmrfOcscM4Bi5NVg708b7c6rz2oDTWqa7i2Ic=
137
+github.com/xenolf/lego v2.2.0+incompatible h1:r4UAcpgPmX3j0aThoVrRM1FFLcvyy08UyGbIwFU4zoQ=
138
+github.com/xenolf/lego v2.2.0+incompatible/go.mod h1:fwiGnfsIjG7OHPfOvgK7Y/Qo6+2Ox0iozjNTkZICKbY=
139
+go.opencensus.io v0.18.0 h1:Mk5rgZcggtbvtAun5aJzAtjKKN/t0R3jJPlWILlv938=
140
+go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
141
+go.opencensus.io v0.18.1-0.20181204023538-aab39bd6a98b h1:6ayHMBPtdP3jNuk+Sfhso+PTB7ZJQ5E1FBo403m2H8w=
142
+go.opencensus.io v0.18.1-0.20181204023538-aab39bd6a98b/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
22 143
 go.uber.org/atomic v1.3.2 h1:2Oa65PReHzfn29GpvgsYwloV9AVFHPDk8tYxt2c2tr4=
23 144
 go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
24 145
 go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI=
25 146
 go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
26 147
 go.uber.org/zap v1.9.1 h1:XCJQEf3W6eZaVwhRBof6ImoYGJSITeKWsyeh3HFu/5o=
27 148
 go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
149
+golang.org/x/crypto v0.0.0-20180621125126-a49355c7e3f8/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
150
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
151
+golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
152
+golang.org/x/crypto v0.0.0-20190228050851-31a38585487a h1:53VJPSIh1mc/PLK5AlXoj1HHfovtbS77YvYJ0AqjSgE=
153
+golang.org/x/crypto v0.0.0-20190228050851-31a38585487a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
154
+golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
155
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
156
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
157
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
158
+golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
159
+golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
160
+golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
161
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
28 162
 golang.org/x/net v0.0.0-20190213061140-3a22650c66bd h1:HuTn7WObtcDo9uEEU7rEqL0jYthdXAmZ6PP+meazmaU=
29 163
 golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
164
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
165
+golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
166
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421 h1:Wo7BWFiOk0QRFMLYMqJGFMd9CgUAcGx7V+qEg/h5IBI=
167
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
168
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
169
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
170
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw=
171
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
172
+golang.org/x/sys v0.0.0-20180622082034-63fc586f45fe/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
173
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
174
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
175
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
176
+golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
30 177
 golang.org/x/sys v0.0.0-20190213121743-983097b1a8a3 h1:+KlxhGbYkFs8lMfwKn+2ojry1ID5eBSMXprS2u/wqCE=
31 178
 golang.org/x/sys v0.0.0-20190213121743-983097b1a8a3/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
179
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
180
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
181
+golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
182
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
183
+golang.org/x/time v0.0.0-20181108054448-85acf8d2951c h1:fqgJT0MGcGpPgpWU7VRdRjuArfcOvC4AoJmILihzhDg=
184
+golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
185
+golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
186
+google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
187
+google.golang.org/api v0.1.0 h1:K6z2u68e86TPdSdefXdzvXgR1zEMa+459vBSfWYAZkI=
188
+google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y=
189
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
190
+google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
191
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
192
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
193
+google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
194
+google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898 h1:yvw+zsSmSM02Z5H3ZdEV7B7Ql7eFrjQTnmByJvK+3J8=
195
+google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg=
196
+google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
197
+google.golang.org/grpc v1.15.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
198
+google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
199
+google.golang.org/grpc v1.17.0 h1:TRJYBgMclJvGYn2rIMjj+h9KtMt5r1Ij7ODVRIZkwhk=
200
+google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
201
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
202
+gopkg.in/ini.v1 v1.42.0 h1:7N3gPTt50s8GuLortA00n8AqRTk75qOP98+mTPpgzRk=
203
+gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
204
+gopkg.in/ns1/ns1-go.v2 v2.0.0-20181211201113-a57b2a18aab6 h1:wsmK0l28wXuEDSC3j2ttwI84jLrOHMTxHetxx+xAMfI=
205
+gopkg.in/ns1/ns1-go.v2 v2.0.0-20181211201113-a57b2a18aab6/go.mod h1:VV+3haRsgDiVLxyifmMBrBIuCWFBPYKbRssXB9z67Hw=
206
+gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI=
207
+gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
208
+gopkg.in/square/go-jose.v2 v2.3.0 h1:nLzhkFyl5bkblqYBoiWJUt5JkWOzmiaBtCxdJAqJd3U=
209
+gopkg.in/square/go-jose.v2 v2.3.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
210
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
211
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
212
+honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

+ 251
- 0
lego.go View File

@@ -0,0 +1,251 @@
1
+package main
2
+
3
+import (
4
+	"crypto"
5
+	"crypto/ecdsa"
6
+	"crypto/elliptic"
7
+	"crypto/rand"
8
+	"crypto/x509"
9
+	"encoding/json"
10
+	"github.com/xenolf/lego/certcrypto"
11
+	"github.com/xenolf/lego/certificate"
12
+	"github.com/xenolf/lego/lego"
13
+	"github.com/xenolf/lego/log"
14
+	"github.com/xenolf/lego/providers/dns"
15
+	"github.com/xenolf/lego/registration"
16
+	"go.uber.org/zap"
17
+	"io/ioutil"
18
+	"sort"
19
+	"time"
20
+)
21
+
22
+type AcmeUser struct {
23
+	Email        string                 `json:"email"`
24
+	Registration *registration.Resource `json:"registration,omitempty"`
25
+	LiveKey      *ecdsa.PrivateKey      `json:"-"`
26
+	Key          []byte                 `json:"key"`
27
+}
28
+
29
+func (u *AcmeUser) GetEmail() string {
30
+	return u.Email
31
+}
32
+func (u AcmeUser) GetRegistration() *registration.Resource {
33
+	return u.Registration
34
+}
35
+func (u *AcmeUser) GetPrivateKey() crypto.PrivateKey {
36
+	return u.LiveKey
37
+}
38
+
39
+type SavedCertificate struct {
40
+	Domains           []string  `json:"domains"`
41
+	CertURL           string    `json:"certUrl"`
42
+	CertStableURL     string    `json:"certStableUrl"`
43
+	NotAfter          time.Time `json:"notAfter"`
44
+	PrivateKey        []byte    `json:"privateKey"`
45
+	Certificate       []byte    `json:"certificate"`
46
+	IssuerCertificate []byte    `json:"issuer"`
47
+	CSR               []byte    `json:"csr"`
48
+}
49
+
50
+type CertificateManagerData struct {
51
+	User  *AcmeUser           `json:"user"`
52
+	Certs []*SavedCertificate `json:"certs"`
53
+}
54
+
55
+type CertificateManager struct {
56
+	logger       *zap.SugaredLogger
57
+	acmeProvider string
58
+	keyType      certcrypto.KeyType
59
+	path         string
60
+	dnsProvider  string
61
+	data         *CertificateManagerData
62
+	client       *lego.Client
63
+}
64
+
65
+func NewCertificateManager(logger *zap.SugaredLogger, acmeProvider string, keyType certcrypto.KeyType, dnsProvider string, path string) *CertificateManager {
66
+	return &CertificateManager{
67
+		logger:       logger,
68
+		acmeProvider: acmeProvider,
69
+		keyType:      keyType,
70
+		dnsProvider:  dnsProvider,
71
+		path:         path,
72
+	}
73
+}
74
+
75
+func (c *CertificateManager) Init(email string) error {
76
+	legoLogger, err := zap.NewStdLogAt(c.logger.Desugar(), zap.DebugLevel)
77
+	if err == nil {
78
+		log.Logger = legoLogger
79
+		err = c.load()
80
+	}
81
+	if err == nil {
82
+		err = c.createUser(email)
83
+	}
84
+	if err == nil {
85
+		err = c.createClient()
86
+	}
87
+	if err == nil {
88
+		err = c.register()
89
+	}
90
+	return err
91
+}
92
+
93
+func (c *CertificateManager) load() error {
94
+	data := &CertificateManagerData{}
95
+	buf, _ := ioutil.ReadFile(c.path)
96
+	if buf != nil {
97
+		err := json.Unmarshal(buf, data)
98
+		if err != nil {
99
+			return err
100
+		}
101
+
102
+		if data.User != nil {
103
+			liveKey, err := x509.ParseECPrivateKey(data.User.Key)
104
+			if err != nil {
105
+				return err
106
+			}
107
+			data.User.LiveKey = liveKey
108
+		}
109
+	}
110
+	c.data = data
111
+	return nil
112
+}
113
+
114
+func (c *CertificateManager) save() error {
115
+	c.logger.Info("Saving certificate config to ", c.path)
116
+	data, err := json.Marshal(c.data)
117
+	if err != nil {
118
+		return err
119
+	}
120
+	return ioutil.WriteFile(c.path, data, 0600)
121
+}
122
+
123
+func (c *CertificateManager) createUser(email string) error {
124
+	if c.data.User == nil {
125
+		c.logger.Infof("Creating a new private key for ACME use")
126
+		privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
127
+		if err != nil {
128
+			return err
129
+		}
130
+
131
+		marshaled, err := x509.MarshalECPrivateKey(privateKey)
132
+		if err != nil {
133
+			return err
134
+		}
135
+
136
+		c.data.User = &AcmeUser{
137
+			LiveKey: privateKey,
138
+			Key:     marshaled,
139
+			Email:   email,
140
+		}
141
+		return c.save()
142
+	}
143
+	return nil
144
+}
145
+
146
+func (c *CertificateManager) createClient() error {
147
+	config := lego.NewConfig(c.data.User)
148
+
149
+	config.CADirURL = c.acmeProvider
150
+	config.Certificate.KeyType = c.keyType
151
+
152
+	client, err := lego.NewClient(config)
153
+	if err != nil {
154
+		return err
155
+	}
156
+
157
+	provider, err := dns.NewDNSChallengeProviderByName(c.dnsProvider)
158
+	if err != nil {
159
+		return err
160
+	}
161
+
162
+	err = client.Challenge.SetDNS01Provider(provider)
163
+	if err != nil {
164
+		return err
165
+	}
166
+
167
+	c.client = client
168
+	return nil
169
+}
170
+
171
+func (c *CertificateManager) register() error {
172
+	if c.data.User.Registration == nil {
173
+		c.logger.Infof("Registering new user with ACME provider")
174
+		reg, err := c.client.Registration.Register(registration.RegisterOptions{TermsOfServiceAgreed: true})
175
+		if err != nil {
176
+			return err
177
+		}
178
+		c.data.User.Registration = reg
179
+		return c.save()
180
+	}
181
+	return nil
182
+}
183
+
184
+func (c *CertificateManager) GetCertificate(domains []string) (error, *SavedCertificate) {
185
+	existing := c.loadCert(domains)
186
+	if existing != nil {
187
+		c.logger.Debugf("Returning existing certificate for request %s", domains)
188
+		return nil, existing
189
+	}
190
+
191
+	request := certificate.ObtainRequest{
192
+		Domains: domains,
193
+		Bundle:  true,
194
+	}
195
+	cert, err := c.client.Certificate.Obtain(request)
196
+	if err != nil {
197
+		return err, nil
198
+	}
199
+	return c.saveCert(domains, cert)
200
+}
201
+
202
+func (c *CertificateManager) loadCert(domains []string) *SavedCertificate {
203
+	for _, cert := range c.data.Certs {
204
+		if domainsMatch(cert.Domains, domains) {
205
+			return cert
206
+		}
207
+	}
208
+	return nil
209
+}
210
+
211
+func domainsMatch(domains1, domains2 []string) bool {
212
+	if len(domains1) != len(domains2) {
213
+		return false
214
+	}
215
+	if domains1[0] != domains2[0] {
216
+		return false
217
+	}
218
+	sort.Strings(domains1)
219
+	sort.Strings(domains2)
220
+	for i := range domains1 {
221
+		if domains1[i] != domains2[i] {
222
+			return false
223
+		}
224
+	}
225
+
226
+	return true
227
+}
228
+
229
+func (c *CertificateManager) saveCert(domains []string, cert *certificate.Resource) (error, *SavedCertificate) {
230
+	savedCert := &SavedCertificate{
231
+		Domains:           domains,
232
+		Certificate:       cert.Certificate,
233
+		NotAfter:          c.getExpiry(cert),
234
+		PrivateKey:        cert.PrivateKey,
235
+		CertStableURL:     cert.CertStableURL,
236
+		CertURL:           cert.CertURL,
237
+		CSR:               cert.CSR,
238
+		IssuerCertificate: cert.IssuerCertificate,
239
+	}
240
+	c.data.Certs = append(c.data.Certs, savedCert)
241
+	return c.save(), savedCert
242
+}
243
+
244
+func (c *CertificateManager) getExpiry(cert *certificate.Resource) time.Time {
245
+	pem, err := certcrypto.ParsePEMCertificate(cert.Certificate)
246
+	if err != nil {
247
+		c.logger.Fatal(err)
248
+	}
249
+
250
+	return pem.NotAfter
251
+}

Loading…
Cancel
Save