-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Budylnikov Vladimir
committed
Dec 3, 2022
0 parents
commit 84bc912
Showing
5 changed files
with
165 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
.* | ||
*.cer | ||
*.json | ||
*.key | ||
!.gitignore | ||
certs | ||
traefik-certs-exporter |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
# syntax=docker/dockerfile:1 | ||
## Build | ||
FROM golang:1.19-alpine AS build | ||
WORKDIR /usr/local/go/src/traefik-certs-exporter | ||
COPY *.go ./ | ||
RUN go build traefik-certs-exporter | ||
|
||
## Deploy | ||
FROM busybox | ||
WORKDIR / | ||
COPY --from=build /usr/local/go/src/traefik-certs-exporter/traefik-certs-exporter /traefik-certs-exporter | ||
ENTRYPOINT ["/traefik-certs-exporter"] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
# Traefik certs exporter | ||
|
||
Script opens `acme.json` file from `input` folder and export it's content to `output` folder as `*.cer` and `*.key` files. | ||
|
||
There is template `acme.json` file in `input` directory for demonstration purposes. It is added in `.gitignore` - feel free to modify or delete it. | ||
|
||
## Usage | ||
|
||
Mount your acme.json to /input/ folder and run script | ||
|
||
```bash | ||
go run traefik-certs-exporter.go | ||
``` | ||
|
||
or just use compiled one from Dockerhub | ||
|
||
```bash | ||
docker run -v ${PWD}/input:/input -v ${PWD}/output:/output: docker.io/nett00n/traefik-certs-exporter:1.0.0 | ||
``` | ||
|
||
## Authors | ||
|
||
- Vladimir Budylnikov aka [@nett00n](https://github.com/nett00n) | ||
|
||
--- | ||
2022, Yerevan |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
{ | ||
"le": { | ||
"Account": { | ||
"Email": "[email protected]", | ||
"Registration": { | ||
"body": { | ||
"status": "valid", | ||
"contact": [ | ||
"mailto:[email protected]" | ||
] | ||
}, | ||
"uri": "https://acme-v02.api.letsencrypt.org/acme/acct/123456" | ||
}, | ||
"PrivateKey": "AAABBBCCC", | ||
"KeyType": "4096" | ||
}, | ||
"Certificates": [ | ||
{ | ||
"domain": { | ||
"main": "example.com" | ||
}, | ||
"certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURkekNDQWwrZ0F3SUJBZ0lVVWU2V2NrcXlQbUU3M1E4SGl0d1QzN3Z0R3E4d0RRWUpLb1pJaHZjTkFRRUwKQlFBd1N6RUxNQWtHQTFVRUJoTUNRVlV4RXpBUkJnTlZCQWdNQ2xOdmJXVXRVM1JoZEdVeEVUQVBCZ05WQkFvTQpDRk52YldVZ1RGUkVNUlF3RWdZRFZRUUREQXRsZUdGdGNHeGxMbU52YlRBZUZ3MHlNakV5TURNeE9UUXhOVGRhCkZ3MHlNekV5TURNeE9UUXhOVGRhTUVzeEN6QUpCZ05WQkFZVEFrRlZNUk13RVFZRFZRUUlEQXBUYjIxbExWTjAKWVhSbE1SRXdEd1lEVlFRS0RBaFRiMjFsSUV4VVJERVVNQklHQTFVRUF3d0xaWGhoYlhCc1pTNWpiMjB3Z2dFaQpNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURiT0Z2clBDUE56cDFIKzl3bmdkc1gzTHdoCk5meHovekcyRXhiNW0zS1E2dyt2azNBdEM4RW1VS3FtZU5PdnZvYkRoNmErNHdMdEU3TFdIRThlOUFkK2N1ZHAKTWJlVU9Sckp3RW45ekZXV3pWdmdZaUR5OE9pNWRMM2hpcnZBTzhIQUlRVXFFZkZqWHd6MlhFenVRVDhzaDdwaApQNlZJdFRoV2EzQXFWdlcwaU55U0Y2WDlJbEVCZnVBRHdSR3kvWkVmZDgxeFNsTDBUYjh2aHJ4bmZicmZCWUNQClgyZWFMb0I2cDZKL01mZUtoZkpGT1l2OU80NnBvSTNoVnZVL0lFMnp6UWdkNW1GVGV0ZGErakpuM0I2UVlTSnoKKzc3ZGJRN2M3ckx1cmNhOHo1OU81U2JncTl0WnRab1JPbUhtM1d2clZqRWhoZlgwNUM2WkJld0pLczV6QWdNQgpBQUdqVXpCUk1CMEdBMVVkRGdRV0JCVDNJdGs0WVZLNEZNaEdGSFEyRFJ1VDN1ZUxVekFmQmdOVkhTTUVHREFXCmdCVDNJdGs0WVZLNEZNaEdGSFEyRFJ1VDN1ZUxVekFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFDazRVR0lFckZFVk52NmVXUFNkVFIxM05aT09hbXN5NU02R1NXeGUxSW5BNnVJWjAxMgpiUjg2YnZZS255dWJLUUhuZllQWWdSMFhkSW9idk1FaGE1WnAxQmRxckY1b25odDVDcWlDSWRhenY1VlVPU0FoClBGOHI4MGlTSHpKcDl1bU5BaTFzcTV5QUFCUmtMQ1E0am9Ba3JwRnVidFkxcWJNb2ZrRHVoM2ZuZTJlRXNMcEUKVW1WUTJQakhad1JWZFFXK05tZWxUSThRYTBaWWZOdnZDSk9TaWViY2NVdGlqdStUczVPeCtiZ0F4TmgxUlZpVQpXdEtKMXAvcll4ZzBaL0krNWtFK3pGZzEwVW9JcThqanY0R0xHbTNMbFgxSTNtWmNxek9IamI0b2F2cU83SStaCnVVZlJVSnQ0QWpuM29FaldaSGllQzRjWkViMVMxRndzV0l2dwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t", | ||
"key": "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2Z0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktnd2dnU2tBZ0VBQW9JQkFRRGJPRnZyUENQTnpwMUgKKzl3bmdkc1gzTHdoTmZ4ei96RzJFeGI1bTNLUTZ3K3ZrM0F0QzhFbVVLcW1lTk92dm9iRGg2YSs0d0x0RTdMVwpIRThlOUFkK2N1ZHBNYmVVT1JySndFbjl6RldXelZ2Z1lpRHk4T2k1ZEwzaGlydkFPOEhBSVFVcUVmRmpYd3oyClhFenVRVDhzaDdwaFA2Vkl0VGhXYTNBcVZ2VzBpTnlTRjZYOUlsRUJmdUFEd1JHeS9aRWZkODF4U2xMMFRiOHYKaHJ4bmZicmZCWUNQWDJlYUxvQjZwNkovTWZlS2hmSkZPWXY5TzQ2cG9JM2hWdlUvSUUyenpRZ2Q1bUZUZXRkYQorakpuM0I2UVlTSnorNzdkYlE3YzdyTHVyY2E4ejU5TzVTYmdxOXRadFpvUk9tSG0zV3ZyVmpFaGhmWDA1QzZaCkJld0pLczV6QWdNQkFBRUNnZ0VBZEdBVDgrb0dPOUJ1a0hNMDZVZzNiaENCVXNRZEU5c3FvYlM2b3FHU0RUcXMKSmhJSUgvRzRoTVdZQWkzc2VzU1RPQ1BBTWwvREF1Wk5MdnJ5U2NWVVlSMVFtZmlKczBjcFlHY1RJSWVqL0IxaQpvOWlVRTBRdTE1MFEzRFhRKy9qOUh5aW9YREFRVENkK2N4Nkd2SWlvcDlRWjdseGlPeG54SVhlQm9RaHZBWG9XCmJLdkVuTzRXWkFuZVYzSmRYT0FsdFFxcE5vK0pFTTJJUDZVY05EVzZGWW9JSHJnc2MxcDNSdEhaZWRVQWMrazkKVS9VM0VBbDdFLzBMTURsQmF6WXpOeDRDUTFkbXMrUUFjTFpWMVB3R1gvdWwvTWpiNnFhRTRQM2FxZ2tzc29SYQovb0Y5QkNoRUhGUHg1ZElVOXd5ZVAwaXlHLzZIL2R1ZmlwRFA2b0Zhd1FLQmdRRDZjRFB4SHVrbjVvREJjV0tuCjVnM2l2Z0FKQWNKdFN1bTRIWVNsblM0ZytWdGc4eTNVZ0VXeGRIM3BrVzEwRnFTeDlCZkJ5NG9OaDkrelY4Y2wKTWJFalpJcjFnNFNBMW9RbnJBVllSQkt6cWp0OE84aHB5dE1yVHZUOThyc1did09xNEZ6c0dHTDN1MUw4dTFQVApRRGdhY1RWVjAyRFZGOHBLc2hJTi9XbzRrd0tCZ1FEZ0ZxeVRuSEZscWFicUQ2YnY5aFpKRmdWdzBwRXA4MnkvCktocU1neHovR2FaSTlUUTFKY09kbHVRVzNjQ3JuekZTV2JqdldlNTNhbURNVDlyMUlJdmQxekU2RmEvRGJha2kKciszc2pEYzhod1VQVitMYmpENTlEUDY4TkJJRHZiY0VVNWoxV0d4RCtHUC9EQkYrZWdPTHB1T0xoNWZsQzduRwpNREdiVDlRZW9RS0JnUURLdHJmVW5PaXRXMjh0SmRKdGhWSUlEek9JRnR5Q0N2bFVCdEN3SGFLUkhrWlJHNFlsClZBOFZyTzJlZWhEV3Z0MWhEZXVNK213c3Q2YmpURkh1VVdMSSswRmZxYTAvZkdSTW1IbGJFUDd5WHdEM2RveXEKMVhwSXZBaWk1aTk1NFRKZXhtMXd6ZXlPQ2hzS1o3ZGFiOGo1M2xrRnQ2dlIwUWYxbmwzdTVRbHQ4UUtCZ0duVwpLN0lYL0hMZ21zWUhtSGZUU1psQlBsYVlEUm04TDh0bDdsNFkrdFA5WUUwckNucGptSzFRZSsvVTBrLzhnd1g2Ci9GNkhvaHBpY3M5c2srU2NkNUxTTlJ6UzYwMm8rRzQ2bTJ2U21iQUxzVGNhOGpseFZuNG5haFNubnk2SEp1NXoKTVZZSGFqTDhHUFozMDdkaGwxVVpBSFdCR0J1RTJ6d2d2UDAyeWQraEFvR0JBSjdDWHdCclMxR2dVN1pPZDdxQQpudWtVbVdmakV6N0FSVnh1T1ZqZmpLaHpOWnJXVjJIMmFQSURwUlM5Vkl5T0Zid0Z2TFE1S0JmYzJoUU1ZaEd0Cmx6Tm5yaDFaU1VsVll6K3JLeGtJU3NqN2FHUnk1aEhGa1BhVFoyL202dHowSStGVFIrU1VzMjY3M0JZcmZwY1UKSDFtbkpjS2pJaVZnbDhiM0U0eVNpNlcyCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=", | ||
"Store": "default" | ||
} | ||
] | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
package main | ||
|
||
import ( | ||
"encoding/json" | ||
"encoding/base64" | ||
"io/ioutil" | ||
"os" | ||
"log" | ||
) | ||
|
||
type ACME struct { | ||
Le struct { | ||
Account struct { | ||
Email string | ||
} `json: "Account"` | ||
Certificates []Certificates | ||
} `json: "le"` | ||
} | ||
|
||
type Certificates struct { | ||
Domain struct { | ||
Main string `json: "main"` | ||
}`json: "domain"` | ||
Certificate string `json: "certificate"` | ||
Key string `json: "key"` | ||
} | ||
|
||
func main() { | ||
// open json file | ||
jsonFile, err := os.Open("input/acme.json") | ||
// if os.Open returns an error then print out it | ||
if err != nil { | ||
log.Println(err) | ||
} | ||
log.Println("Successfully Opened acme.json") | ||
// defer the closing of the json file | ||
defer jsonFile.Close() | ||
|
||
// create directory for certs | ||
path := "output" | ||
err = os.MkdirAll(path, os.ModePerm) | ||
if err != nil { | ||
log.Println(err) | ||
} | ||
|
||
byteValue, _ := ioutil.ReadAll(jsonFile) | ||
var traefik ACME | ||
err = json.Unmarshal(byteValue, &traefik) | ||
if err != nil { | ||
panic(err) | ||
} | ||
for i := 0; i < len(traefik.Le.Certificates); i++ { | ||
// print cert hostname | ||
log.Println("Certificate host:", traefik.Le.Certificates[i].Domain.Main) | ||
// decode and print certificate | ||
cert_body, err := base64.StdEncoding.DecodeString(traefik.Le.Certificates[i].Certificate) | ||
if err != nil { | ||
log.Println(err) | ||
} | ||
log.Println("Save certificate body", traefik.Le.Certificates[i].Domain.Main) | ||
// create cert file | ||
cert_file, err := os.Create("output/"+ traefik.Le.Certificates[i].Domain.Main + ".cer") | ||
if err != nil { | ||
log.Println(err) | ||
} | ||
defer cert_file.Close() | ||
|
||
_, err = cert_file.Write(cert_body) | ||
if err != nil { | ||
log.Println(err) | ||
} | ||
|
||
// decode and print key | ||
cert_key, err := base64.StdEncoding.DecodeString(traefik.Le.Certificates[i].Key) | ||
if err != nil { | ||
log.Println(err) | ||
} | ||
log.Println("Save certificate key", traefik.Le.Certificates[i].Domain.Main) | ||
// create cert file | ||
key_file, err := os.Create("output/"+ traefik.Le.Certificates[i].Domain.Main + ".key") | ||
if err != nil { | ||
log.Println(err) | ||
} | ||
defer key_file.Close() | ||
|
||
_, err = key_file.Write(cert_key) | ||
if err != nil { | ||
log.Println(err) | ||
} | ||
|
||
} | ||
} |