Skip to content

Commit

Permalink
init commit
Browse files Browse the repository at this point in the history
  • Loading branch information
Budylnikov Vladimir committed Dec 3, 2022
0 parents commit 84bc912
Show file tree
Hide file tree
Showing 5 changed files with 165 additions and 0 deletions.
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
.*
*.cer
*.json
*.key
!.gitignore
certs
traefik-certs-exporter
12 changes: 12 additions & 0 deletions Dockerfile
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"]
26 changes: 26 additions & 0 deletions README.md
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
28 changes: 28 additions & 0 deletions input/acme.json
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"
}
]
}
}
92 changes: 92 additions & 0 deletions traefik-certs-exporter.go
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)
}

}
}

0 comments on commit 84bc912

Please sign in to comment.