From a664bfa17063a473eb04f50e38c1ce5a324c8c00 Mon Sep 17 00:00:00 2001 From: gi8 Date: Fri, 4 Aug 2023 17:57:25 +0200 Subject: [PATCH] init --- .github/renovate.json | 8 + .github/workflows/build.yml | 47 ++ .github/workflows/codeql-analysis.yml | 67 +++ .github/workflows/golangci-lint.yml | 27 + .gitignore | 3 + .goreleaser.yaml | 70 +++ Dockerfile | 23 + LICENSE | 202 +++++++ README.md | 8 + cmd/push.go | 84 +++ cmd/root.go | 95 ++++ cmd/serve.go | 69 +++ deploy/README.md | 15 + deploy/configmap.yaml | 34 ++ deploy/deployment.yaml | 113 ++++ deploy/prometheusrule.yaml | 18 + deploy/secret.yaml | 19 + deploy/servicemonitor.yaml | 15 + .../v1_configmap_jks-broken-certificate.yaml | 6 + .../v1_configmap_jks-chain-certificate.yaml | 162 ++++++ .../v1_configmap_jks-regular-certificate.yaml | 46 ++ .../v1_configmap_p12-broken-certificate.yaml | 7 + .../v1_configmap_p12-chain-certificate.yaml | 101 ++++ ...nfigmap_p12-with-password-certificate.yaml | 55 ++ ...gmap_p12-without-password-certificate.yaml | 55 ++ .../v1_configmap_pem-broken-certificate.yaml | 7 + .../v1_configmap_pem-chain-certificate.yaml | 91 +++ ...nfigmap_pem-with-password-certificate.yaml | 53 ++ ...gmap_pem-without-password-certificate.yaml | 53 ++ go.mod | 43 ++ go.sum | 520 ++++++++++++++++++ hack/jks.sh | 21 + hack/p12.sh | 40 ++ hack/pem.sh | 40 ++ internal/certificates/jks.go | 63 +++ internal/certificates/jks_test.go | 123 +++++ internal/certificates/p12.go | 44 ++ internal/certificates/p12_test.go | 144 +++++ internal/certificates/pem.go | 72 +++ internal/certificates/pem_test.go | 145 +++++ internal/certificates/structs.go | 27 + internal/certificates/utils.go | 53 ++ internal/certificates/utils_test.go | 34 ++ internal/config/parse.go | 106 ++++ internal/config/parse_test.go | 216 ++++++++ internal/config/read.go | 22 + internal/config/read_test.go | 42 ++ internal/config/structs.go | 44 ++ internal/handlers/config.go | 45 ++ internal/handlers/home.go | 20 + internal/handlers/metrics.go | 32 ++ internal/handlers/utils.go | 77 +++ internal/metrics/metrics.go | 35 ++ internal/pushgateway/pushgateway.go | 24 + internal/pushgateway/utils.go | 47 ++ internal/server/server.go | 85 +++ internal/utils/utils.go | 69 +++ internal/utils/utils_test.go | 105 ++++ main.go | 22 + tests/certs/jks/broken_certificate.jks | 1 + tests/certs/jks/certificate_broken.jks | 1 + tests/certs/jks/chain.jks | Bin 0 -> 8155 bytes tests/certs/jks/intermediate.jks | Bin 0 -> 2080 bytes tests/certs/jks/kustomization.yaml | 16 + tests/certs/jks/regular.jks | Bin 0 -> 2065 bytes tests/certs/jks/root.jks | Bin 0 -> 2056 bytes tests/certs/kustomization.yaml | 7 + tests/certs/p12/broken_certificate.p12 | 1 + tests/certs/p12/chain.crt | 57 ++ tests/certs/p12/chain_certificate.p12 | Bin 0 -> 4979 bytes tests/certs/p12/chain_private_key.key | 28 + .../p12/chain_self_signed_certificate.crt | 19 + tests/certs/p12/intermediate_certificate.p12 | Bin 0 -> 2531 bytes tests/certs/p12/intermediate_private_key.key | 28 + .../intermediate_self_signed_certificate.crt | 19 + tests/certs/p12/kustomization.yaml | 19 + tests/certs/p12/root_certificate.p12 | Bin 0 -> 2515 bytes tests/certs/p12/root_private_key.key | 28 + .../p12/root_self_signed_certificate.crt | 19 + tests/certs/p12/with_password_certificate.p12 | Bin 0 -> 2531 bytes tests/certs/p12/with_password_private_key.key | 28 + .../with_password_self_signed_certificate.crt | 19 + .../p12/without_password_certificate.p12 | Bin 0 -> 2547 bytes .../p12/without_password_private_key.key | 28 + ...thout_password_self_signed_certificate.crt | 19 + tests/certs/pem/broken_certificate.pem | 1 + tests/certs/pem/chain.crt | 57 ++ tests/certs/pem/chain_certificate.pem | 85 +++ tests/certs/pem/chain_private_key.key | 28 + tests/certs/pem/chain_private_key.pem | 28 + .../pem/chain_self_signed_certificate.crt | 19 + tests/certs/pem/intermediate_certificate.pem | 47 ++ tests/certs/pem/intermediate_private_key.key | 28 + tests/certs/pem/intermediate_private_key.pem | 28 + .../intermediate_self_signed_certificate.crt | 19 + tests/certs/pem/kustomization.yaml | 19 + tests/certs/pem/root_certificate.pem | 47 ++ tests/certs/pem/root_private_key.key | 28 + tests/certs/pem/root_private_key.pem | 28 + .../pem/root_self_signed_certificate.crt | 19 + tests/certs/pem/with_password_certificate.pem | 47 ++ tests/certs/pem/with_password_private_key.key | 28 + tests/certs/pem/with_password_private_key.pem | 28 + .../with_password_self_signed_certificate.crt | 19 + .../pem/without_password_certificate.pem | 47 ++ .../pem/without_password_private_key.key | 28 + ...thout_password_self_signed_certificate.crt | 19 + 107 files changed, 4947 insertions(+) create mode 100644 .github/renovate.json create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/codeql-analysis.yml create mode 100644 .github/workflows/golangci-lint.yml create mode 100644 .gitignore create mode 100644 .goreleaser.yaml create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 README.md create mode 100644 cmd/push.go create mode 100644 cmd/root.go create mode 100644 cmd/serve.go create mode 100644 deploy/README.md create mode 100644 deploy/configmap.yaml create mode 100644 deploy/deployment.yaml create mode 100644 deploy/prometheusrule.yaml create mode 100644 deploy/secret.yaml create mode 100644 deploy/servicemonitor.yaml create mode 100644 deploy/v1_configmap_jks-broken-certificate.yaml create mode 100644 deploy/v1_configmap_jks-chain-certificate.yaml create mode 100644 deploy/v1_configmap_jks-regular-certificate.yaml create mode 100644 deploy/v1_configmap_p12-broken-certificate.yaml create mode 100644 deploy/v1_configmap_p12-chain-certificate.yaml create mode 100644 deploy/v1_configmap_p12-with-password-certificate.yaml create mode 100644 deploy/v1_configmap_p12-without-password-certificate.yaml create mode 100644 deploy/v1_configmap_pem-broken-certificate.yaml create mode 100644 deploy/v1_configmap_pem-chain-certificate.yaml create mode 100644 deploy/v1_configmap_pem-with-password-certificate.yaml create mode 100644 deploy/v1_configmap_pem-without-password-certificate.yaml create mode 100644 go.mod create mode 100644 go.sum create mode 100644 hack/jks.sh create mode 100644 hack/p12.sh create mode 100644 hack/pem.sh create mode 100644 internal/certificates/jks.go create mode 100644 internal/certificates/jks_test.go create mode 100644 internal/certificates/p12.go create mode 100644 internal/certificates/p12_test.go create mode 100644 internal/certificates/pem.go create mode 100644 internal/certificates/pem_test.go create mode 100644 internal/certificates/structs.go create mode 100644 internal/certificates/utils.go create mode 100644 internal/certificates/utils_test.go create mode 100644 internal/config/parse.go create mode 100644 internal/config/parse_test.go create mode 100644 internal/config/read.go create mode 100644 internal/config/read_test.go create mode 100644 internal/config/structs.go create mode 100644 internal/handlers/config.go create mode 100644 internal/handlers/home.go create mode 100644 internal/handlers/metrics.go create mode 100644 internal/handlers/utils.go create mode 100644 internal/metrics/metrics.go create mode 100644 internal/pushgateway/pushgateway.go create mode 100644 internal/pushgateway/utils.go create mode 100644 internal/server/server.go create mode 100644 internal/utils/utils.go create mode 100644 internal/utils/utils_test.go create mode 100644 main.go create mode 100644 tests/certs/jks/broken_certificate.jks create mode 100644 tests/certs/jks/certificate_broken.jks create mode 100644 tests/certs/jks/chain.jks create mode 100644 tests/certs/jks/intermediate.jks create mode 100644 tests/certs/jks/kustomization.yaml create mode 100644 tests/certs/jks/regular.jks create mode 100644 tests/certs/jks/root.jks create mode 100644 tests/certs/kustomization.yaml create mode 100644 tests/certs/p12/broken_certificate.p12 create mode 100644 tests/certs/p12/chain.crt create mode 100644 tests/certs/p12/chain_certificate.p12 create mode 100644 tests/certs/p12/chain_private_key.key create mode 100644 tests/certs/p12/chain_self_signed_certificate.crt create mode 100644 tests/certs/p12/intermediate_certificate.p12 create mode 100644 tests/certs/p12/intermediate_private_key.key create mode 100644 tests/certs/p12/intermediate_self_signed_certificate.crt create mode 100644 tests/certs/p12/kustomization.yaml create mode 100644 tests/certs/p12/root_certificate.p12 create mode 100644 tests/certs/p12/root_private_key.key create mode 100644 tests/certs/p12/root_self_signed_certificate.crt create mode 100644 tests/certs/p12/with_password_certificate.p12 create mode 100644 tests/certs/p12/with_password_private_key.key create mode 100644 tests/certs/p12/with_password_self_signed_certificate.crt create mode 100644 tests/certs/p12/without_password_certificate.p12 create mode 100644 tests/certs/p12/without_password_private_key.key create mode 100644 tests/certs/p12/without_password_self_signed_certificate.crt create mode 100644 tests/certs/pem/broken_certificate.pem create mode 100644 tests/certs/pem/chain.crt create mode 100644 tests/certs/pem/chain_certificate.pem create mode 100644 tests/certs/pem/chain_private_key.key create mode 100644 tests/certs/pem/chain_private_key.pem create mode 100644 tests/certs/pem/chain_self_signed_certificate.crt create mode 100644 tests/certs/pem/intermediate_certificate.pem create mode 100644 tests/certs/pem/intermediate_private_key.key create mode 100644 tests/certs/pem/intermediate_private_key.pem create mode 100644 tests/certs/pem/intermediate_self_signed_certificate.crt create mode 100644 tests/certs/pem/kustomization.yaml create mode 100644 tests/certs/pem/root_certificate.pem create mode 100644 tests/certs/pem/root_private_key.key create mode 100644 tests/certs/pem/root_private_key.pem create mode 100644 tests/certs/pem/root_self_signed_certificate.crt create mode 100644 tests/certs/pem/with_password_certificate.pem create mode 100644 tests/certs/pem/with_password_private_key.key create mode 100644 tests/certs/pem/with_password_private_key.pem create mode 100644 tests/certs/pem/with_password_self_signed_certificate.crt create mode 100644 tests/certs/pem/without_password_certificate.pem create mode 100644 tests/certs/pem/without_password_private_key.key create mode 100644 tests/certs/pem/without_password_self_signed_certificate.crt diff --git a/.github/renovate.json b/.github/renovate.json new file mode 100644 index 0000000..b0d1572 --- /dev/null +++ b/.github/renovate.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "config:base" + ], + "labels": ["dependencies"], + "postUpdateOptions": ["gomodTidy"] +} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..8e53341 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,47 @@ +--- +name: build + +on: + push: + tags: + - 'v*' + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 3 + - name: Determine Go version from go.mod + run: echo "GO_VERSION=$(grep "go 1." go.mod | cut -d " " -f 2)" >> $GITHUB_ENV + - name: Set up Go + uses: actions/setup-go@v4 + with: + go-version: ${{ env.GO_VERSION }} + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - name: Cache Go modules + uses: actions/cache@v3 + with: + path: ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + restore-keys: | + ${{ runner.os }}-go- + - name: Log in to GitHub Container registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Run GoReleaser + uses: goreleaser/goreleaser-action@v4 + if: success() && startsWith(github.ref, 'refs/tags/') + with: + version: latest + args: release --rm-dist + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 0000000..6ecd154 --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,67 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ master ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ master ] + schedule: + - cron: '22 20 * * 5' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + language: [ 'go' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] + # Learn more: + # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v2 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl + + # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + #- run: | + # make bootstrap + # make release + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml new file mode 100644 index 0000000..1c153f8 --- /dev/null +++ b/.github/workflows/golangci-lint.yml @@ -0,0 +1,27 @@ +--- +name: golangci-lint +on: + push: + tags: + - v* + branches: + - master + pull_request: +permissions: + contents: read +jobs: + golangci: + name: lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Determine Go version from go.mod + run: echo "GO_VERSION=$(grep "go 1." go.mod | cut -d " " -f 2)" >> $GITHUB_ENV + - name: Set up Go + uses: actions/setup-go@v4 + with: + go-version: ${{ env.GO_VERSION }} + - name: golangci-lint + uses: golangci/golangci-lint-action@v3 + with: + args: --issues-exit-code=0 --timeout=3m ./... diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4b17f84 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +__debug_bin +.vscode/ +config.yaml diff --git a/.goreleaser.yaml b/.goreleaser.yaml new file mode 100644 index 0000000..35d9ba2 --- /dev/null +++ b/.goreleaser.yaml @@ -0,0 +1,70 @@ +--- +project_name: certalert +before: + hooks: + - go mod tidy +builds: + - main: ./main.go + env: + - CGO_ENABLED=0 + goos: + - linux + - darwin + goarch: + - amd64 + - arm64 + - arm +dockers: + - image_templates: + - ghcr.io/containeroo/certalert:{{ .Tag }}-amd64 + use: buildx + dockerfile: Dockerfile + extra_files: + - go.mod + - go.sum + - main.go + - cmd + - internal + - web + build_flag_templates: + - --pull + - --platform=linux/amd64 + - --label=org.opencontainers.image.title={{ .ProjectName }} + - --label=org.opencontainers.image.description={{ .ProjectName }} + - --label=org.opencontainers.image.url=https://github.com/containeroo/certalert + - --label=org.opencontainers.image.source=https://github.com/containeroo/certalert + - --label=org.opencontainers.image.version={{ .Version }} + - --label=org.opencontainers.image.created={{ time "2006-01-02T15:04:05Z07:00" }} + - --label=org.opencontainers.image.revision={{ .FullCommit }} + - --label=org.opencontainers.image.licenses="GNU General Public License v3.0" + - image_templates: + - ghcr.io/containeroo/certalert:{{ .Tag }}-arm64 + use: buildx + dockerfile: Dockerfile + extra_files: + - go.mod + - go.sum + - main.go + - cmd + - internal + goarch: arm64 + build_flag_templates: + - --pull + - --platform=linux/arm64 + - --label=org.opencontainers.image.title={{ .ProjectName }} + - --label=org.opencontainers.image.description={{ .ProjectName }} + - --label=org.opencontainers.image.url=https://github.com/containeroo/certalert + - --label=org.opencontainers.image.source=https://github.com/containeroo/certalert + - --label=org.opencontainers.image.version={{ .Version }} + - --label=org.opencontainers.image.created={{ time "2006-01-02T15:04:05Z07:00" }} + - --label=org.opencontainers.image.revision={{ .FullCommit }} + - --label=org.opencontainers.image.licenses="GNU General Public License v3.0" +docker_manifests: + - name_template: ghcr.io/containeroo/certalert:{{ .Tag }} + image_templates: + - ghcr.io/containeroo/certalert:{{ .Tag }}-amd64 + - ghcr.io/containeroo/certalert:{{ .Tag }}-arm64 + - name_template: ghcr.io/containeroo/certalert:latest + image_templates: + - ghcr.io/containeroo/certalert:{{ .Tag }}-amd64 + - ghcr.io/containeroo/certalert:{{ .Tag }}-arm64 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f9d244d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,23 @@ +FROM golang:1.20-alpine as builder + +WORKDIR /workspace +# Copy the Go Modules manifests +COPY go.mod go.sum ./ +# cache deps before building and copying source so that we don't need to re-download as much +# and so that source changes don't invalidate our downloaded layer +RUN go mod download + +# Copy the go source +COPY . . + +# Build +RUN CGO_ENABLED=0 GO111MODULE=on go build -a -installsuffix nocgo -o /certalert + +FROM gcr.io/distroless/static:nonroot + +WORKDIR / + +COPY --from=builder /certalert ./ +USER 65532:65532 + +ENTRYPOINT ["./certalert"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..1c803d5 --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# CertAlert + +CertAlert can handle a variety of certificate types, including .p12, .pkcs12, .pem, .crt, and .jks files. + +You can execute specific commands for different actions: + +- Use the `push` command to manually push metrics to the Prometheus Pushgateway. +- Use the `serve` command to start a server that provides a `/metrics` endpoint for Prometheus to scrape. diff --git a/cmd/push.go b/cmd/push.go new file mode 100644 index 0000000..6230df1 --- /dev/null +++ b/cmd/push.go @@ -0,0 +1,84 @@ +/* +Copyright © 2023 gi8lino gi8©containeroo.ch + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package cmd + +import ( + "certalert/internal/certificates" + "certalert/internal/config" + "certalert/internal/pushgateway" + "fmt" + "log" + "os" + + "github.com/spf13/cobra" +) + +var all bool + +// pushCmd represents the push command +var pushCmd = &cobra.Command{ + Use: "push", + Short: "Push certificate expiration as a epoch to a Prometheus Pushgateway instance", + Long: `Push is a command that allows you to push the expiration as an epoch about certificates to a Prometheus Pushgateway instance. + +The command can either push metadata for all certificates by using the --all flag or it can push metadata for specific certificates by specifying their names as command-line arguments. + +If no arguments are provided and the --all flag is not set, the command will print a help message and exit. + +Examples: + # Push metadata for all certificates + certalert push --all + + # Push metadata for a single certificate + certalert push my-certificate-name + + # Push metadata for multiple certificates + certalert push my-certificate-name another-certificate-name +`, + + Run: func(cmd *cobra.Command, args []string) { + if all { + // Handle --all flag + if err := pushgateway.Send(config.App.Pushgateway.Address, config.App.Pushgateway.Job, config.App.Pushgateway.Auth, config.App.Certs); err != nil { + log.Panic(err) + } + return + } + + // Handle arguments + if len(args) < 1 { + fmt.Println("Please provide at least one argument or use the --all flag") + cmd.Help() + os.Exit(1) + } + + for _, arg := range args { + certificate, err := certificates.GetCertificateByName(arg, config.App.Certs) + if err != nil { + log.Panic(err) + } + if err := pushgateway.Send(config.App.Pushgateway.Address, config.App.Pushgateway.Job, config.App.Pushgateway.Auth, []certificates.Certificate{*certificate}); err != nil { + log.Panic(err) + } + } + }, +} + +func init() { + rootCmd.AddCommand(pushCmd) + + pushCmd.PersistentFlags().BoolVarP(&all, "all", "A", false, "Push all certificates") +} diff --git a/cmd/root.go b/cmd/root.go new file mode 100644 index 0000000..caa6e23 --- /dev/null +++ b/cmd/root.go @@ -0,0 +1,95 @@ +/* +Copyright © 2023 gi8lino gi8©containeroo.ch + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package cmd + +import ( + "certalert/internal/config" + "os" + + log "github.com/sirupsen/logrus" + "github.com/spf13/cobra" + + "github.com/spf13/viper" +) + +var cfgFile string +var verbose, silent bool + +// rootCmd represents the base command when called without any subcommands +var rootCmd = &cobra.Command{ + Use: "certalert", + Short: "CertAlert is a tool to monitor the expiration dates of digital certificates", + Long: `CertAlert can handle a variety of certificate types, including .p12, .pkcs12, .pem, .crt, and .jks files. + + You can execute specific commands for different actions: + 1. Use the 'push' command to manually push metrics to the Prometheus Pushgateway. + 2. Use the 'serve' command to start a server that provides a '/metrics' endpoint for Prometheus to scrape. + + For a full list of commands and options, use 'certalert --help'. + `, PersistentPreRun: func(cmd *cobra.Command, args []string) { + if verbose { + log.SetLevel(log.DebugLevel) + log.Debugf("Verbose output enabled") + } else if silent { + log.SetLevel(log.ErrorLevel) + log.Debugf("Silent output enabled") + } + + if err := config.ParseConfig(&config.App); err != nil { + log.Fatalf("Error parsing config file: %v", err) + } + }, +} + +// Execute adds all child commands to the root command and sets flags appropriately. +// This is called by main.main(). It only needs to happen once to the rootCmd. +func Execute() { + cobra.CheckErr(rootCmd.Execute()) +} + +func init() { + cobra.OnInitialize(initConfig) + + rootCmd.PersistentFlags().StringVarP(&cfgFile, "config", "c", "", "config file (default is $HOME/.certalert.yaml)") + + rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "verbose output") + rootCmd.PersistentFlags().BoolVarP(&silent, "silent", "s", false, "silent output") + rootCmd.MarkFlagsMutuallyExclusive("verbose", "silent") +} + +// initConfig reads in config file and ENV variables if set. +func initConfig() { + if cfgFile != "" { + // Use config file from the flag. + viper.SetConfigFile(cfgFile) + } else { + // Find home directory. + home, err := os.UserHomeDir() + cobra.CheckErr(err) + + // Search config in home directory with name ".certalert" (without extension). + viper.AddConfigPath(home) + viper.SetConfigType("yaml") + viper.SetConfigName(".certalert") + } + + viper.AutomaticEnv() // read in environment variables that match + + err := config.ReadConfigFile(viper.GetViper().ConfigFileUsed(), &config.App) + if err != nil { + log.Fatalf("Error reading config file: %v", err) + } +} diff --git a/cmd/serve.go b/cmd/serve.go new file mode 100644 index 0000000..f3c47e7 --- /dev/null +++ b/cmd/serve.go @@ -0,0 +1,69 @@ +/* +Copyright © 2023 gi8lino gi8©containeroo.ch + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package cmd + +import ( + "certalert/internal/config" + "certalert/internal/server" + + "github.com/fsnotify/fsnotify" + log "github.com/sirupsen/logrus" + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +// serveCmd represents the serve command +var serveCmd = &cobra.Command{ + Use: "serve", + Short: "Launch the web server to expose certificate metrics", + Long: `The 'serve' command starts a web server that exposes certificate metrics. These metrics +are accessible at '/metrics' endpoint. + +The web server's hostname and port can be defined using the --hostname and --port flags respectively. +The default hostname is 'localhost' and the default port is '8080'. + +Example: + certalert serve --hostname localhost --port 8080 + +The serve command also watches for changes in the application configuration file and reloads +the configuration if changes are detected. +`, + Run: func(cmd *cobra.Command, args []string) { + + // Watch for config changes + viper.OnConfigChange(func(e fsnotify.Event) { + log.Infof("Config file changed: %s", e.Name) + + if err := viper.ReadInConfig(); err != nil { + log.Fatalf("Unable to read config: %s", err) + } + + if err := config.ParseConfig(&config.App); err != nil { + log.Fatalf("Unable to parse config: %s", err) + } + }) + viper.WatchConfig() + + server.RunServer(config.App.Server.Hostname, config.App.Server.Port) + }, +} + +func init() { + rootCmd.AddCommand(serveCmd) + + serveCmd.Flags().StringVarP(&config.App.Server.Hostname, "hostname", "H", "localhost", "Hostname to listen on") + serveCmd.Flags().IntVarP(&config.App.Server.Port, "port", "p", 8080, "Port to listen on") +} diff --git a/deploy/README.md b/deploy/README.md new file mode 100644 index 0000000..09b10e4 --- /dev/null +++ b/deploy/README.md @@ -0,0 +1,15 @@ +# Manifests + +## Certificates + +To create new certificates you one of the following scripts: + +- `hack/pem.sh` +- `hack/p12.sh` +- `hack/jks.sh` + +You need `openssl` and `keytool` installed. + +## ConfigMaps + +`ConfigMaps` with certificates can be created with kustomize: `kustomize build tests/certs -o deploy` diff --git a/deploy/configmap.yaml b/deploy/configmap.yaml new file mode 100644 index 0000000..392b415 --- /dev/null +++ b/deploy/configmap.yaml @@ -0,0 +1,34 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: certalert-config +data: + config.yaml: | + --- + pushgateway: + address: http://pushgateway.monitoring.svc.cluster.local:9091 + job: certalert + certs: + - name: PEM - with_password + path: /certs/pem/with_password_certificate.pem + password: env:PEM_PASSWORD + - name: PEM - without_password + path: /certs/pem/without_password_certificate.pem + - name: PEM - chain + path: /certs/pem/chain_certificate.pem + password: file:/certs/pem/chain_certificate.password + - name: P12 - with_password + path: /certs/p12/with_password_certificate.p12 + password: env:P12_PASSWORD + - name: P12 - without_password + path: /certs/p12/without_password_certificate.p12 + - name: P12 - chain + path: /certs/p12/chain_certificate.p12 + password: file:/certs/certalert.passwords:{p12_password} + - name: jks - regular + path: /certs/jks/regular.jks + password: env:JKS_PASSWORD + - name: jks - chain + path: /certs/jks/chain.jks + password: file:/certs/certalert.passwords:{jks_password} diff --git a/deploy/deployment.yaml b/deploy/deployment.yaml new file mode 100644 index 0000000..b45c168 --- /dev/null +++ b/deploy/deployment.yaml @@ -0,0 +1,113 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: certalert +spec: + selector: + matchLabels: + app: certalert + template: + metadata: + labels: + app: certalert + spec: + #initContainers: + # - name: extract-cert + # image: openjdk:openjdk/22-ea-jdk-slim-bullseye + # command: ["/bin/sh", "-c"] + # envFrom: + # - secretRef: + # name: certalert-certificate-credentials + # args: ["keytool -exportcert -keystore /certs/keystore -alias cert_alias -storepass $CERT_PASS -file /certs/my-cert.cer"] + # volumeMounts: + # - name: transfer + # mountPath: /certs + containers: + - name: certalert + image: ghcr.io/containeroo/certalert:latest + resources: {} + ports: + - name: http + containerPort: 8080 + args: + - --config=/config/certalert-config.yaml + envFrom: + - secretRef: + name: certalert-password-envs + volumeMounts: + - name: config + mountPath: /config + - name: transfer + mountPath: /transfer + - name: certalert-password-file + mountPath: /certs/secrets + - name: jks-broken-certificate + mountPath: /certs/jks/broken_certificate.jks + subPath: broken_certificate.jks + - name: jks-regular-certificate + mountPath: /certs/jks/regular_certificate.jks + subPath: regular_certificate.jks + - name: jks-chain-certificate + mountPath: /certs/jks/chain_certificate.jks + subPath: chain_certificate.jks + - name: p12-with-password-certificate + mountPath: /certs/p12/with_password_certificate.p12 + subPath: with_password_certificate.p12 + - name: p12-without-password-certificate + mountPath: /certs/p12/without_password_certificate.p12 + subPath: without_password_certificate.p12 + - name: p12-chain-certificate + mountPath: /certs/p12/chain_certificate.p12 + subPath: chain_certificate.p12 + - name: pem-broken-certificate + mountPath: /certs/pem/broken_certificate.pem + subPath: broken_certificate.pem + - name: pem-with-password-certificate + mountPath: /certs/pem/with_password_certificate.pem + subPath: with_password_certificate.pem + - name: pem-without-password-certificate + mountPath: /certs/pem/without_password_certificate.pem + subPath: without_password_certificate.pem + - name: pem-chain-certificate + mountPath: /certs/pem/chain_certificate.pem + subPath: chain_certificate.pem + volumes: + - name: config + configMap: + name: certalert-config + - name: transfer + emptyDir: {} + - name: certalert-password-file + secret: + secretName: certalert-password-file + - name: jks-broken-certificate + configMap: + name: jks-broken-certificate + - name: jks-regular-certificate + configMap: + name: jks-regular-certificate + - name: jks-chain-certificate + configMap: + name: jks-chain-certificate + - name: p12-with-password-certificate + configMap: + name: p12-with-password-certificate + - name: p12-without-password-certificate + configMap: + name: p12-without-password-certificate + - name: p12-chain-certificate + configMap: + name: p12-chain-certificate + - name: pem-broken-certificate + configMap: + name: pem-broken-certificate + - name: pem-with-password-certificate + configMap: + name: pem-with-password-certificate + - name: pem-without-password-certificate + configMap: + name: pem-without-password-certificate + - name: pem-chain-certificate + configMap: + name: pem-chain-certificate diff --git a/deploy/prometheusrule.yaml b/deploy/prometheusrule.yaml new file mode 100644 index 0000000..5cfd725 --- /dev/null +++ b/deploy/prometheusrule.yaml @@ -0,0 +1,18 @@ +apiVersion: monitoring.coreos.com/v1 +kind: PrometheusRule +metadata: + name: certalert +spec: + groups: + - name: certalert + rules: + - alert: CertificateExpiringSoon + annotations: + description: + Certificate will expire in {{ $value | humanizeDuration }} + (instance {{ $labels.instance }}) + summary: SSL certificate «{{ $labels.instance }}» expires soon + expr: certalert_certificate_epoch_seconds - time() < 86400 * 29 + for: 5m + labels: + severity: warning diff --git a/deploy/secret.yaml b/deploy/secret.yaml new file mode 100644 index 0000000..600e543 --- /dev/null +++ b/deploy/secret.yaml @@ -0,0 +1,19 @@ +--- +apiVersion: v1 +kind: Secret +metadata: + name: certalert-password-envs +type: Opaque +stringData: + P12_PASSWORD: password +--- +apiVersion: v1 +kind: Secret +metadata: + name: certalert-password-file +type: Opaque +stringData: + certalert.passwords: | + jks_password = changeit + PEM_PASSWORD = password + another_password = diff --git a/deploy/servicemonitor.yaml b/deploy/servicemonitor.yaml new file mode 100644 index 0000000..4e01c66 --- /dev/null +++ b/deploy/servicemonitor.yaml @@ -0,0 +1,15 @@ +--- +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: certalert + labels: + app: certalert +spec: + selector: + matchLabels: + app: certalert + endpoints: + - port: http + path: /metrics + interval: 60m diff --git a/deploy/v1_configmap_jks-broken-certificate.yaml b/deploy/v1_configmap_jks-broken-certificate.yaml new file mode 100644 index 0000000..647569e --- /dev/null +++ b/deploy/v1_configmap_jks-broken-certificate.yaml @@ -0,0 +1,6 @@ +apiVersion: v1 +data: + broken_certificate.jks: broken +kind: ConfigMap +metadata: + name: jks-broken-certificate diff --git a/deploy/v1_configmap_jks-chain-certificate.yaml b/deploy/v1_configmap_jks-chain-certificate.yaml new file mode 100644 index 0000000..3951359 --- /dev/null +++ b/deploy/v1_configmap_jks-chain-certificate.yaml @@ -0,0 +1,162 @@ +apiVersion: v1 +binaryData: + chain.jks: | + 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 + olG6hwC1WvmUxcq0ToQK6Xag== +kind: ConfigMap +metadata: + name: jks-chain-certificate diff --git a/deploy/v1_configmap_jks-regular-certificate.yaml b/deploy/v1_configmap_jks-regular-certificate.yaml new file mode 100644 index 0000000..6af192d --- /dev/null +++ b/deploy/v1_configmap_jks-regular-certificate.yaml @@ -0,0 +1,46 @@ +apiVersion: v1 +binaryData: + regular.jks: | + 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 + RboMtbvbLr/d1kDn6PJdtZug== +kind: ConfigMap +metadata: + name: jks-regular-certificate diff --git a/deploy/v1_configmap_p12-broken-certificate.yaml b/deploy/v1_configmap_p12-broken-certificate.yaml new file mode 100644 index 0000000..1fbc33f --- /dev/null +++ b/deploy/v1_configmap_p12-broken-certificate.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +data: + broken_certificate.p12: | + broken +kind: ConfigMap +metadata: + name: p12-broken-certificate diff --git a/deploy/v1_configmap_p12-chain-certificate.yaml b/deploy/v1_configmap_p12-chain-certificate.yaml new file mode 100644 index 0000000..7631df6 --- /dev/null +++ b/deploy/v1_configmap_p12-chain-certificate.yaml @@ -0,0 +1,101 @@ +apiVersion: v1 +binaryData: + chain_certificate.p12: | + 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 +kind: ConfigMap +metadata: + name: p12-chain-certificate diff --git a/deploy/v1_configmap_p12-with-password-certificate.yaml b/deploy/v1_configmap_p12-with-password-certificate.yaml new file mode 100644 index 0000000..4e27e9e --- /dev/null +++ b/deploy/v1_configmap_p12-with-password-certificate.yaml @@ -0,0 +1,55 @@ +apiVersion: v1 +binaryData: + with_password_certificate.p12: | + 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 + b3cIljvUKgICCAA= +kind: ConfigMap +metadata: + name: p12-with-password-certificate diff --git a/deploy/v1_configmap_p12-without-password-certificate.yaml b/deploy/v1_configmap_p12-without-password-certificate.yaml new file mode 100644 index 0000000..fafd0b4 --- /dev/null +++ b/deploy/v1_configmap_p12-without-password-certificate.yaml @@ -0,0 +1,55 @@ +apiVersion: v1 +binaryData: + with_password_certificate.p12: | + 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 + b3cIljvUKgICCAA= +kind: ConfigMap +metadata: + name: p12-without-password-certificate diff --git a/deploy/v1_configmap_pem-broken-certificate.yaml b/deploy/v1_configmap_pem-broken-certificate.yaml new file mode 100644 index 0000000..a81bf45 --- /dev/null +++ b/deploy/v1_configmap_pem-broken-certificate.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +data: + broken_certificate.pem: | + broken +kind: ConfigMap +metadata: + name: pem-broken-certificate diff --git a/deploy/v1_configmap_pem-chain-certificate.yaml b/deploy/v1_configmap_pem-chain-certificate.yaml new file mode 100644 index 0000000..51f6e31 --- /dev/null +++ b/deploy/v1_configmap_pem-chain-certificate.yaml @@ -0,0 +1,91 @@ +apiVersion: v1 +data: + chain_certificate.pem: | + -----BEGIN PRIVATE KEY----- + MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCuO3+1qPtVJIcH + zBqiUnROAl8+2E5kEpzJOHihheb/PJpIpG/frd7uuZ4LJgDKE7dBQX1guJhUa7OQ + VsQFTb6QbssDndnPRSkBtupigLtYy42gnrWhMqjalEHiVbf+qunksJ6KP6laPJtd + xLHT6rS4mvXaemsPXpagGSTURk/0q9LQDF+1O8wsNyOcQ3sXod22rc8u4hzMVBrV + Co260r/UZFYjmJZuuTbE0UZ8Tm6sS9oFxa6oC0+JGCh+LbTcLB9ckEV9ipaKZ/Du + wg+nvyvSGAWcIE78UqpO27ACyGnmvTVlP0cEO0JSVM6GSzMNZagTnAYqRLWQD6g+ + noME8w/RAgMBAAECggEAAwPTb5s+SKSUe9h+wj3xJmes+mFbt2h5SzPZhgmDNBna + TV0flLg9dCX0/7pDT5vgWx4pD1E4bRcNRRdURmd4T4dkRtJuokMfDNkbhJN30nc4 + wt2WNOUzle80deg/8iWm3RrHjorAGWg0s85fWaR9RrfDPvno8/vR+VCgEhaKpAgk + /5t5YTQEu299OETnDaZs6VwP5VHHqA1o9FhgFwnGECHLkXsrK4X5ORmFyXHlTMaD + wi6NL5Lt4Go4ZyTlEh27qHA368YI38Tno+iR2+P3Kecz2qSCAjf+a+mjEWglO1lu + 5aLby786b4JlaUXfZCHLMVK36A7a8TOcXh9oEo/ogQKBgQD0G+ODAS1pczd2X2yD + dp9oF00oLWN2JyEd9YE9DUG+v473ONG4RLBQs5zNXqn43KwO5mtrKyKURW2yxFCu + c5+UwYM3WEd7ISU69+2EP5SZuW1pnFIZ557MF63CCQ76O81IXWIgdjdnFXYBj+V2 + IhC4sQuze7+CNM6F5j5RvnXRUQKBgQC2uDqkUE2pvdD01jbueYZGqU1EFtRdr3gl + fZc9pqREjkUNI0x4V3XNtqEB+euuck9EptLZ6dRbFD066OeZq9ITvp5Od+RVrnh/ + vqiw8dXEFZ732k7QrOteIX7VHtL0nSwdJ0vnc5WSIUUFYwaYVa7KMli9ZJpVz5Ts + ZdRyAzW2gQKBgQCEcOEmQaxGyykrQyiXxvNDwWiuRLny79Xq8DlXS2sBN+M0RJKc + XEAg+OI5FoQ3rlp3lxJuya9wLJ8Q36w6iibpyXgMvgvCRUBy1vL5zpksMkunghWV + UnJ4ntw6KzoCEBIXkfrcS+dROXaV8GF5j4/s9Lm5folv9oCaa0oihahckQKBgCQ9 + KbRJEP4nXXgRvFdT1uPQ1Dg65uel04hr/kEF+fJ23Q8b/yCnCABCxnAj5zB0D3Co + PY1mqO1feD1kz/pUb5fm6HLbqHet4MxFPiPJ8wGu4BZ8P8F3aj8DGaqfMGu/eG5X + yuAetn2DB7NnznkMFVyY26zEdS+rufegwp/SLycBAoGBAK1fD9Euk77nL/13/D8p + nwpt18Sq9LjnW0UHQBqMiqeherHl4sYCCvVaZigJ6I+dgYN1IWIOchLTi/7vzTld + EYt+RfYaChfa9USvk5Uh/wgWkSi+52RhdqXN50WNlVuqJgi8oqFVjwmleiMi7mdt + lkCzPprwq8GFbyVMx2EzBhy7 + -----END PRIVATE KEY----- + -----BEGIN CERTIFICATE----- + MIIDATCCAemgAwIBAgIUTM3cVRyiy8mcEPxrdQcKBcT1VPEwDQYJKoZIhvcNAQEL + BQAwEDEOMAwGA1UEAwwFY2hhaW4wHhcNMjMwODA0MTI1MDIyWhcNMjQwODAzMTI1 + MDIyWjAQMQ4wDAYDVQQDDAVjaGFpbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC + AQoCggEBAK47f7Wo+1UkhwfMGqJSdE4CXz7YTmQSnMk4eKGF5v88mkikb9+t3u65 + ngsmAMoTt0FBfWC4mFRrs5BWxAVNvpBuywOd2c9FKQG26mKAu1jLjaCetaEyqNqU + QeJVt/6q6eSwnoo/qVo8m13EsdPqtLia9dp6aw9elqAZJNRGT/Sr0tAMX7U7zCw3 + I5xDexeh3batzy7iHMxUGtUKjbrSv9RkViOYlm65NsTRRnxObqxL2gXFrqgLT4kY + KH4ttNwsH1yQRX2Klopn8O7CD6e/K9IYBZwgTvxSqk7bsALIaea9NWU/RwQ7QlJU + zoZLMw1lqBOcBipEtZAPqD6egwTzD9ECAwEAAaNTMFEwHQYDVR0OBBYEFC0Q9q0C + d7YKVStYHzIKrD3OnAVGMB8GA1UdIwQYMBaAFC0Q9q0Cd7YKVStYHzIKrD3OnAVG + MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAG0P6CvjDMz0gabj + Pc6mk3/cDF5en4Wcs71UYidLJAkpiK1I+QpAmB00yjEJwQjsHrHI7smRkRs1WHHb + R8dkskga80xU6e549Hh8BxBR+X9qv6a3hyTB1DVXSKZgTRrPSv97GIqKzJHOH7E6 + i6Uex+lFHgQvelquzyAidee4DtVxTpHjs78CqMp5lXH9FQP6EG2VP5Es2OIuWewz + N8adJsxQ2o+UnyMiLj1XFjhA491IAq24BnhGx+ftxhBuhHH4YMXEygogyYGrOFD9 + tqqWVW1EcOilcpEJ5q+c/fo93xlKR4R0OgSzzVMB8b8TGs1c9O9Ju3Hz0g0MQvUS + Mu3l92s= + -----END CERTIFICATE----- + -----BEGIN CERTIFICATE----- + MIIDDzCCAfegAwIBAgIUGxspvdHEbZsghdL2KkSZQEE9MlowDQYJKoZIhvcNAQEL + BQAwFzEVMBMGA1UEAwwMaW50ZXJtZWRpYXRlMB4XDTIzMDgwNDEyNTAyM1oXDTI0 + MDgwMzEyNTAyM1owFzEVMBMGA1UEAwwMaW50ZXJtZWRpYXRlMIIBIjANBgkqhkiG + 9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvrhKaGdIZaPT7HMIVA3qVDXmaBMQmJrdrRXy + WYxrfcn/ITK7FxLcaKKZarBObLNRs/V2cuc38zls8HR1bRqMvNoCYjHma99Z+w8t + Oa1cWN9dHXW27rIzJxYOqtyUn+Sf28tqM0hnf564JcSM8hEUJEOPj+EeNrpTOvv/ + c6SnZ9GUNbVMbkEtwI7RiZMz6e93Q1aXqklr7W7obK7s58ovh+4TK/A/AvQMRSVX + MqvzynanJ6vVM5+1a6A1sU4wgEGdi3RqTHD4ZkYPdAJPbXo3Y2E2NdFwz0jllYnN + Ov9O1R2LMQr1PXHUfEC+zD/GEx2FKIIg5giZqIT1pcS6l/g9awIDAQABo1MwUTAd + BgNVHQ4EFgQUkBe/Meaxi+4cO1BdrMewTaFfPt0wHwYDVR0jBBgwFoAUkBe/Meax + i+4cO1BdrMewTaFfPt0wDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC + AQEAkcn90Hj/GrQTRPBtaKA+/OQknHT0crGGifrdgizZXrv7Au2+RBYFVBrNKOVN + 06bD0PMfS1IbMkevKCJ02x/ibbj3zNCrMlZuBEJfVV5dFz77kQZecfkysNORZCod + cm6I8d7HReQUAL3i3RequXEPQedE3poioeAj2vIWNX8EDo6lLmOwIn6f+JPmEfJR + o3znybe8A+fUvNC7yq9/YC89/wLrWU6+Qt8prb5gqjjmcNxNfBLhWIHU0Zsoy1u8 + z7L2rFywyOlnD7+VUSU1ZI3ov1cDLCCYjCGRwrM5jg4sjXNuwXl9UqqHs1WDtteU + kBrbaNEALwftYHpamABSypNUKw== + -----END CERTIFICATE----- + -----BEGIN CERTIFICATE----- + MIIC/zCCAeegAwIBAgIUaluTAKmmzwXoeWL2iAaMRQRoiTwwDQYJKoZIhvcNAQEL + BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yMzA4MDQxMjUwMjNaFw0yNDA4MDMxMjUw + MjNaMA8xDTALBgNVBAMMBHJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK + AoIBAQDQ17XqXGLxFagfc8+o3k3N7+MSyoe6hTGdrGs/6puL7+p98+4RUxgidUCH + 9PtfB5mz77BxkJrAnMVG4kE5aAe3S072y8QAB7ZX7toTDpO5lSBi43rqraylJHDK + 1IMwF8AfaTmai+WSu7JWLeG/A2soZcOtG/mDL8KryVzGHbUKHA7pOFNvsG03tDtH + bcaAVr8y5sLQmWDlVrgtjNhsgej6/3SgT/ke/SSUmNz/UZnK8Fp0E15HXiE6p3Zg + qTLorgcu4Jnwt+u5V2/sTdSv4Mlrzszh5gmJU8vOfTX4jXyoc5YJqEYAcQYAXaay + yfgvXMrxjUQNpJpiwGs9MDA4OgcrAgMBAAGjUzBRMB0GA1UdDgQWBBTUGCpkA3La + DITQ75GRereRqS9pZDAfBgNVHSMEGDAWgBTUGCpkA3LaDITQ75GRereRqS9pZDAP + BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBChGiup3H5rqZORnIa + huKCWyB0Yl0AoROfm71k99RyzfztKM02S5Jp5in1miweLfLgXpnOj9AzvFDoHfEz + i4K87p1MMfJREOJWfCIVYPB29VNDcPKeeDsoUMV4KTjFJQ00yBl7C5qlb6ZEcgNa + IuTfw8iJPJKbwVELSV9Tp7vBZTkHAFexhMaVzfYqgOxAN1tlSdfk1CL5/ubct3wf + oTJ6jPEi0kBT2oi6aNr2pt/CJnqATItPa5f07Zn1tgfn5TFUXSWbye03Y98jJEZp + LGowDDgPGan1QUsaI4SJCa9ozH7oVOUav0zPXAHCc1o4Fe129Q5W6mkTZU9MLCD0 + Pqfg + -----END CERTIFICATE----- +kind: ConfigMap +metadata: + name: pem-chain-certificate diff --git a/deploy/v1_configmap_pem-with-password-certificate.yaml b/deploy/v1_configmap_pem-with-password-certificate.yaml new file mode 100644 index 0000000..6aee34d --- /dev/null +++ b/deploy/v1_configmap_pem-with-password-certificate.yaml @@ -0,0 +1,53 @@ +apiVersion: v1 +data: + with_password_certificate.pem: | + -----BEGIN PRIVATE KEY----- + MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDVOBzkZMbNhX64 + GSF0Xc8D/WjRNZUTUUMQeio3wdU1sYHykwzfmjmnhZjcBpggE5Qgg5+GFexLMgjq + UkzB7o+s3hAlBR9fzbXQiPtholYr56opPEwhBXrs2pVI8BjSGTXZ038Ubplnaztr + gsqtBrzdGYp+Dr06T+JodL6U0bVjLy43Ev4akAyDOdxzH4dqlMuLlpeDXkDt7sDj + wKjZ3y9yFSadeX+luY0EkrawIKJAJk0TH6x2nO6cgYLphOwyU6O97/w//sW+pPud + zqrTgvYt9irGRSqDzkqKnIQfMBRuMOcRrFKvxpOztVt6PDS7mAHsYKpsA2SPw5k3 + +uPG5H0NAgMBAAECggEABooUCMU2e7MuccMDjaga40pwXopAKjmBzw2QIeml+mGZ + VLFB4dG/Fu44A/eHzuQK1Px0dg5SEvRT5avkgsYoTer5n8kKb0vF2cF5xELQVcRj + KaSZySF75avGjFggysDPMAEWkq/ZsJxPVDrMsIXWYQmZf8g/8Xvlu8Jo3fOYlpQb + h4wqgsDJXzcJS5KeRYv6rgL8EnBCIg8SBW8xWM1wjvsD0/rkEQt/6y08JWjOdm7+ + B09lHYtea3XxLgHSMnEWAvx+ktEYr2TRlikRvIaZsl6fp+AMnv+TNW4C6GowRC+d + 9/wybCKYgJQ/yBrFvWDWLg6+IPsp4mJcPEiJYVT/WQKBgQDtToYVAHKewqHXF7Uw + n5TZT9cXNefpcSHdOvzsSUoS7LU1WIabEA93Tu8HzH2RiRYXLpj7TsKOxrivAPVf + Mcahy99Hkk1QPoidZLcrWB/kyF9dYMNr8LgGFuZAX1SFM71ZOxIGa4Z0PWG6B8Xk + BqN0Li4zEchjWFGkGbDRCUWuzwKBgQDmA9hNWN38Zh0thrraNfPx+tXoDLg+OqxG + LI7oog7zthTzLi/EPhgA/ZR8Xw7Uskr+UuVlYd50XL5Na1zVkNE3bcw9jeT6JoKk + qFLcw26AlrXgLsc4tbRtFIssQqW5uE0SF4lvHy98CHGkdXLE18eF/L4IU7KdrRj6 + o+wfPTCtYwKBgQCdaBuaLKza0AFn2irucLvcFZB3reMBvnAW/byswsRmnypnkyve + CR4pJmt5AdQ8x/CmOdtxvsFg0UHJm1om5a56ve+B2vJ7iq81r4usLY0iRSK0nq2h + mI+IQoJCKrm2jSZI3NzM81/BFMIREnzaDuk29Dbi2yXPd9LXhc76KStWkwKBgQDC + jZQCcF1rZM/fNyuK8MHC9mDB4yhf8m7O+Fd0a8br2yJDQtjCS6cwB0z2Gc1ImPoX + vfQsWai4kc2hXGNsfQ6JrMRpeECqWbJ9JabY9jDccR2rXsXBsOfIr+y75i+ZNEt0 + NxZXOHCIn/fHnFQULVOlgE8YafsVpVkQf2B0V+R5cwKBgQCTiZgcKhcj9LP3vVuO + siU8IvdDBjfaG3JfntM4qNIoWOu7T5meLuQxQ++/U3vl/S+3kgJHA+SFTSokOLv8 + A75cXAuGAJJzFCzrpGc0NVrDPgknfuxI/Q8/adg8dOZ+2ipwHhavcQLVbvAVIYhN + x1p1BElyGO1rInCAMqXDJGBVkg== + -----END PRIVATE KEY----- + -----BEGIN CERTIFICATE----- + MIIDETCCAfmgAwIBAgIUXXG97RzJc0DJoY9w89nwwBcIWp8wDQYJKoZIhvcNAQEL + BQAwGDEWMBQGA1UEAwwNd2l0aF9wYXNzd29yZDAeFw0yMzA4MDQxMjUwMjNaFw0y + NDA4MDMxMjUwMjNaMBgxFjAUBgNVBAMMDXdpdGhfcGFzc3dvcmQwggEiMA0GCSqG + SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVOBzkZMbNhX64GSF0Xc8D/WjRNZUTUUMQ + eio3wdU1sYHykwzfmjmnhZjcBpggE5Qgg5+GFexLMgjqUkzB7o+s3hAlBR9fzbXQ + iPtholYr56opPEwhBXrs2pVI8BjSGTXZ038UbplnaztrgsqtBrzdGYp+Dr06T+Jo + dL6U0bVjLy43Ev4akAyDOdxzH4dqlMuLlpeDXkDt7sDjwKjZ3y9yFSadeX+luY0E + krawIKJAJk0TH6x2nO6cgYLphOwyU6O97/w//sW+pPudzqrTgvYt9irGRSqDzkqK + nIQfMBRuMOcRrFKvxpOztVt6PDS7mAHsYKpsA2SPw5k3+uPG5H0NAgMBAAGjUzBR + MB0GA1UdDgQWBBQv+zjx48FQARo0pX2xJAQ98p31qjAfBgNVHSMEGDAWgBQv+zjx + 48FQARo0pX2xJAQ98p31qjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUA + A4IBAQBdFDE7JmxjgPy9paqaUeiBOLEHv47GGp7TGcsOa2qjD2+hBJJoaeJS0GEi + nmyceYLAM1IG8Q4FXdMh9eZQ+a8Cm7AYMBkqUSzyiznZuSX3XUGublTL95US9zbD + ZBDNaQqfVU2tbnKu/4KtShKGNIm+/WrdCcjAtTXj6YgFDrHQ9CjvVPsqb/m4oexI + r1hqIpLYAj69jGovn/1YIZrliR6GWlHL10lhbnXBGrJXTDjcG3BM27ZRc+jjUJma + Eeo8Ggq8sej2uYld/tJvP4dYpIkmp5/emsz7JiTJ+jDWbY4BoyPbPr1Ql4q3b5M1 + gcQlxtpMSICEHu1lez5YSQ9L/lV6 + -----END CERTIFICATE----- +kind: ConfigMap +metadata: + name: pem-with-password-certificate diff --git a/deploy/v1_configmap_pem-without-password-certificate.yaml b/deploy/v1_configmap_pem-without-password-certificate.yaml new file mode 100644 index 0000000..f63eada --- /dev/null +++ b/deploy/v1_configmap_pem-without-password-certificate.yaml @@ -0,0 +1,53 @@ +apiVersion: v1 +data: + with_password_certificate.pem: | + -----BEGIN PRIVATE KEY----- + MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDVOBzkZMbNhX64 + GSF0Xc8D/WjRNZUTUUMQeio3wdU1sYHykwzfmjmnhZjcBpggE5Qgg5+GFexLMgjq + UkzB7o+s3hAlBR9fzbXQiPtholYr56opPEwhBXrs2pVI8BjSGTXZ038Ubplnaztr + gsqtBrzdGYp+Dr06T+JodL6U0bVjLy43Ev4akAyDOdxzH4dqlMuLlpeDXkDt7sDj + wKjZ3y9yFSadeX+luY0EkrawIKJAJk0TH6x2nO6cgYLphOwyU6O97/w//sW+pPud + zqrTgvYt9irGRSqDzkqKnIQfMBRuMOcRrFKvxpOztVt6PDS7mAHsYKpsA2SPw5k3 + +uPG5H0NAgMBAAECggEABooUCMU2e7MuccMDjaga40pwXopAKjmBzw2QIeml+mGZ + VLFB4dG/Fu44A/eHzuQK1Px0dg5SEvRT5avkgsYoTer5n8kKb0vF2cF5xELQVcRj + KaSZySF75avGjFggysDPMAEWkq/ZsJxPVDrMsIXWYQmZf8g/8Xvlu8Jo3fOYlpQb + h4wqgsDJXzcJS5KeRYv6rgL8EnBCIg8SBW8xWM1wjvsD0/rkEQt/6y08JWjOdm7+ + B09lHYtea3XxLgHSMnEWAvx+ktEYr2TRlikRvIaZsl6fp+AMnv+TNW4C6GowRC+d + 9/wybCKYgJQ/yBrFvWDWLg6+IPsp4mJcPEiJYVT/WQKBgQDtToYVAHKewqHXF7Uw + n5TZT9cXNefpcSHdOvzsSUoS7LU1WIabEA93Tu8HzH2RiRYXLpj7TsKOxrivAPVf + Mcahy99Hkk1QPoidZLcrWB/kyF9dYMNr8LgGFuZAX1SFM71ZOxIGa4Z0PWG6B8Xk + BqN0Li4zEchjWFGkGbDRCUWuzwKBgQDmA9hNWN38Zh0thrraNfPx+tXoDLg+OqxG + LI7oog7zthTzLi/EPhgA/ZR8Xw7Uskr+UuVlYd50XL5Na1zVkNE3bcw9jeT6JoKk + qFLcw26AlrXgLsc4tbRtFIssQqW5uE0SF4lvHy98CHGkdXLE18eF/L4IU7KdrRj6 + o+wfPTCtYwKBgQCdaBuaLKza0AFn2irucLvcFZB3reMBvnAW/byswsRmnypnkyve + CR4pJmt5AdQ8x/CmOdtxvsFg0UHJm1om5a56ve+B2vJ7iq81r4usLY0iRSK0nq2h + mI+IQoJCKrm2jSZI3NzM81/BFMIREnzaDuk29Dbi2yXPd9LXhc76KStWkwKBgQDC + jZQCcF1rZM/fNyuK8MHC9mDB4yhf8m7O+Fd0a8br2yJDQtjCS6cwB0z2Gc1ImPoX + vfQsWai4kc2hXGNsfQ6JrMRpeECqWbJ9JabY9jDccR2rXsXBsOfIr+y75i+ZNEt0 + NxZXOHCIn/fHnFQULVOlgE8YafsVpVkQf2B0V+R5cwKBgQCTiZgcKhcj9LP3vVuO + siU8IvdDBjfaG3JfntM4qNIoWOu7T5meLuQxQ++/U3vl/S+3kgJHA+SFTSokOLv8 + A75cXAuGAJJzFCzrpGc0NVrDPgknfuxI/Q8/adg8dOZ+2ipwHhavcQLVbvAVIYhN + x1p1BElyGO1rInCAMqXDJGBVkg== + -----END PRIVATE KEY----- + -----BEGIN CERTIFICATE----- + MIIDETCCAfmgAwIBAgIUXXG97RzJc0DJoY9w89nwwBcIWp8wDQYJKoZIhvcNAQEL + BQAwGDEWMBQGA1UEAwwNd2l0aF9wYXNzd29yZDAeFw0yMzA4MDQxMjUwMjNaFw0y + NDA4MDMxMjUwMjNaMBgxFjAUBgNVBAMMDXdpdGhfcGFzc3dvcmQwggEiMA0GCSqG + SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVOBzkZMbNhX64GSF0Xc8D/WjRNZUTUUMQ + eio3wdU1sYHykwzfmjmnhZjcBpggE5Qgg5+GFexLMgjqUkzB7o+s3hAlBR9fzbXQ + iPtholYr56opPEwhBXrs2pVI8BjSGTXZ038UbplnaztrgsqtBrzdGYp+Dr06T+Jo + dL6U0bVjLy43Ev4akAyDOdxzH4dqlMuLlpeDXkDt7sDjwKjZ3y9yFSadeX+luY0E + krawIKJAJk0TH6x2nO6cgYLphOwyU6O97/w//sW+pPudzqrTgvYt9irGRSqDzkqK + nIQfMBRuMOcRrFKvxpOztVt6PDS7mAHsYKpsA2SPw5k3+uPG5H0NAgMBAAGjUzBR + MB0GA1UdDgQWBBQv+zjx48FQARo0pX2xJAQ98p31qjAfBgNVHSMEGDAWgBQv+zjx + 48FQARo0pX2xJAQ98p31qjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUA + A4IBAQBdFDE7JmxjgPy9paqaUeiBOLEHv47GGp7TGcsOa2qjD2+hBJJoaeJS0GEi + nmyceYLAM1IG8Q4FXdMh9eZQ+a8Cm7AYMBkqUSzyiznZuSX3XUGublTL95US9zbD + ZBDNaQqfVU2tbnKu/4KtShKGNIm+/WrdCcjAtTXj6YgFDrHQ9CjvVPsqb/m4oexI + r1hqIpLYAj69jGovn/1YIZrliR6GWlHL10lhbnXBGrJXTDjcG3BM27ZRc+jjUJma + Eeo8Ggq8sej2uYld/tJvP4dYpIkmp5/emsz7JiTJ+jDWbY4BoyPbPr1Ql4q3b5M1 + gcQlxtpMSICEHu1lez5YSQ9L/lV6 + -----END CERTIFICATE----- +kind: ConfigMap +metadata: + name: pem-without-password-certificate diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..45e9778 --- /dev/null +++ b/go.mod @@ -0,0 +1,43 @@ +module certalert + +go 1.20 + +require ( + github.com/fsnotify/fsnotify v1.6.0 + github.com/gorilla/mux v1.8.0 + github.com/pavlo-v-chernykh/keystore-go/v4 v4.4.1 + github.com/prometheus/client_golang v1.16.0 + github.com/sirupsen/logrus v1.9.3 + github.com/spf13/cobra v1.7.0 + github.com/spf13/viper v1.16.0 + github.com/stretchr/testify v1.8.3 + gopkg.in/yaml.v3 v3.0.1 + software.sslmate.com/src/go-pkcs12 v0.2.1 +) + +require ( + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/pelletier/go-toml/v2 v2.0.8 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/prometheus/client_model v0.3.0 // indirect + github.com/prometheus/common v0.42.0 // indirect + github.com/prometheus/procfs v0.10.1 // indirect + github.com/spf13/afero v1.9.5 // indirect + github.com/spf13/cast v1.5.1 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/subosito/gotenv v1.4.2 // indirect + golang.org/x/crypto v0.11.0 // indirect + golang.org/x/sys v0.10.0 // indirect + golang.org/x/text v0.11.0 // indirect + google.golang.org/protobuf v1.30.0 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..7647e59 --- /dev/null +++ b/go.sum @@ -0,0 +1,520 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/pavlo-v-chernykh/keystore-go/v4 v4.4.1 h1:FyBdsRqqHH4LctMLL+BL2oGO+ONcIPwn96ctofCVtNE= +github.com/pavlo-v-chernykh/keystore-go/v4 v4.4.1/go.mod h1:lAVhWwbNaveeJmxrxuSTxMgKpF6DjnuVpn6T8WiBwYQ= +github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= +github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= +github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= +github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= +github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= +github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= +github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +software.sslmate.com/src/go-pkcs12 v0.2.1 h1:tbT1jjaeFOF230tzOIRJ6U5S1jNqpsSyNjzDd58H3J8= +software.sslmate.com/src/go-pkcs12 v0.2.1/go.mod h1:Qiz0EyvDRJjjxGyUQa2cCNZn/wMyzrRJ/qcDXOQazLI= diff --git a/hack/jks.sh b/hack/jks.sh new file mode 100644 index 0000000..9f192f4 --- /dev/null +++ b/hack/jks.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +# define an associative array +declare -A certs +certs=( ["regular_certificate"]="password" ["chain"]="password" ["intermediate"]="password" ["root"]="password" ) + +mkdir -p ./tests/certs/jks +pushd ./tests/certs/jks + +# Iterate the string array using for loop +for name in "${!certs[@]}";do + # Generate the key pair and self-signed certificate, and store them in a JKS file + keytool -genkey -keyalg RSA -alias $name -keystore ${name}.jks -storepass changeit -validity 365 -dname "CN=$name" -noprompt +done + +# create certificate chain +keytool -genkeypair -keyalg RSA -alias root -keystore chain.jks -storepass changeit -validity 365 -dname "CN=root" -noprompt +keytool -genkeypair -keyalg RSA -alias intermediate -keystore chain.jks -storepass changeit -validity 365 -dname "CN=intermediate" -noprompt +keytool -genkeypair -keyalg RSA -alias leaf -keystore chain.jks -storepass changeit -validity 365 -dname "CN=leaf" -noprompt + +popd diff --git a/hack/p12.sh b/hack/p12.sh new file mode 100644 index 0000000..aa993a0 --- /dev/null +++ b/hack/p12.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +# define an associative array +declare -A certs +certs=( ["with_password"]="password" ["without_password"]="" ["chain"]="password" ["intermediate"]="password" ["root"]="password" ) + +mkdir -p ./tests/certs/p12 +pushd ./tests/certs/p12 + +# Iterate the string array using for loop +for name in "${!certs[@]}";do + password=${certs[$name]} + + # Generate private key with password if it's set + if [ -z "$password" ]; then + openssl genpkey -algorithm RSA -out ${name}_private_key.key + else + openssl genpkey -algorithm RSA -out ${name}_private_key.key -pass pass:$password + fi + + # Generate the self-signed certificate + openssl req -new -x509 -key ${name}_private_key.key -out ${name}_self_signed_certificate.crt -days 365 -subj "/CN=$name" + + # Export the certificate and private key to a PKCS12 (.p12) file + if [ -z "$password" ]; then + openssl pkcs12 -export -out ${name}_certificate.p12 -inkey ${name}_private_key.key -in ${name}_self_signed_certificate.crt -password pass: + else + openssl pkcs12 -export -out ${name}_certificate.p12 -inkey ${name}_private_key.key -in ${name}_self_signed_certificate.crt -password pass:$password + fi +done + +# create broken p12 file +echo "broken" > broken_certificate.p12 + + +# create p12 file with a certificate chain +cat chain_self_signed_certificate.crt intermediate_self_signed_certificate.crt root_self_signed_certificate.crt > chain.crt +openssl pkcs12 -export -out chain_certificate.p12 -inkey chain_private_key.key -in chain_self_signed_certificate.crt -certfile chain.crt -password pass:password + +popd diff --git a/hack/pem.sh b/hack/pem.sh new file mode 100644 index 0000000..9267bda --- /dev/null +++ b/hack/pem.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +# define an associative array +declare -A certs +certs=( ["with_password"]="password" ["without_password"]="" ["chain"]="password" ["intermediate"]="password" ["root"]="password" ) + +mkdir -p ./tests/certs/pem +pushd ./tests/certs/pem + +# Iterate the string array using for loop +for name in "${!certs[@]}";do + password=${certs[$name]} + + # Generate private key with password if it's set + if [ -z "$password" ]; then + openssl genpkey -algorithm RSA -out ${name}_private_key.key + else + openssl genpkey -algorithm RSA -out ${name}_private_key.key -pass pass:$password + fi + + # Generate the self-signed certificate + openssl req -new -x509 -key ${name}_private_key.key -out ${name}_self_signed_certificate.crt -days 365 -subj "/CN=$name" + + # Export the certificate and private key to a PEM file + if [ -z "$password" ]; then + cat ${name}_private_key.key ${name}_self_signed_certificate.crt > ${name}_certificate.pem + else + openssl rsa -in ${name}_private_key.key -out ${name}_private_key.pem -passin pass:$password + cat ${name}_private_key.pem ${name}_self_signed_certificate.crt > ${name}_certificate.pem + fi +done + +# create broken pem file +echo "broken" > broken_certificate.pem + +# create pem file with a certificate chain +cat chain_self_signed_certificate.crt intermediate_self_signed_certificate.crt root_self_signed_certificate.crt > chain.crt +cat chain_private_key.key chain.crt > chain_certificate.pem + +popd diff --git a/internal/certificates/jks.go b/internal/certificates/jks.go new file mode 100644 index 0000000..c9d2a45 --- /dev/null +++ b/internal/certificates/jks.go @@ -0,0 +1,63 @@ +package certificates + +import ( + "bytes" + "crypto/x509" + "fmt" + + "github.com/pavlo-v-chernykh/keystore-go/v4" +) + +// ExtractJksCertificatesInfo reads the JKS file, extracts certificate information, and returns a list of CertificateInfo +func ExtractJKSCertificatesInfo(name string, certData []byte, password string) ([]CertificateInfo, error) { + var certInfoList []CertificateInfo + + ks := keystore.New() + if err := ks.Load(bytes.NewReader(certData), []byte(password)); err != nil { + return nil, fmt.Errorf("Failed to load JKS file '%s': %w", name, err) + } + + for _, alias := range ks.Aliases() { + var certificates []keystore.Certificate + // Check the entry type and get certificates accordingly + if ks.IsPrivateKeyEntry(alias) { + entry, err := ks.GetPrivateKeyEntry(alias, []byte(password)) + if err != nil { + return nil, fmt.Errorf("Failed to get entries in JKS file '%s': %w", name, err) + } + certificates = entry.CertificateChain + } else if ks.IsTrustedCertificateEntry(alias) { + entry, err := ks.GetTrustedCertificateEntry(alias) + if err != nil { + return nil, fmt.Errorf("Failed to get certificates in JKS file '%s': %w", name, err) + } + certificates = []keystore.Certificate{entry.Certificate} + } else { + return nil, fmt.Errorf("Unknown entry type for alias '%s' in JKS file '%s'", alias, name) + } + + // Iterate over all certificates in the entry + for idx, cert := range certificates { + certificate, err := x509.ParseCertificate(cert.Content) + if err != nil { + return nil, fmt.Errorf("Failed to parse certificate '%s': %w", name, err) + } + + subject := certificate.Subject.CommonName + if subject == "" { + subject = fmt.Sprint(idx) + } + + certInfo := CertificateInfo{ + Name: name, + Subject: subject, + Epoch: certificate.NotAfter.Unix(), + Type: "jks", + } + + certInfoList = append(certInfoList, certInfo) + } + } + + return certInfoList, nil +} diff --git a/internal/certificates/jks_test.go b/internal/certificates/jks_test.go new file mode 100644 index 0000000..d23d3f9 --- /dev/null +++ b/internal/certificates/jks_test.go @@ -0,0 +1,123 @@ +package certificates + +import ( + "os" + "testing" +) + +func TestExtractJKSCertificatesInfo(t *testing.T) { + // Define a structure for test case + type testCase struct { + Name string + FilePath string + Password string + ExpectedResults []CertificateInfo + ExpectedError string + } + + // Define test cases + testCases := []testCase{ + { + Name: "Test JKS certificate - broken", + FilePath: "../../tests/certs/jks/broken_certificate.jks", + Password: "password", + ExpectedResults: []CertificateInfo{}, + ExpectedError: "Failed to load JKS file 'TestCert': got invalid magic", + }, + { + Name: "Test JKS certificate - valid", + FilePath: "../../tests/certs/jks/regular.jks", + Password: "changeit", + ExpectedResults: []CertificateInfo{ + { + Name: "TestCert", + Type: "jks", + Epoch: 1722692115, + Subject: "regular", + }, + }, + ExpectedError: "", + }, + { + Name: "Test JKS certificate - valid chain", + FilePath: "../../tests/certs/jks/chain.jks", + Password: "changeit", + ExpectedResults: []CertificateInfo{ + { + Name: "TestCert", + Type: "jks", + Epoch: 1722692127, + Subject: "root", + }, + { + Name: "TestCert", + Type: "jks", + Epoch: 1722692128, + Subject: "intermediate", + }, + { + Name: "TestCert", + Type: "jks", + Epoch: 1722692131, + Subject: "leaf", + }, + { + Name: "TestCert", + Type: "jks", + Epoch: 1722692126, + Subject: "chain", + }, + }, + ExpectedError: "", + }, + } + + // Iterate over test cases + for _, tc := range testCases { + t.Run(tc.Name, func(t *testing.T) { + // Run the function under test + certData, err := os.ReadFile(tc.FilePath) + if err != nil { + t.Errorf("Failed to read certificate file '%s': %v", tc.Name, err) + } + certs, err := ExtractJKSCertificatesInfo("TestCert", certData, tc.Password) + + if tc.ExpectedError == "" && err != nil { + t.Errorf("Test case '%s': unexpected error: %v", tc.Name, err) + } + if tc.ExpectedError != "" { + if err == nil { + t.Errorf("Test case '%s': expected error, but got none", tc.Name) + } else if err.Error() != tc.ExpectedError { + t.Errorf("Test case '%s': expected error '%s', but got '%s'", tc.Name, tc.ExpectedError, err.Error()) + } + return // error is expected, so we can skip the rest of the test + } + + // Check the length of the returned slice + if len(certs) != len(tc.ExpectedResults) { + t.Errorf("Expected %d certificate, got %d", len(tc.ExpectedResults), len(certs)) + } + + // Check the values in the returned certificate + for _, expectedCert := range tc.ExpectedResults { + // Find the certificate in the returned slice + var extractedCert CertificateInfo + var found bool + for _, cert := range certs { + if cert.Name == expectedCert.Name && cert.Subject == expectedCert.Subject && cert.Type == expectedCert.Type { + extractedCert = cert + found = true + break + } + } + if !found { + t.Errorf("Expected cert %v not found", expectedCert) + } + if expectedCert.Epoch != extractedCert.Epoch { + t.Errorf("Expected cert %v, got %v", expectedCert, extractedCert) + } + } + }) + } +} diff --git a/internal/certificates/p12.go b/internal/certificates/p12.go new file mode 100644 index 0000000..cc3ce7b --- /dev/null +++ b/internal/certificates/p12.go @@ -0,0 +1,44 @@ +package certificates + +import ( + "fmt" + + "github.com/sirupsen/logrus" + + pkcs12 "software.sslmate.com/src/go-pkcs12" +) + +// ExtractP12CertificatesInfo reads the P12 file, extracts certificate information, and returns a list of CertificateInfo +func ExtractP12CertificatesInfo(name string, certData []byte, password string) ([]CertificateInfo, error) { + // Decode the P12 data + _, certificate, caCerts, err := pkcs12.DecodeChain(certData, password) + if err != nil { + return nil, fmt.Errorf("Failed to decode P12 file '%s': %w", name, err) + } + + // Prepare for extraction + certs := append(caCerts, certificate) + var certInfoList []CertificateInfo + var counter int + + // Extract certificates + for _, cert := range certs { + counter++ + subject := cert.Subject.CommonName + if subject == "" { + subject = fmt.Sprint(counter) + } + + certInfo := CertificateInfo{ + Name: name, + Subject: subject, + Epoch: cert.NotAfter.Unix(), + Type: "p12", + } + logrus.Debugf("Certificate '%s' expires on %s", certInfo.Subject, certInfo.ExpiryAsTime()) + + certInfoList = append(certInfoList, certInfo) + } + + return certInfoList, nil +} diff --git a/internal/certificates/p12_test.go b/internal/certificates/p12_test.go new file mode 100644 index 0000000..ab485eb --- /dev/null +++ b/internal/certificates/p12_test.go @@ -0,0 +1,144 @@ +package certificates + +import ( + "os" + "testing" +) + +func TestExtractP12CertificatesInfo(t *testing.T) { + // Define a structure for test case + type testCase struct { + Name string + FilePath string + Password string + ExpectedResults []CertificateInfo + ExpectedError string + } + + // Define test cases + testCases := []testCase{ + { + Name: "Test P12 certificate with no password", + FilePath: "../../tests/certs/p12/without_password_certificate.p12", + Password: "", + ExpectedResults: []CertificateInfo{ + { + Name: "TestCert", + Subject: "without_password", + Epoch: 1722688212, + Type: "p12", + }, + }, + ExpectedError: "", + }, + { + Name: "Test P12 certificate with password", + FilePath: "../../tests/certs/p12/with_password_certificate.p12", + Password: "password", + ExpectedResults: []CertificateInfo{ + { + Name: "TestCert", + Subject: "with_password", + Epoch: 1722688213, + Type: "p12", + }, + }, + ExpectedError: "", + }, + { + Name: "Test P12 certificate with wrong password", + FilePath: "../../tests/certs/p12/with_password_certificate.p12", + Password: "wrong", + ExpectedResults: []CertificateInfo{{}}, + ExpectedError: "Failed to decode P12 file 'TestCert': pkcs12: decryption password incorrect", + }, + { + Name: "Test P12 certificate which is broken", + FilePath: "../../tests/certs/p12/broken_certificate.p12", + Password: "", + ExpectedResults: []CertificateInfo{{}}, + ExpectedError: "Failed to decode P12 file 'TestCert': pkcs12: error reading P12 data: asn1: structure error: tags don't match (16 vs {class:1 tag:2 length:114 isCompound:true}) {optional:false explicit:false application:false private:false defaultValue: tag: stringType:0 timeType:0 set:false omitEmpty:false} pfxPdu @2", + }, + { + Name: "Test P12 certificate with chain", + FilePath: "../../tests/certs/p12/chain_certificate.p12", + Password: "password", + ExpectedResults: []CertificateInfo{ + { + Name: "TestCert", + Subject: "chain", + Epoch: 1722688212, + Type: "p12", + }, + { + Name: "TestCert", + Subject: "chain", + Epoch: 1722688212, + Type: "p12", + }, + { + Name: "TestCert", + Subject: "chain", + Epoch: 1722688212, + Type: "p12", + }, + { + Name: "TestCert", + Subject: "chain", + Epoch: 1722688212, + Type: "p12", + }, + }, + ExpectedError: "", + }, + } + + // Iterate over test cases + for _, tc := range testCases { + t.Run(tc.Name, func(t *testing.T) { + // Run the function under test + certData, err := os.ReadFile(tc.FilePath) + if err != nil { + t.Errorf("Failed to read certificate file '%s': %v", tc.Name, err) + } + certs, err := ExtractP12CertificatesInfo("TestCert", certData, tc.Password) + + if tc.ExpectedError == "" && err != nil { + t.Errorf("Test case '%s': unexpected error: %v", tc.Name, err) + } + if tc.ExpectedError != "" { + if err == nil { + t.Errorf("Test case '%s': expected error, but got none", tc.Name) + } else if err.Error() != tc.ExpectedError { + t.Errorf("Test case '%s': expected error '%s', but got '%s'", tc.Name, tc.ExpectedError, err.Error()) + } + return // error is expected, so we can skip the rest of the test + } + + // Check the length of the returned slice + if len(certs) != len(tc.ExpectedResults) { + t.Errorf("Expected %d certificate, got %d", len(tc.ExpectedResults), len(certs)) + } + + // Check the values in the returned certificate + for _, expectedCert := range tc.ExpectedResults { + // Find the certificate in the returned slice + var extractedCert CertificateInfo + for _, cert := range certs { + if cert.Name == expectedCert.Name { + extractedCert = cert + break + } + } + if extractedCert == (CertificateInfo{}) { + t.Errorf("Expected cert %v not found", expectedCert) + } + + // Check the values in the returned certificate + if extractedCert != expectedCert { + t.Errorf("Expected cert %v, got %v", expectedCert, extractedCert) + } + } + }) + } +} diff --git a/internal/certificates/pem.go b/internal/certificates/pem.go new file mode 100644 index 0000000..4aacedb --- /dev/null +++ b/internal/certificates/pem.go @@ -0,0 +1,72 @@ +package certificates + +import ( + "crypto/x509" + "encoding/pem" + "fmt" + + log "github.com/sirupsen/logrus" +) + +// ExtractPEMCertificatesInfo reads the PEM file, extracts certificate information, and returns a list of CertificateInfo +func ExtractPEMCertificatesInfo(name string, certData []byte, password string) ([]CertificateInfo, error) { + var certInfoList []CertificateInfo + var counter int + + // Decode PEM and extract certificates + for { + block, rest := pem.Decode(certData) + if block == nil { + break + } + + // if block is a private key, try to parse it + if block.Type == "PRIVATE KEY" { + if password != "" { + _, err := x509.DecryptPEMBlock(block, []byte(password)) + if err != nil { + log.Warningf("Failed to decrypt private key '%s': %v", name, err) + } + } else { + _, err := x509.ParsePKCS8PrivateKey(block.Bytes) + if err != nil { + log.Warningf("Failed to parse private key '%s': %v", name, err) + } + } + } + + // skip if is not a certificate + if block.Type != "CERTIFICATE" { + certData = rest // Move to the next PEM block + continue + } + + counter++ + + cert, err := x509.ParseCertificate(block.Bytes) + if err != nil { + return nil, fmt.Errorf("Failed to parse certificate '%s': %w", name, err) + } + + subject := cert.Subject.CommonName + if subject == "" { + subject = fmt.Sprint(counter) + } + + certInfo := CertificateInfo{ + Name: name, + Subject: subject, + Epoch: cert.NotAfter.Unix(), + Type: "pem", + } + + certInfoList = append(certInfoList, certInfo) + + certData = rest // Move to the next PEM block + } + if certInfoList == nil { + return nil, fmt.Errorf("Failed to decode certificate '%s'", name) + } + + return certInfoList, nil +} diff --git a/internal/certificates/pem_test.go b/internal/certificates/pem_test.go new file mode 100644 index 0000000..220960b --- /dev/null +++ b/internal/certificates/pem_test.go @@ -0,0 +1,145 @@ +package certificates + +import ( + "os" + "testing" +) + +func TestExtractPEMCertificatesInfo(t *testing.T) { + // Define a structure for test case + type testCase struct { + Name string + FilePath string + Password string + ExpectedResults []CertificateInfo + ExpectedError string + } + + // Define test cases + testCases := []testCase{ + { + Name: "Test PEM certificate with no password", + FilePath: "../../tests/certs/pem/without_password_certificate.pem", + Password: "", + ExpectedResults: []CertificateInfo{ + { + Name: "TestCert", + Subject: "without_password", + Epoch: 1722689423, + Type: "pem", + }, + }, + ExpectedError: "", + }, + { + Name: "Test PEM certificate with password", + FilePath: "../../tests/certs/pem/with_password_certificate.pem", + Password: "password", + ExpectedResults: []CertificateInfo{ + { + Name: "TestCert", + Subject: "with_password", + Epoch: 1722689423, + Type: "pem", + }, + }, + ExpectedError: "", + }, + { + Name: "Test PEM certificate witch is broken", + FilePath: "../../tests/certs/pem/broken_certificate.pem", + Password: "", + ExpectedResults: []CertificateInfo{}, + ExpectedError: "Failed to decode certificate 'TestCert'", + }, + { + Name: "Test PEM certificate with wrong password", + FilePath: "../../tests/certs/pem/with_password_certificate.pem", + Password: "wrong", + ExpectedResults: []CertificateInfo{ + { + Name: "TestCert", + Subject: "with_password", + Epoch: 1722689423, + Type: "pem", + }, + }, + ExpectedError: "", // no error expected since it it not necessary to decrypt the private key to parse the certificate + }, + { + Name: "Test PEM certificate with chain", + FilePath: "../../tests/certs/pem/chain_certificate.pem", + Password: "password", + ExpectedResults: []CertificateInfo{ + { + Name: "TestCert", + Subject: "chain", + Epoch: 1722689422, + Type: "pem", + }, + { + Name: "TestCert", + Subject: "chain", + Epoch: 1722689422, + Type: "pem", + }, + { + Name: "TestCert", + Subject: "chain", + Epoch: 1722689422, + Type: "pem", + }, + }, + ExpectedError: "", + }, + } + + // Iterate over test cases + for _, tc := range testCases { + t.Run(tc.Name, func(t *testing.T) { + // Run the function under test + certData, err := os.ReadFile(tc.FilePath) + if err != nil { + t.Errorf("Failed to read certificate file '%s': %v", tc.Name, err) + } + certs, err := ExtractPEMCertificatesInfo("TestCert", certData, tc.Password) + + if tc.ExpectedError == "" && err != nil { + t.Errorf("Test case '%s': unexpected error: %v", tc.Name, err) + } + if tc.ExpectedError != "" { + if err == nil { + t.Errorf("Test case '%s': expected error, but got none", tc.Name) + } else if err.Error() != tc.ExpectedError { + t.Errorf("Test case '%s': expected error '%s', but got '%s'", tc.Name, tc.ExpectedError, err.Error()) + } + return // error is expected, so we can skip the rest of the test + } + + // Check the length of the returned slice + if len(certs) != len(tc.ExpectedResults) { + t.Errorf("Expected %d certificate, got %d", len(tc.ExpectedResults), len(certs)) + } + + // Check the values in the returned certificate + for _, expectedCert := range tc.ExpectedResults { + // Find the certificate in the returned slice + var extractedCert CertificateInfo + for _, cert := range certs { + if cert.Name == expectedCert.Name { + extractedCert = cert + break + } + } + if extractedCert == (CertificateInfo{}) { + t.Errorf("Expected cert %v not found", expectedCert) + } + + // Check the values in the returned certificate + if extractedCert != expectedCert { + t.Errorf("Expected cert %v, got %v", expectedCert, extractedCert) + } + } + }) + } +} diff --git a/internal/certificates/structs.go b/internal/certificates/structs.go new file mode 100644 index 0000000..d2f265a --- /dev/null +++ b/internal/certificates/structs.go @@ -0,0 +1,27 @@ +package certificates + +import "time" + +var ValidTypes = []string{"p12", "pkcs12", "pfx", "pem", "crt", "jks"} + +// Certificate represents a certificate configuration +type Certificate struct { + Name string `yaml:"name"` + Enabled *bool `yaml:"enabled"` + Path string `yaml:"path"` + Password string `yaml:"password"` + Type string `yaml:"type"` +} + +// CertificateInfo represents the extracted certificate information +type CertificateInfo struct { + Name string `yaml:"name"` + Subject string `yaml:"subject"` + Epoch int64 `yaml:"epoch"` + Type string `yaml:"type"` +} + +// ExpiryAsTime returns the expiry date as a time.Time +func (ci *CertificateInfo) ExpiryAsTime() time.Time { + return time.Unix(ci.Epoch, 0) +} diff --git a/internal/certificates/utils.go b/internal/certificates/utils.go new file mode 100644 index 0000000..4e28d86 --- /dev/null +++ b/internal/certificates/utils.go @@ -0,0 +1,53 @@ +package certificates + +import ( + "fmt" + "os" + + log "github.com/sirupsen/logrus" +) + +// GetByName returns the certificate with the given name +func GetCertificateByName(name string, certificates []Certificate) (*Certificate, error) { + for _, cert := range certificates { + if cert.Name == name { + return &cert, nil + } + } + return nil, fmt.Errorf("Certificate '%s' not found", name) +} + +// Process extracts certificate information from the certificates and updates the Prometheus metrics +func Process(certificates []Certificate) (certificatesInfo []CertificateInfo, err error) { + for _, cert := range certificates { + if cert.Enabled != nil && !*cert.Enabled { + log.Debugf("Skip certificate '%s' as it is disabled", cert.Name) + continue + } + log.Debugf("Processing certificate '%s'", cert.Name) + + var certificateInfo []CertificateInfo + + certData, err := os.ReadFile(cert.Path) + if err != nil { + return nil, fmt.Errorf("Failed to read certificate file '%s': %w", cert.Path, err) + } + + switch cert.Type { + case "p12", "pkcs12", "pfx": + certificateInfo, err = ExtractP12CertificatesInfo(cert.Name, certData, cert.Password) + case "pem", "crt": + certificateInfo, err = ExtractPEMCertificatesInfo(cert.Name, certData, cert.Password) + case "jks": + certificateInfo, err = ExtractJKSCertificatesInfo(cert.Name, certData, cert.Password) + default: + return nil, fmt.Errorf("Unknown certificate type '%s'", cert.Type) + } + if err != nil { + return nil, fmt.Errorf("Error extracting certificate information: %v", err) + } + certificatesInfo = append(certificatesInfo, certificateInfo...) + } + + return certificatesInfo, nil +} diff --git a/internal/certificates/utils_test.go b/internal/certificates/utils_test.go new file mode 100644 index 0000000..7d1d2e5 --- /dev/null +++ b/internal/certificates/utils_test.go @@ -0,0 +1,34 @@ +package certificates + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +// Test cases for GetCertificateByName +func TestGetCertificateByName(t *testing.T) { + certs := []Certificate{ + {Name: "TestCert1"}, + {Name: "TestCert2"}, + } + + tt := []struct { + name string + want *Certificate + err string + }{ + {"TestCert1", &certs[0], ""}, + {"TestCert3", nil, "Certificate 'TestCert3' not found"}, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + got, err := GetCertificateByName(tc.name, certs) + assert.Equal(t, tc.want, got) + if err != nil { + assert.Equal(t, err.Error(), tc.err) + } + }) + } +} diff --git a/internal/config/parse.go b/internal/config/parse.go new file mode 100644 index 0000000..ea11472 --- /dev/null +++ b/internal/config/parse.go @@ -0,0 +1,106 @@ +package config + +import ( + "certalert/internal/certificates" + "certalert/internal/utils" + "fmt" + "path/filepath" + "reflect" + "strings" + + log "github.com/sirupsen/logrus" +) + +// validateAuthConfig validates the auth config +func validateAuthConfig(authConfig Auth) error { + basicValue := reflect.ValueOf(authConfig.Basic) + bearerValue := reflect.ValueOf(authConfig.Bearer) + + basicZero := reflect.Zero(basicValue.Type()) + bearerZero := reflect.Zero(bearerValue.Type()) + + if basicValue.Interface() != basicZero.Interface() && bearerValue.Interface() != bearerZero.Interface() { + return fmt.Errorf("Both 'auth.basic' and 'auth.bearer' are defined") + } + + return nil +} + +// ParseConfig parse the config file and resolves variables +func ParseConfig(app *Config) (err error) { + app.Pushgateway.Address, err = utils.ResolveVariable(app.Pushgateway.Address) + if err != nil { + return fmt.Errorf("Failed to resolve address for pushgateway: %v", err) + } + + if err := validateAuthConfig(app.Pushgateway.Auth); err != nil { + return err + } + + app.Pushgateway.Auth.Basic.Password, err = utils.ResolveVariable(app.Pushgateway.Auth.Basic.Password) + if err != nil { + return fmt.Errorf("Failed to resolve password for pushgateway: %v", err) + } + + app.Pushgateway.Auth.Bearer.Token, err = utils.ResolveVariable(app.Pushgateway.Auth.Bearer.Token) + if err != nil { + return fmt.Errorf("Failed to resolve token for pushgateway: %v", err) + } + + if app.Pushgateway.Job == "" { + app.Pushgateway.Job = "certalert" + } else { + app.Pushgateway.Job, err = utils.ResolveVariable(app.Pushgateway.Job) + if err != nil { + return fmt.Errorf("Failed to resolve job for pushgateway: %v", err) + } + } + + for idx, cert := range app.Certs { + if cert.Enabled != nil && !*cert.Enabled { + log.Debugf("Skip certificate '%s' because is disabled", cert.Name) + continue + } + + if cert.Name == "" { + return fmt.Errorf("Certificate no '%d' has no 'name' defined", idx) + } + + if cert.Path == "" { + return fmt.Errorf("Certificate '%s' has no 'path' defined", cert.Name) + } + + if cert.Type == "" { + // try to guess the type based on the file extension + ext := filepath.Ext(cert.Path) + switch ext { + case ".p12", ".pkcs12", ".pfx": + cert.Type = "p12" + case ".pem", ".crt": + cert.Type = "pem" + case ".jks": + cert.Type = "jks" + default: + reason := "missing file extension." + if ext != "" { + reason = fmt.Sprintf("unclear file extension (%s).", ext) + } + + return fmt.Errorf("Certificate '%s' has no 'type' defined. Type can't be inferred due to the %s", cert.Name, reason) + } + } + if !utils.IsInList(cert.Type, certificates.ValidTypes) { + return fmt.Errorf("Certificate '%s' has an invalid 'type'. Must be one of: %s", cert.Name, strings.Join(certificates.ValidTypes, ", ")) + } + + pw, err := utils.ResolveVariable(cert.Password) + if err != nil { + return fmt.Errorf("Certifacate '%s' cannot resolve 'password'. %v", cert.Name, err) + } + cert.Password = pw + + app.Certs[idx] = cert + } + + return nil +} diff --git a/internal/config/parse_test.go b/internal/config/parse_test.go new file mode 100644 index 0000000..695170d --- /dev/null +++ b/internal/config/parse_test.go @@ -0,0 +1,216 @@ +package config + +import ( + "certalert/internal/certificates" + "fmt" + "os" + "strings" + "testing" +) + +func setEnvVars(envs map[string]string) { + for key, value := range envs { + os.Setenv(key, value) + } +} + +func unsetEnvVars(envs map[string]string) { + for key := range envs { + os.Unsetenv(key) + } +} + +func createTempFile(content string, t *testing.T) string { + tempFile, err := os.CreateTemp("", "certalert") + if err != nil { + t.Fatalf("Failed to create temporary file: %v", err) + } + + defer tempFile.Close() + + if _, err := tempFile.WriteString(content); err != nil { + t.Fatalf("Failed to write to temporary file: %v", err) + } + + return tempFile.Name() +} + +func TestParseConfig(t *testing.T) { + envs := map[string]string{ + "PUSHGATEWAY_ADDRESS": "http://localhost:9091", + "PUSHGATEWAY_JOB": "certalert", + "BASIC_PASSWORD": "password", + "BEARER_TOKEN": "token", + } + passwordFileName := createTempFile("password", t) + var trueVar = true + + testCases := []struct { + name string + config *Config + expectedError string + }{ + { + name: "success", + config: &Config{ + Pushgateway: Pushgateway{ + Address: "env:PUSHGATEWAY_ADDRESS", + Job: "env:PUSHGATEWAY_JOB", + }, + Certs: []certificates.Certificate{ + { + Name: "test_cert", + Path: "path/to/cert.pem", + Type: "pem", + Password: fmt.Sprintf("file:%s", passwordFileName), + Enabled: &trueVar, + }, + }, + }, + expectedError: "", + }, + { + name: "Auth error", + config: &Config{ + Pushgateway: Pushgateway{ + Auth: Auth{ + Basic: Basic{ + Password: "env:BASIC_PASSWORD", + }, + Bearer: Bearer{ + Token: "env:BEARER_TOKEN", + }, + }, + }, + }, + expectedError: "Both 'auth.basic' and 'auth.bearer' are defined", + }, + { + name: "missing_env_var", + config: &Config{ + Pushgateway: Pushgateway{ + Address: "env:INVALID_ENV", + }, + }, + expectedError: "Failed to resolve address for pushgateway: Environment variable 'INVALID_ENV' not found", + }, + { + name: "missing_file_var", + config: &Config{ + Certs: []certificates.Certificate{ + { + Name: "test_cert", + Enabled: &trueVar, + Path: "path/to/cert.pem", + Type: "pem", + Password: "file:INVALID_FILE", + }, + }, + }, + expectedError: "Certifacate 'test_cert' cannot resolve 'password'. Failed to read file 'INVALID_FILE': open INVALID_FILE: no such file or directory", + }, + { + name: "cert name not defined", + config: &Config{ + Certs: []certificates.Certificate{ + { + Enabled: &trueVar, + Path: "path/to/cert.pem", + Type: "pem", + }, + }, + }, + expectedError: "Certificate no '0' has no 'name' defined", + }, + { + name: "cert path not defined", + config: &Config{ + Certs: []certificates.Certificate{ + { + + Name: "test_cert", + Enabled: &trueVar, + Type: "pem", + }, + }, + }, + expectedError: "Certificate 'test_cert' has no 'path' defined", + }, + { + name: "cert type not defined", + config: &Config{ + Certs: []certificates.Certificate{ + { + Name: "test_cert", + Enabled: &trueVar, + Path: "path/to/cert", + }, + }, + }, + expectedError: "Certificate 'test_cert' has no 'type' defined. Type can't be inferred due to the missing file extension.", + }, + { + name: "cert type invalid", + config: &Config{ + Certs: []certificates.Certificate{ + { + Name: "test_cert", + Enabled: &trueVar, + Path: "path/to/cert.invalid", + Type: "invalid", + }, + }, + }, + expectedError: fmt.Sprintf("Certificate 'test_cert' has an invalid 'type'. Must be one of: %s", strings.Join(certificates.ValidTypes, ", ")), + }, + { + name: "cert type guessed invalid", + config: &Config{ + Certs: []certificates.Certificate{ + { + Name: "test_cert", + Enabled: &trueVar, + Path: "path/to/cert.invalid", + }, + }, + }, + expectedError: "Certificate 'test_cert' has no 'type' defined. Type can't be inferred due to the unclear file extension (.invalid).", + }, + { + name: "cert type guessed p12", + config: &Config{ + Certs: []certificates.Certificate{ + { + Name: "test_cert", + Enabled: &trueVar, + Path: "path/to/cert.p12", + }, + }, + }, + expectedError: "", + }, + } + + for _, testCase := range testCases { + t.Run(testCase.name, func(t *testing.T) { + setEnvVars(envs) + + fmt.Println("test name:", testCase.name) + err := ParseConfig(testCase.config) + + unsetEnvVars(envs) + + if testCase.expectedError == "" && err != nil { + t.Errorf("Test case '%s': unexpected error: %v", testCase.name, err) + } + if testCase.expectedError != "" { + if err == nil { + t.Errorf("Test case '%s': expected error, but got none", testCase.name) + } else if err.Error() != testCase.expectedError { + t.Errorf("Test case '%s': expected error '%s', but got '%s'", testCase.name, testCase.expectedError, err.Error()) + } + } + // if reached here, we have no error, so we can continue with the next test case + }) + } +} diff --git a/internal/config/read.go b/internal/config/read.go new file mode 100644 index 0000000..0258e9e --- /dev/null +++ b/internal/config/read.go @@ -0,0 +1,22 @@ +package config + +import ( + "fmt" + + "github.com/spf13/viper" +) + +// ReadConfigFile reads the config file and unmarshals it into the Config struct +func ReadConfigFile(configPath string, destination interface{}) error { + viper.SetConfigFile(configPath) + + if err := viper.ReadInConfig(); err != nil { + return fmt.Errorf("Failed to read config file: %v", err) + } + + if err := viper.Unmarshal(destination); err != nil { + return fmt.Errorf("Failed to unmarshal config file: %v", err) + } + + return nil +} diff --git a/internal/config/read_test.go b/internal/config/read_test.go new file mode 100644 index 0000000..65d9e14 --- /dev/null +++ b/internal/config/read_test.go @@ -0,0 +1,42 @@ +package config + +import ( + "os" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestReadConfigFile(t *testing.T) { + // Define your config structure, for example: + type Config struct { + Key string + Nested struct { + Key string + } + } + + // Temporarily create a config file + tempFile, err := os.CreateTemp(os.TempDir(), "*.yaml") + require.NoError(t, err, "Failed to create temp file.") + + defer os.Remove(tempFile.Name()) // clean up + + tempFileName := tempFile.Name() + + content := []byte("key: value\nnested:\n key: nested value\n") + _, err = tempFile.Write(content) + require.NoError(t, err, "Failed to write to temp file.") + tempFile.Close() + + var cfg Config + + // Call the function under test + err = ReadConfigFile(tempFileName, &cfg) + require.NoError(t, err, "Failed to read config file.") + + // Check the values in the returned config + require.Equal(t, "value", cfg.Key) + require.Equal(t, "nested value", cfg.Nested.Key) + +} diff --git a/internal/config/structs.go b/internal/config/structs.go new file mode 100644 index 0000000..86dbcd5 --- /dev/null +++ b/internal/config/structs.go @@ -0,0 +1,44 @@ +package config + +import "certalert/internal/certificates" + +// Config represents the config file +var App Config + +// Config represents the config file +type Config struct { + Server Server `yaml:"server"` + Pushgateway Pushgateway `yaml:"pushgateway"` + Certs []certificates.Certificate `yaml:"certs"` +} + +// Server represents the server config +type Server struct { + Hostname string `yaml:"hostname"` + Port int `yaml:"port"` +} + +// Pushgateway represents the pushgateway config +type Pushgateway struct { + Address string `yaml:"address"` + SkipVerify bool `yaml:"skip_verify"` + Job string `yaml:"job"` + Auth Auth `yaml:"auth"` +} + +// Auth represents the pushgateway auth config +type Auth struct { + Basic Basic `yaml:"basic,omitempty"` + Bearer Bearer `yaml:"bearer,omitempty"` +} + +// Basic represents the pushgateway basic auth config +type Basic struct { + Password string `yaml:"password"` + Username string `yaml:"username"` +} + +// Bearer represents the pushgateway bearer auth config +type Bearer struct { + Token string `yaml:"token"` +} diff --git a/internal/handlers/config.go b/internal/handlers/config.go new file mode 100644 index 0000000..1338b72 --- /dev/null +++ b/internal/handlers/config.go @@ -0,0 +1,45 @@ +package handlers + +import ( + "bytes" + "certalert/internal/config" + "net/http" + "strings" + + "gopkg.in/yaml.v3" +) + +// redactVariable redacts sensitive data from the config if it is not prefixed with env: or file: +func redactVariable(s string) string { + if strings.HasPrefix(s, "env:") || strings.HasPrefix(s, "file:") { + return s + } + return "" +} + +// ConfigHandler returns the config as yaml +func ConfigHandler(w http.ResponseWriter, r *http.Request) { + var b bytes.Buffer + yamlEncoder := yaml.NewEncoder(&b) + defer yamlEncoder.Close() + yamlEncoder.SetIndent(2) + + // copy config and remove sensitive data + configCopy := config.App + + configCopy.Pushgateway.Address = redactVariable(configCopy.Pushgateway.Address) + configCopy.Pushgateway.Auth.Basic.Username = redactVariable(configCopy.Pushgateway.Auth.Basic.Username) + configCopy.Pushgateway.Auth.Basic.Password = redactVariable(configCopy.Pushgateway.Auth.Basic.Password) + configCopy.Pushgateway.Auth.Bearer.Token = redactVariable(configCopy.Pushgateway.Auth.Bearer.Token) + + for idx, cert := range configCopy.Certs { + configCopy.Certs[idx].Password = redactVariable(cert.Password) + } + + if err := yamlEncoder.Encode(&config.App); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Header().Set("Content-Type", "text/plain") + w.Write(b.Bytes()) +} diff --git a/internal/handlers/home.go b/internal/handlers/home.go new file mode 100644 index 0000000..d46ea09 --- /dev/null +++ b/internal/handlers/home.go @@ -0,0 +1,20 @@ +package handlers + +import ( + "certalert/internal/certificates" + "certalert/internal/config" + "net/http" +) + +func HomeHandler(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/html") + + certificatesInfo, err := certificates.Process(config.App.Certs) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + w.Write([]byte(renderCertificateInfo(certificatesInfo))) + +} diff --git a/internal/handlers/metrics.go b/internal/handlers/metrics.go new file mode 100644 index 0000000..d10eca9 --- /dev/null +++ b/internal/handlers/metrics.go @@ -0,0 +1,32 @@ +package handlers + +import ( + "certalert/internal/certificates" + "certalert/internal/config" + "certalert/internal/metrics" + "net/http" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promhttp" +) + +func MetricsHandler(w http.ResponseWriter, r *http.Request) { + certificateInfos, err := certificates.Process(config.App.Certs) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + for _, ci := range certificateInfos { + metrics.PromMetrics.CertificateEpoch.With( + prometheus.Labels{ + "instance": ci.Name, + "subject": ci.Subject, + "type": ci.Type, + }, + ).Set(float64(ci.Epoch)) + } + + // Serve metrics + promhttp.HandlerFor(metrics.PromMetrics.Registry, promhttp.HandlerOpts{}).ServeHTTP(w, r) +} diff --git a/internal/handlers/utils.go b/internal/handlers/utils.go new file mode 100644 index 0000000..2d70046 --- /dev/null +++ b/internal/handlers/utils.go @@ -0,0 +1,77 @@ +package handlers + +import ( + "bytes" + "certalert/internal/certificates" + "log" + "text/template" +) + +const tpl = ` + + + + + + + + + + + + + + + + + {{range .}} + + + + + + + {{end}} + +
NameSubjectTypeExpiry Date
{{.Name}}{{.Subject}}{{.Type}}{{.ExpiryAsTime.Format "2006-01-02"}}
+ + + +` + +// renderCertificateInfo renders the certificate information as HTML +func renderCertificateInfo(certInfo []certificates.CertificateInfo) string { + t, err := template.New("certInfo").Parse(tpl) + if err != nil { + log.Fatal(err) + } + + var buf bytes.Buffer + if err := t.Execute(&buf, certInfo); err != nil { + log.Fatal(err) + } + + return buf.String() +} diff --git a/internal/metrics/metrics.go b/internal/metrics/metrics.go new file mode 100644 index 0000000..512a10c --- /dev/null +++ b/internal/metrics/metrics.go @@ -0,0 +1,35 @@ +package metrics + +import ( + "github.com/prometheus/client_golang/prometheus" +) + +var PromMetrics Metrics + +const ( + CertalertMetricName = "certalert_certificate_epoch_seconds" + CertalertMetricHelp = "The epoch of the certificate" +) + +// Metrics holds all prometheus metrics and the custom registry +type Metrics struct { + Registry *prometheus.Registry + CertificateEpoch *prometheus.GaugeVec +} + +// NewMetrics registers all prometheus metrics +func NewMetrics() *Metrics { + reg := prometheus.NewRegistry() // Create a new registry + m := &Metrics{ + Registry: reg, // Store the registry in the Metrics struct + CertificateEpoch: prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Name: CertalertMetricName, + Help: CertalertMetricHelp, + }, + []string{"name", "subject", "type"}, + ), + } + reg.Register(m.CertificateEpoch) + return m +} diff --git a/internal/pushgateway/pushgateway.go b/internal/pushgateway/pushgateway.go new file mode 100644 index 0000000..20e6f34 --- /dev/null +++ b/internal/pushgateway/pushgateway.go @@ -0,0 +1,24 @@ +package pushgateway + +import ( + "certalert/internal/certificates" + "certalert/internal/config" + "fmt" +) + +// Send pushes the certificate information to the Pushgateway +func Send(address, jobName string, auth config.Auth, certs []certificates.Certificate) error { + pusher := createPusher(address, jobName, auth) + + certificatesInfo, err := certificates.Process(certs) + if err != nil { + return fmt.Errorf("Failed to process certificates: %w", err) + } + + for _, certificateInfo := range certificatesInfo { + if err := pushToGateway(pusher, certificateInfo); err != nil { + return fmt.Errorf("Failed to push certificate info to gateway: %w", err) + } + } + return nil +} diff --git a/internal/pushgateway/utils.go b/internal/pushgateway/utils.go new file mode 100644 index 0000000..98696f7 --- /dev/null +++ b/internal/pushgateway/utils.go @@ -0,0 +1,47 @@ +package pushgateway + +import ( + "certalert/internal/certificates" + "certalert/internal/config" + "certalert/internal/metrics" + "fmt" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/push" +) + +// createPusher creates a new pusher with the necessary configuration +func createPusher(address, job string, auth config.Auth) *push.Pusher { + certificateExpirationEpoch := prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Name: metrics.CertalertMetricName, + Help: metrics.CertalertMetricHelp, + }, + []string{}, + ) + + pusher := push.New(address, job). + Collector(certificateExpirationEpoch) + + if auth.Bearer.Token != "" { + pusher = pusher.BasicAuth("Bearer", auth.Bearer.Token) + } else if auth.Basic.Username != "" { + pusher = pusher.BasicAuth(auth.Basic.Username, auth.Basic.Password) + } + + return pusher +} + +// pushToGateway pushes the certificate information to the Pushgateway +func pushToGateway(pusher *push.Pusher, cert certificates.CertificateInfo) error { + pusher = pusher. + Grouping("instance", cert.Name). + Grouping("type", cert.Type). + Grouping("subject", cert.Subject) + + if err := pusher.Push(); err != nil { + return fmt.Errorf("Could not push to Pushgateway: %w", err) + } + + return nil +} diff --git a/internal/server/server.go b/internal/server/server.go new file mode 100644 index 0000000..f4a6d9b --- /dev/null +++ b/internal/server/server.go @@ -0,0 +1,85 @@ +package server + +import ( + "certalert/internal/handlers" + "certalert/internal/metrics" + "context" + "fmt" + + "net/http" + "os" + "os/signal" + "syscall" + "time" + + "github.com/gorilla/mux" + + log "github.com/sirupsen/logrus" +) + +// NewRouter generates the router used in the HTTP Server +func NewRouter() *mux.Router { + // Create router and define routes and return that router + router := mux.NewRouter() + + metrics.PromMetrics = *metrics.NewMetrics() + + //register handlers + router.HandleFunc("/", handlers.HomeHandler).Methods("GET", "POST") + router.HandleFunc("/config", handlers.ConfigHandler).Methods("GET", "POST") + router.Handle("/metrics", http.HandlerFunc(handlers.MetricsHandler)).Methods("GET", "POST") + + return router +} + +// Run will run the HTTP Server +func RunServer(hostname string, port int) { + + // Set up a channel to listen to for interrupt signals + var runChan = make(chan os.Signal, 1) + + // Set up a context to allow for graceful server shutdowns in the event + // of an OS interrupt (defers the cancel just in case) + ctx, cancel := context.WithTimeout( + context.Background(), + 30*time.Second, + ) + defer cancel() + + // Define server options + server := &http.Server{ + Addr: fmt.Sprintf("%s:%d", hostname, port), + Handler: NewRouter(), + ReadTimeout: 15 * time.Second, + WriteTimeout: 10 * time.Second, + IdleTimeout: 5 * time.Second, + } + + // Handle ctrl+c/ctrl+x interrupt + signal.Notify(runChan, os.Interrupt, syscall.SIGTSTP) + + // Alert the user that the server is starting + log.Infof("Server is starting on %s", server.Addr) + + // Run the server on a new goroutine + go func() { + if err := server.ListenAndServe(); err != nil { + if err == http.ErrServerClosed { + // Normal interrupt operation, ignore + } else { + log.Fatalf("Server failed to start due to err: %v", err) + } + } + }() + + // Block on this channel listeninf for those previously defined syscalls assign + // to variable so we can let the user know why the server is shutting down + interrupt := <-runChan + + // If we get one of the pre-prescribed syscalls, gracefully terminate the server + // while alerting the user + log.Infof("Server is shutting down due to %+v", interrupt) + if err := server.Shutdown(ctx); err != nil { + log.Fatalf("Server was unable to gracefully shutdown due to err: %+v", err) + } +} diff --git a/internal/utils/utils.go b/internal/utils/utils.go new file mode 100644 index 0000000..65846f7 --- /dev/null +++ b/internal/utils/utils.go @@ -0,0 +1,69 @@ +package utils + +import ( + "bufio" + "fmt" + "os" + "strings" +) + +// ResolveVariable resolves the value of a variable that is prefixed with env: or file: +func ResolveVariable(value string) (string, error) { + if strings.HasPrefix(value, "env:") { + envVar := value[4:] + + resolvedVariable, found := os.LookupEnv(envVar) + if !found { + return "", fmt.Errorf("Environment variable '%s' not found", envVar) + } + + return resolvedVariable, nil + } + + if strings.HasPrefix(value, "file:") { + filePathWithKey := value[5:] + lastSeparatorIndex := strings.LastIndex(filePathWithKey, ":") + if lastSeparatorIndex == -1 || lastSeparatorIndex+1 == len(filePathWithKey) { + return "", fmt.Errorf("Invalid format for file: expected 'file:path/to/file:{key}', got '%s'", value) + } + + filePath := filePathWithKey[:lastSeparatorIndex] + key := strings.Trim(filePathWithKey[lastSeparatorIndex+1:], "{}") + + file, err := os.Open(filePath) + if err != nil { + return "", fmt.Errorf("Failed to open file '%s': %v", filePath, err) + } + defer file.Close() + + scanner := bufio.NewScanner(file) + for scanner.Scan() { + line := scanner.Text() + // Split each line into key-value pairs + pair := strings.SplitN(line, "=", 2) + if len(pair) == 2 && strings.TrimSpace(pair[0]) == key { + // If the key matches the requested key, return the associated value + return strings.TrimSpace(pair[1]), nil + } + } + + if err := scanner.Err(); err != nil { + return "", fmt.Errorf("Failed to read file '%s': %v", filePath, err) + } + + return "", fmt.Errorf("Key '%s' not found in file", key) + } + + // if the value is not prefixed with env: or file: then just return the value + return value, nil +} + +// IsInList checks if a value is in a list +func IsInList(value string, list []string) bool { + for _, v := range list { + if value == v { + return true + } + } + return false +} diff --git a/internal/utils/utils_test.go b/internal/utils/utils_test.go new file mode 100644 index 0000000..6ed4d1e --- /dev/null +++ b/internal/utils/utils_test.go @@ -0,0 +1,105 @@ +package utils + +import ( + "os" + "testing" +) + +func TestResolveVariable(t *testing.T) { + t.Run("with env var", func(t *testing.T) { + err := os.Setenv("TEST_VAR", "test-value") + if err != nil { + t.Fatalf("Failed to set environment variable: %v", err) + } + + result, err := ResolveVariable("env:TEST_VAR") + if err != nil { + t.Fatalf("Failed to resolve variable: %v", err) + } + + if result != "test-value" { + t.Fatalf("Expected 'test-value', got '%s'", result) + } + }) + + t.Run("with file", func(t *testing.T) { + tmpfile, err := os.CreateTemp("", "example") + if err != nil { + t.Fatalf("Failed to create temp file: %v", err) + } + + defer os.Remove(tmpfile.Name()) // clean up + + if _, err := tmpfile.Write([]byte("file-test-value")); err != nil { + t.Fatalf("Failed to write to temp file: %v", err) + } + + result, err := ResolveVariable("file:" + tmpfile.Name()) + if err != nil { + t.Fatalf("Failed to resolve variable: %v", err) + } + + if result != "file-test-value" { + t.Fatalf("Expected 'file-test-value', got '%s'", result) + } + }) + + t.Run("with file and key", func(t *testing.T) { + tmpfile, err := os.CreateTemp("", "example") + if err != nil { + t.Fatalf("Failed to create temp file: %v", err) + } + + defer os.Remove(tmpfile.Name()) // clean up + + if _, err := tmpfile.Write([]byte("key1 = value 1\nkey2=value 2\nkey3 = value 3")); err != nil { + t.Fatalf("Failed to write to temp file: %v", err) + } + + result, err := ResolveVariable("file:" + tmpfile.Name() + ":{key2}") + if err != nil { + t.Fatalf("Failed to resolve variable: %v", err) + } + + if result != "value 2" { + t.Fatalf("Expected 'value 2', got '%s'", result) + } + }) + + t.Run("without prefix", func(t *testing.T) { + result, err := ResolveVariable("no-prefix-value") + if err != nil { + t.Fatalf("Failed to resolve variable: %v", err) + } + + if result != "no-prefix-value" { + t.Fatalf("Expected 'no-prefix-value', got '%s'", result) + } + }) + + t.Run("with non-existent env var", func(t *testing.T) { + _, err := ResolveVariable("env:NON_EXISTENT_VAR") + if err == nil { + t.Fatal("Expected error for non-existent environment variable, got nil") + } + }) + + t.Run("with non-existent file", func(t *testing.T) { + _, err := ResolveVariable("file:/path/to/non/existent/file") + if err == nil { + t.Fatal("Expected error for non-existent file, got nil") + } + }) +} + +func TestIsInList(t *testing.T) { + list := []string{"one", "two", "three"} + + if !IsInList("one", list) { + t.Fatalf("'one' should be in list") + } + + if IsInList("four", list) { + t.Fatalf("'four' should not be in list") + } +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..ac25b6f --- /dev/null +++ b/main.go @@ -0,0 +1,22 @@ +/* +Copyright © 2023 gi8lino gi8©containeroo.ch + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package main + +import "certalert/cmd" + +func main() { + cmd.Execute() +} diff --git a/tests/certs/jks/broken_certificate.jks b/tests/certs/jks/broken_certificate.jks new file mode 100644 index 0000000..86a410d --- /dev/null +++ b/tests/certs/jks/broken_certificate.jks @@ -0,0 +1 @@ +broken \ No newline at end of file diff --git a/tests/certs/jks/certificate_broken.jks b/tests/certs/jks/certificate_broken.jks new file mode 100644 index 0000000..86a410d --- /dev/null +++ b/tests/certs/jks/certificate_broken.jks @@ -0,0 +1 @@ +broken \ No newline at end of file diff --git a/tests/certs/jks/chain.jks b/tests/certs/jks/chain.jks new file mode 100644 index 0000000000000000000000000000000000000000..ed4fbe465ea64013ad820b550d7312b6e464228f GIT binary patch literal 8155 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 literal 0 HcmV?d00001 diff --git a/tests/certs/jks/intermediate.jks b/tests/certs/jks/intermediate.jks new file mode 100644 index 0000000000000000000000000000000000000000..05d9e92f6d75f22506d25578bcd922231e633466 GIT binary patch literal 2080 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 wk}oH0GUg!AElq0wVm}T9KP^;D*g*2c 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 literal 0 HcmV?d00001 diff --git a/tests/certs/kustomization.yaml b/tests/certs/kustomization.yaml new file mode 100644 index 0000000..89b1ae1 --- /dev/null +++ b/tests/certs/kustomization.yaml @@ -0,0 +1,7 @@ +--- +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: + - jks + - p12 + - pem diff --git a/tests/certs/p12/broken_certificate.p12 b/tests/certs/p12/broken_certificate.p12 new file mode 100644 index 0000000..57f89ed --- /dev/null +++ b/tests/certs/p12/broken_certificate.p12 @@ -0,0 +1 @@ +broken diff --git a/tests/certs/p12/chain.crt b/tests/certs/p12/chain.crt new file mode 100644 index 0000000..d969474 --- /dev/null +++ b/tests/certs/p12/chain.crt @@ -0,0 +1,57 @@ +-----BEGIN CERTIFICATE----- +MIIDATCCAemgAwIBAgIUag+bm8dPIlkiSwj7JQoamt5+R2QwDQYJKoZIhvcNAQEL +BQAwEDEOMAwGA1UEAwwFY2hhaW4wHhcNMjMwODA0MTIzMDEyWhcNMjQwODAzMTIz +MDEyWjAQMQ4wDAYDVQQDDAVjaGFpbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAMA0f1RtlSO25bApdfp9VrxMT6D7a+OJ7Fx1AV9qH4BfaijYty0qqgt9 +dq0K9IHPga0UHMJf5Lbb+ItMmIArsKTM86JojQHFuJ/BRQGCUsBDSek1Q2MpqIPy +NN2eXzLGMVPvMPqK2RQ0dJpREsbPItERufEY8BuJGTNDF0Wk20kDNUi1SsjlvUZT +FEGTiAQCgDFpdzStsqZy4YYC/GXdWWApERzF5opvvrqtXs+c6OFavEh0q/VMQZvF +Vq9PM+Qqx7xoIrOLoSAcxQ9crvjB7950ZV1p8mZS8J+qvbNmJzF2XzxP816Eov3g +DTSO94OQFssypx96Kt+zlT/o60d5QtsCAwEAAaNTMFEwHQYDVR0OBBYEFKLXDIx9 +hEZaAPl8toKYmjc3AMIcMB8GA1UdIwQYMBaAFKLXDIx9hEZaAPl8toKYmjc3AMIc +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBALqW1Sojttg56ltu +yAmUhGBiB84KHqQfLuQlvS3Dim1FYFlZQuFhIOuxwZEh8zjIHOOnb72DCuskGJCm +JFA0DDS1P1rny8ISSUo1caYOi0QovdoXYqSHg0WtmaJFDkTxmCmREZSRallzlRMt +SYzafPWJD3GEEJEl7uWx2JgwXGVRU7aWNHhH1bzPmofLyBiDIC2Do8BlLEmLIB59 +rG++v6POO5Wmi3EPkR+pT0BNEoXF8erPc3eWHh3d4p1r/jfmvdl1mf2rllL9tksz +u/VlBJb6dUqEhYu/Ua+/McNrgk9aoU5KfWS7ofG2nKqOVslq4zRRygqPeFK+BoWP +QLSbh18= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDDzCCAfegAwIBAgIUWfFeCHA6zNY6e/j/EIYJh0BXpEAwDQYJKoZIhvcNAQEL +BQAwFzEVMBMGA1UEAwwMaW50ZXJtZWRpYXRlMB4XDTIzMDgwNDEyMzAxMloXDTI0 +MDgwMzEyMzAxMlowFzEVMBMGA1UEAwwMaW50ZXJtZWRpYXRlMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAor+IppEu7oM6uG39BWzw9h/XOQot7t+Qbg2n +RhbCB5c2tGcMFHFqJlz2U+peMJAA326f5W8NMTPFt6DRgqR89aiezJ+WVqGqw4ve +d9nSpCXjgZhoJLtAfnfUWOsrJWeCVYg9Qek9Y/5IovnwBOkAnKEzzZZMDnP9HAp4 +WG/mTK8cUa1hGkvCDGO+OJtX18MGn2mU7rYAwCGTpCsjGOzZdQNQIZpkMNrMU44i +FQSslnRCJ58xTpHKF7HS3awpWEpraNyhY3BeHvNjgDmM9l2r+QKaOsde5MbMqvbS +Xc1c4tBSNfuuhMHm4cz6HJ2cnhkRBDwXmGCyFaULHtdDv6sfewIDAQABo1MwUTAd +BgNVHQ4EFgQUJjguBfLQXOP4Ifzu8Kyas0pmjz4wHwYDVR0jBBgwFoAUJjguBfLQ +XOP4Ifzu8Kyas0pmjz4wDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC +AQEAhY7Ac2j+7IQg9CjRZkQQZf3jJmxNsNTvBOk6UCDMr7d6pLi9jyL20ThfMi6e +kF8xBBjX4qPCx2mnd+hsW3IqEQa0QLPwp2ZLJ3me9N+6mXBpMx+R0ZDc10trDW9g +6FVDf79kLR0nAy42ZH9xfUSJjR5ZVPhJpmjKwwWz5V0bMWkzOzQ1TLynf1oyk/2x +hj49wKZnGVUc1xCGJyDm2XgLOAQ03jN4ZQnH/BcImt4t7q1u2pKy21jIZG/CUU1V +pMWc8eY6HQa+wdoCI08HMyNs821LBnkYFiKnA+abYp3t36TxMxwfsN+syyZJXQ0g +8x92P2huQRdxa+sWiruCuO0BtQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC/zCCAeegAwIBAgIUWnP8mck4g50Eb0+Pg4Eyjn/o5AEwDQYJKoZIhvcNAQEL +BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yMzA4MDQxMjMwMTNaFw0yNDA4MDMxMjMw +MTNaMA8xDTALBgNVBAMMBHJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCe2FJBKTUCXmcrzYaOYAo6NTSPeyrs7B5kV9f9z/zPR6rPLpAnfW5drjlr +aMnkIKDj8uCJ6TgHZDOSHYlZ8liDTuRk/7JTjgQIfBsPF8VhZ12djEkHjfDZ4Wen +AlnBS+WQQLdW/3Y5VcL+QoBmhIxP5CyDaedauGnjmREG60/ASa4pwM4SQJetDT0/ +uLNp44EXSSAaAFMYF+EqU6xufyaS25F0ZH88Y5gqqKrNdfUpKTytbCC5H/NSJZEo +BVuoMPRo3qds4jauY0ccRZ9llzaF4N78/7A0RWzJCgFtPdN18owWqYOR6DLHFPxD +lvOmF2hpIKaJBQUlS+JEFzRaAss5AgMBAAGjUzBRMB0GA1UdDgQWBBQpIw/jvCJY +Tf6oQwVUgRh20EDFFDAfBgNVHSMEGDAWgBQpIw/jvCJYTf6oQwVUgRh20EDFFDAP +BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAN4JZaY/SrKZ55plk4 +6EhXx1/u071cUm3Yl7GQ9KVZW9zIESwpc/qz8JOUV2sB1wDWKW84m3BnjXo7sXfB +EjjWaC6sg8h0NtanUDBFdy7HuJ3eSSODZbeP6BeSB51CyRdfX2HXodsFduyeq/Bz +kl5Cvfm5oIfIYASAjdu4pBsLsf4ORV6jiYGyiCdEf0KERWc7tvuWH2pTSdrqzy6q +Z6xiUAm1OFGX2CLmvrFvXwUKuOozTuK5wNsnijYu6A+gOtOEOOf1KkhpmpvQLZp7 +NbeLWO6U8/3znInPFyQSrTVsGtwhRzob9uX2UYNTC7ZTc2LYXbGIwoSGnkfpXiBV +aOZ5 +-----END CERTIFICATE----- diff --git a/tests/certs/p12/chain_certificate.p12 b/tests/certs/p12/chain_certificate.p12 new file mode 100644 index 0000000000000000000000000000000000000000..b201883d5ccab3f346be21119af50b79daf21530 GIT binary patch literal 4979 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 literal 0 HcmV?d00001 diff --git a/tests/certs/p12/chain_private_key.key b/tests/certs/p12/chain_private_key.key new file mode 100644 index 0000000..860c186 --- /dev/null +++ b/tests/certs/p12/chain_private_key.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDANH9UbZUjtuWw +KXX6fVa8TE+g+2vjiexcdQFfah+AX2oo2LctKqoLfXatCvSBz4GtFBzCX+S22/iL +TJiAK7CkzPOiaI0BxbifwUUBglLAQ0npNUNjKaiD8jTdnl8yxjFT7zD6itkUNHSa +URLGzyLREbnxGPAbiRkzQxdFpNtJAzVItUrI5b1GUxRBk4gEAoAxaXc0rbKmcuGG +Avxl3VlgKREcxeaKb766rV7PnOjhWrxIdKv1TEGbxVavTzPkKse8aCKzi6EgHMUP +XK74we/edGVdafJmUvCfqr2zZicxdl88T/NehKL94A00jveDkBbLMqcfeirfs5U/ +6OtHeULbAgMBAAECgf825ByVjkRe0k7GcmYisaj3OilKs9hU6mQkdUXvFl+v2AHO +xPkZe06jFdxc5FJFMhpIcCCqDPG2Y8aXj/MZ/O51sIRVpKKgiZ4wc3N6iRLgDpBi +e35Rfj7a/hga+cpvJ4BEP2ChEFuZMLc4sGBzgyY1cqGnx3d1uwcFnM4lFZpuIqdp +Uc3lVcl6JfSvprl9Vn+B4V7k/Cy/nVbRXSINceX+TFLVNE/+Ack7ixq29IDtnDO3 +PqfLqCLsswgbR/5BqCpEISZXN8iiygr3JOM47CYxt7Q7okJA5xIkrnqU6dGMlCEx +7keCUBb4nA2PBVUJ+xaRtZUUV3Pb9USw6imj/YECgYEA+wianqwTx8kahw5WokXz +pr0JWQUOK0t5iY0G7hL+8MC18fbo1Rm521KS28yuGjQvp4N+XmSbjkFoEBL1nHwN +bIjm18ktV0cXt+KWJZ5AzBWsgQUFdGdpKLxdJaLYmUtemnZW+IZozvPqRdHQEmte +mM2HqDUQIHipvHqjF4f2HTsCgYEAxAHyn0wvqkfB7eCTxoN7DPaNSWG7r/jkBxc0 +QJxShQuymHbiZS1zvyneMfZGW+yTSCabhQ81N+5kbpXOvNGbfbUyafMyRz9H7Vpr +O9CqPv+3ITYjvjIXuI3MlTKVfX7E21phiBaeZn9XWRUQlxLRVrct93wwJ0SH2A3G +VtyLluECgYEAjxXBZA27HJYxC6gNk2MB1RlMubPa9qyHcvKyb4LeU4XUbz2ISubl ++/AeCzCoUAFM5FNb9RutWrFHSlo0KuS+lg2WXoqp0GSSTVrWsEx6rJjyAXxGNqo2 +02RCR5CBmybNnoczXWbnWIbJEtDbo5QVkE0eNK9CKO/995ODYIc7rj8CgYEAoj3W +fWMLpVAmRud4in30kcNXKaGbQMqsvO3JE54RdA09tJPbS9J2l4ppYEOw84/8TWGf +o2D2NSi/uwWHjaWWplQgubBTMsQ/nkkUr/tFoEX8aKIurdU660l8SRcIxEr1WXgT +eRj33nGTdKpKBDLQUo3nn44NMcO5Ce5E+UsuxCECgYEAnGCqGdP1UtPXUmwB5BOx +TjILKaLd5Edlos0cYvSjDN20nfYPd/Ra0UTM0K3fhCl/6zLteS0LrmPuUqvs74Ie +KMSsPTGe06P4oio/ffftcDAcA32yj8TZyDFrcw4icbYZocqgcmpGDsyOl9AQMUDx +hBUPcZzoBS+SC03xmF1jv3w= +-----END PRIVATE KEY----- diff --git a/tests/certs/p12/chain_self_signed_certificate.crt b/tests/certs/p12/chain_self_signed_certificate.crt new file mode 100644 index 0000000..9555e34 --- /dev/null +++ b/tests/certs/p12/chain_self_signed_certificate.crt @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDATCCAemgAwIBAgIUag+bm8dPIlkiSwj7JQoamt5+R2QwDQYJKoZIhvcNAQEL +BQAwEDEOMAwGA1UEAwwFY2hhaW4wHhcNMjMwODA0MTIzMDEyWhcNMjQwODAzMTIz +MDEyWjAQMQ4wDAYDVQQDDAVjaGFpbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAMA0f1RtlSO25bApdfp9VrxMT6D7a+OJ7Fx1AV9qH4BfaijYty0qqgt9 +dq0K9IHPga0UHMJf5Lbb+ItMmIArsKTM86JojQHFuJ/BRQGCUsBDSek1Q2MpqIPy +NN2eXzLGMVPvMPqK2RQ0dJpREsbPItERufEY8BuJGTNDF0Wk20kDNUi1SsjlvUZT +FEGTiAQCgDFpdzStsqZy4YYC/GXdWWApERzF5opvvrqtXs+c6OFavEh0q/VMQZvF +Vq9PM+Qqx7xoIrOLoSAcxQ9crvjB7950ZV1p8mZS8J+qvbNmJzF2XzxP816Eov3g +DTSO94OQFssypx96Kt+zlT/o60d5QtsCAwEAAaNTMFEwHQYDVR0OBBYEFKLXDIx9 +hEZaAPl8toKYmjc3AMIcMB8GA1UdIwQYMBaAFKLXDIx9hEZaAPl8toKYmjc3AMIc +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBALqW1Sojttg56ltu +yAmUhGBiB84KHqQfLuQlvS3Dim1FYFlZQuFhIOuxwZEh8zjIHOOnb72DCuskGJCm +JFA0DDS1P1rny8ISSUo1caYOi0QovdoXYqSHg0WtmaJFDkTxmCmREZSRallzlRMt +SYzafPWJD3GEEJEl7uWx2JgwXGVRU7aWNHhH1bzPmofLyBiDIC2Do8BlLEmLIB59 +rG++v6POO5Wmi3EPkR+pT0BNEoXF8erPc3eWHh3d4p1r/jfmvdl1mf2rllL9tksz +u/VlBJb6dUqEhYu/Ua+/McNrgk9aoU5KfWS7ofG2nKqOVslq4zRRygqPeFK+BoWP +QLSbh18= +-----END CERTIFICATE----- diff --git a/tests/certs/p12/intermediate_certificate.p12 b/tests/certs/p12/intermediate_certificate.p12 new file mode 100644 index 0000000000000000000000000000000000000000..92e4054cd58c3537607cb6b13fe54f44e1461a37 GIT binary patch literal 2531 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 literal 0 HcmV?d00001 diff --git a/tests/certs/p12/intermediate_private_key.key b/tests/certs/p12/intermediate_private_key.key new file mode 100644 index 0000000..bc8ea2c --- /dev/null +++ b/tests/certs/p12/intermediate_private_key.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCiv4imkS7ugzq4 +bf0FbPD2H9c5Ci3u35BuDadGFsIHlza0ZwwUcWomXPZT6l4wkADfbp/lbw0xM8W3 +oNGCpHz1qJ7Mn5ZWoarDi9532dKkJeOBmGgku0B+d9RY6yslZ4JViD1B6T1j/kii ++fAE6QCcoTPNlkwOc/0cCnhYb+ZMrxxRrWEaS8IMY744m1fXwwafaZTutgDAIZOk +KyMY7Nl1A1AhmmQw2sxTjiIVBKyWdEInnzFOkcoXsdLdrClYSmto3KFjcF4e82OA +OYz2Xav5Apo6x17kxsyq9tJdzVzi0FI1+66EwebhzPocnZyeGREEPBeYYLIVpQse +10O/qx97AgMBAAECggEABSI9baf6mz62y44XG9rIH2QM95RYZJV0oxt5dRnY/I/Z +jWALFPfZrAv4+E4RUI3FaUblrbd6/oN9CAITDYB6p7L8+xNJCyUoYl7jg923OMMc +lvFopvpuZAAfhObYB4CQm7UF8agVxqt7KbShuO6LbgL1nIaq9JjWD4Owa7CD8mdp +k/O1ePctWBPEBblFvuR0A98tEQ9YU2Iwgtkg61qtKGP3stRrUcoIX8L2Qhqfs0T/ +r7y+vMBvvM/gj2nN1HkMuM2P0AyvPL/1OYQgE3YLYNlwFK/lEJ8vArAEmFiLupOq +SGE3aedGsDQjEqxFwIPAs1FdlWG+SvNCJT+vY2g08QKBgQDPeuSR5f2H9hjT/Dqj +fHcDnAgsAS2zUlHn7727L9Moph9IqX2Fox8O1c1C0gEN0unmhe77TAaIkJyGk4tf +LHbQSrcAhQUOrkLoZiIgXgwt5+mkdahXo12wi9gWBmsq07xuHlgaw3fOAYjGgtLI +pJKIClk16tHyliE95fjDtcCrowKBgQDIzrMkrfi5nNZgT76u1JcQ1SrTjnuaz26n +/DMZm44WRqF90jDuSHyEi1B3whcpjiOjtz0ozZkrXnToZZymObhi4y/F6hCGSrcd +I9mYtigV6H5gxkH9RoErXAEJvUByWdVTR2VEcJHp2JKD5XfnIOE/xdb/Drw3QOlB +nA0pzT/6SQKBgQCcUeoeZprjMi64oMQJYwBETu31QZoODkq5pe5cNwcwDCFr3I8+ +/Yyr37f7zT+QC8XAsk5BNaGCiPn1hvqt5VFLU8+Xa6FI01CDyleR7WnduGpXR3Jj +PSmcl3Bh/8oEhWzlxqT43SbJpmxHrE9lbmEccDeQoPA3hpdbDIal5a1ZYwKBgCaL +ps+PpYLbnDr4k72ziRvuDz50xz08PB16x8ROm8Oi4zTnuATFXUGEDHowg4mygxzV ++6Ntc81jYEWL27n8smwo9+6hs3JTvTqWuxoZPTCXZErnQ5t+gST1kC1yaoCIxe4q +ckHk6d1deSJgVdfD8/jt3QswpOhmSWASuGQhxfohAoGATsX3vmGzt0anqbuKeCRy +8m9/HJJGd63A2yolQ0VJmwa6WusHgUGkNxACL+cmVX9NqXY4JlLAqCqN+Kyxw/Zr +fEZa/OHUP0kT55m4qytkz9l8s5+Jyv8E9se5QQSUOhWYMbfxjZV5vWxekLN16QQD +xsYyrRd2lOgfZ2HAi8wNZc8= +-----END PRIVATE KEY----- diff --git a/tests/certs/p12/intermediate_self_signed_certificate.crt b/tests/certs/p12/intermediate_self_signed_certificate.crt new file mode 100644 index 0000000..e5ac534 --- /dev/null +++ b/tests/certs/p12/intermediate_self_signed_certificate.crt @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDDzCCAfegAwIBAgIUWfFeCHA6zNY6e/j/EIYJh0BXpEAwDQYJKoZIhvcNAQEL +BQAwFzEVMBMGA1UEAwwMaW50ZXJtZWRpYXRlMB4XDTIzMDgwNDEyMzAxMloXDTI0 +MDgwMzEyMzAxMlowFzEVMBMGA1UEAwwMaW50ZXJtZWRpYXRlMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAor+IppEu7oM6uG39BWzw9h/XOQot7t+Qbg2n +RhbCB5c2tGcMFHFqJlz2U+peMJAA326f5W8NMTPFt6DRgqR89aiezJ+WVqGqw4ve +d9nSpCXjgZhoJLtAfnfUWOsrJWeCVYg9Qek9Y/5IovnwBOkAnKEzzZZMDnP9HAp4 +WG/mTK8cUa1hGkvCDGO+OJtX18MGn2mU7rYAwCGTpCsjGOzZdQNQIZpkMNrMU44i +FQSslnRCJ58xTpHKF7HS3awpWEpraNyhY3BeHvNjgDmM9l2r+QKaOsde5MbMqvbS +Xc1c4tBSNfuuhMHm4cz6HJ2cnhkRBDwXmGCyFaULHtdDv6sfewIDAQABo1MwUTAd +BgNVHQ4EFgQUJjguBfLQXOP4Ifzu8Kyas0pmjz4wHwYDVR0jBBgwFoAUJjguBfLQ +XOP4Ifzu8Kyas0pmjz4wDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC +AQEAhY7Ac2j+7IQg9CjRZkQQZf3jJmxNsNTvBOk6UCDMr7d6pLi9jyL20ThfMi6e +kF8xBBjX4qPCx2mnd+hsW3IqEQa0QLPwp2ZLJ3me9N+6mXBpMx+R0ZDc10trDW9g +6FVDf79kLR0nAy42ZH9xfUSJjR5ZVPhJpmjKwwWz5V0bMWkzOzQ1TLynf1oyk/2x +hj49wKZnGVUc1xCGJyDm2XgLOAQ03jN4ZQnH/BcImt4t7q1u2pKy21jIZG/CUU1V +pMWc8eY6HQa+wdoCI08HMyNs821LBnkYFiKnA+abYp3t36TxMxwfsN+syyZJXQ0g +8x92P2huQRdxa+sWiruCuO0BtQ== +-----END CERTIFICATE----- diff --git a/tests/certs/p12/kustomization.yaml b/tests/certs/p12/kustomization.yaml new file mode 100644 index 0000000..4a67e5e --- /dev/null +++ b/tests/certs/p12/kustomization.yaml @@ -0,0 +1,19 @@ +--- +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +configMapGenerator: + - name: p12-broken-certificate + files: + - broken_certificate.p12 + - name: p12-chain-certificate + files: + - chain_certificate.p12 + - name: p12-with-password-certificate + files: + - with_password_certificate.p12 + - name: p12-without-password-certificate + files: + - with_password_certificate.p12 + +generatorOptions: + disableNameSuffixHash: true diff --git a/tests/certs/p12/root_certificate.p12 b/tests/certs/p12/root_certificate.p12 new file mode 100644 index 0000000000000000000000000000000000000000..37c116f9134b2c92f9a310c891a876d02c3506bd GIT binary patch literal 2515 zcmai$X*3iL7sk!TOm>M;V{hym5VDS?7~|6+3zth@eOO^2sXYzRc_Lqf$CNc02A}Lp8GeSa{n=6k)zbA(7mb-HEUD zQY|L6h}Oqxb~voY!C>ygwET81x>)Fj8!ZGEhx$yID+^&U?(My#wNK=8Ex*<9Y9G4V zbA|iC+%8e_x=gWxQMog4M+TILLF^IFox(f}6b`jc?5H2^=L(5<;!AAUIG?tLqxScx zYkp&9VLCg;lFq3VnZCW#i_B3Jji54s%A3+q!zTtt{={j*)bV&{2-ZPc2KEkF_M@gE zxzO8=dvUaquTMMR_cN8-tsPXGP%)e_oCzq9ppSebRW7*@Ryi}hvHuOORNmjaG z6oh131@I{BgpkqtQsl*P?M;>$M{7kpXXR1P?ZsFX?WEGWk*nPBA2y{^Pq)8>6-VfS(ql-U4hrj86c^jT&p zzvf6o)TTuks?)bX6P?T+o6XIGnummD5|fPO>ltHDboC+uN{$GP@z{aKEw6NtN#AQP z7ULKzp+=*s1~spV&lgY;6^y-fS_pSp$8G!kn1trJavk21vzl&3d_7e`_baR4a84dJ zUV^vV9q~<_H?&hQ<46+-XuJf(>+C()(b%@HlcL5*jT@eenKjc+=?#=X>As9eo3sA_ z&$g*(%ZE{V&IkplUsee`Hk0V)8;7|uWtPk(9>@EjN3UK&>@+^|u;7EUCrQrbLtfW5 zYzIq8Yd22#@(DQzcv=PrN)AoM(VxYSOsg#7+`gMkjPvOi`JmtH%Q>oXc5@GAUf^R4 z^iEVIZWA;gDFoI!FhNiHUKHh|CXuhp92c`rx}c_r_X^?!6+%RBHs@DJtzA|usC?q{ z<;Y7}>g!$9E?sYQk687{?sJK5j{hNv0DuI8$&kQ(OxQ19PVWC_1J3~f za9>p4hpPW(_&EXej4}ox_^*b~(2Z2ih5(<9D9@BV~kLb?IN9GSlK?!vvy@$d~IpOA{5y!G;PmOWK}Lrj@o zgSRI-|>B$hJp z&Q(^7|6ZT}w1(N##Qbj;{$>G_KvBkwO10_aNda-rf%;|U z0OgcuBQs^S+n4Qg4`s0?_)z6x2aIo&skl%CVB!VR8R?Mj&3IE9h^ebvQ)92173E4m z9DxMOkdNMrP)sQqJUyOLX0zfM+a0!AJ&1_2%c)RGzolpCgU00)ci*)N6Lb=9vp$b)X+K@t8nr3wLQ3)P*I4P2;n z&$6`}xmVRFuDj}qvaK@dU44IWEX*gjL`C!9EKh_nx8sO=iQl4HSWCQh17#z9Z(}`l z*5q+5HRMNHG&}jz2`J$Qaan7xQmN(V`Vo8>rtfrY9ru@4%^iEsg|th*Yd$@wjv_dm z@{j6wHPgAKJTCAbql$v#T7oCr;4XBxx0{FcLaavbb_uzR<_x0O<; z9x;}9bj(BG*^X1y2iNBg*VImC1Xvsdj9i_JSMI)yj%`OzzVa3I7%^;>(>v>pz0Fp* zz#FFfgSo$n(uzm$Z+5dPOXi2iGDdz`o&A+A2A90+*md!cM8?Bf7F;v;h@n9ZNXlI& zUr{9cbCVp!4Z*hUBn1eay7_B&dPNDNRT!?JEMqm}b82>}I=K`iV8m;Z^p-N+)-RGh z3Kdgh5x!SF|4uO=}o{Ai}c13qGF+keGw}mA15E_LOsi7U$5=r zZ~S>w4t_yq5^7;u&`NxU(JM)oCR%~oTH>_V8KWXV=p z##RwRGGQzwF|YUh|EE5_AMUy5d7g96{d9llBGBMPY5)xa4aU-eB{7DW?@R!CKp7g0 z0iwa^Gdl)>rXl}{=*rMED`(c(5Y<_m{gVI?_P+%!6T%oF@kc@sd_YiP{KrM>?`kL1 z)F3JZgbwt-ZPZ{|Dg-|r_y)!h;6(!jNCH`f6;sTvwheSrf4jBTd8Q%IG;C6iEVXhE~MfOwsqEhvppNur61eTm)-SqN0d+?Zlin#6Q>6Quc?`+#4UCqd(!kLhhuZ7SY82lux; zX}`>B1hsU)o`dbvGi_n%A~sIeS1N@?l$!Hz?E#anRAlglqW`K_S5W_g%ZnIu@qcxP z{62(*Or@33wG4pqKvA^*?&=YJK66BVx<~BnN#rHl|6s$s(n_Ec|t`89D^g{rW$fIY0E#Lb}|-@!SE(IF5E&* zPNlDDsJeu_d987D4?AlM)s}@=T(77}N>6S7B^q=jTu3~M*_>iV{qp)1LAQiw-K=r^ zX@5UzromG9Cz9kRW->0}Z{t`2Zm8#-pIJ?^dk6sV|1 znvZj3Ea@%xEnsD!7CzmN>5kEIQu5+hnVf{27}z-qoD|~CE9=hLX4aUEFH-baCn=#D zOhqrsnB|QGy!NkeWZt`6>y)#mcdJB4{?$;5hk4pbs*0W#_=uk$ z%7JL$+sQ^^rY|Dk*?K!bc%g6zX=`Sq!`c=fFFk5#K3}lkyD762p=ol}f?Lo?9~M{; zd%cob%)nMIZL8SpQh_1S%e>I4VgNZ?(H|PPk5TtF*VA7%UXIjcK=2paT{BCMwHNm? z4=vp9kh3O@DsJ}|3X(t$?9)n~clQ`Ti~X?di^8_guxycgClvuM1b%7KE=}2R+fm7CvQhDB zDP`2g|5u+`7pDL(^}M3ZmnCquNrU=+&&EcU?pXaq#_mhb)fVAa^D6nGLR@LNw+Q~P z(Acu1oZKBrFO^uM(Ge&45Bsz!bA8y>)~}D4s`u5vDxmr2m64_jiJSB`xg{K&|Qw|?p; zlSU}>#RcOIVjL>JYTQKQ;vh%ny!1|BfAjQAiPPaYAdsP~!R=$XgQ&N^rBN13ez1<= zA#CI{VDF1QPPHq?JEVRwrh}g=f@CKG@F^sJg$EzvrooW|ejH^rG|q zgqVc{Gr@7b*Z8~Is`GcOUp6Vj-9E;i?0%YZiZ&d3y~l*?Hx`@QHx-evs0e4w?Ya3` zbY2_UhtexY-CV*BXDc7Rq0*FCHHLPvZTHFcS_+sM+~+9&5l!D&jEy#2WVv4h6$9u! zMYWTMKu(5@KoMj68qZ>SyNsO$a}T-T?;AS83#$v~FCSkG0aj`SHG^t!$(G^xGG-s` zc3DDtmZ*Z%jR50Wl)ue#VOUww|Ks4O@Q zYyKfUdX$`@+mL4sE2x8JJ@PW_I4o`~FupnFyuYz|se+MO+#}uIdk~v?L8S-tC7XEf zBz1MlEy^K!&BQgS9W1(;$M!Y;+LnxM;k73ymnJ%{((b0P=|`8ME*6EKPq3Mm+4;(? zfSPRBsHuH*+)*bVrcb3Di@Vd=YN27KwWc9W)GDt_{cQZc(`{KSEfmr(^$`fYWILNY zGEI??tqy&Ga}3E5X?!7-Xre)+Z5qC#1Od;mO0D5qY;y>6Jc(JFaGK#s7=0t_?y};8 z2%ijy9SJX^xkj)Tk2p{mm4;Hlb1B(PgK?@kClIUN0_ydKeB zWi@~q3jK5%u9AlH`&`dIhf~kLF-;IXZf<@@gTZmMOPvW1l1{iD5!xjTuXsEJG<-M-sA( z?6PIcc2Tl#V;RdkUiZB3>3+N)p7Wgl|9_tIe0qN8ffJxBKmZ6%faY>S6`vYC-R1{y z0Wt|t3YY+WerU(R31Hwq5oaa=#Do(-heI5PZT6o80Jr@uApG!aaD{&)9~=heCZ8^} z{9Ib+nIiXHZjQ}nnFhCJ3gxy)sMJY*xF39C-<@e45LkXZz z!Q=dCrAJ)zHMn#a;-u*Z;S-Y$PC+Daq!?vtH>o*$u_rz;JTbKAk08;ndTWyl0^SGD zA16CVyAQtWz-exM2+ix5*7eJCi`SWpuZp=5c%t$1PQoka-eQHibJ5+T2p>=3Fi?1X z(W_{NdtYhEFpA-0F_E0YOtoz+SsJkM{P|;8Cd;j}L}OagdxB5!yLKkU@7+Y#kgQsI zD(&pa`#w5Id!bvsBrJ{@`3X^|b5jm8`w^k$xN6kdi3}m9tM7MbAltUCt#)OX%hwlB z6h9Bf?<+9iA(6+@rx0mJFV0i$Xo!xFd8m%^|bHO+9 z33Jc5)L27-jUcascG%ajH>C{==2;i)+{KVoBao`=oqXXhR}Da|VbBS(hXhUJl4H~_ zhr(78XrQ~{n+l6RI-5K;jf8p)P1lI-DlJu{Jz$CA7ej-w15Mth;`HlLppz#v9e+N4 zg|=u2#-#X74wX!(8zf-qbniR1eWPMgJQ9K5BHM3=IN0Uh8J2&3ak9-HwPN6TJrdNU z5OBo}*{0_|Ah#}o=RKzte#PT@Iq>+`_x3#%Hsdtx!hg7eRdm_c+8?caF`DVu;`D`m zobjlgA}*Vnrz8elbfHo2;?db3T1;*F>@LgeMIBit!uT%1Hd@BAfQWhguS_j>MQ7)5 z7El>=MiD)9JWh{vw#b+lGwR8IoO6!8=@XS6=$GW4W5c&a-0E46Gbom!SUDIFGSWKf zDmQaNoC&3(#~fFToTUpgB~~4%kE`q8*74zI*9YBoI~GNUY*DXkm9=8a8a_4OqvKXX zyf2foGd#a+>nRH)D@;b9D$UbFrwh}APl{W&u?t&6)wV4*k4T=99d{iN&=R}CcGn0n z*5;7uH3cb4PUI}BgNgNPYGLM6NFLJ@!u$^(7=EX=T~&Xs%ndfVogM2_TKe^fo9R!T zKu^Oz!|Y{+$G1)&6msIO9w;2JD`a?5&EjwHzT`2}I(w={B?aIJy{H~Wsv38iNp-KS zL3cFE^-B&El?*R5O;MqG%LGsOFG#^H_9ko@Cp#vjQ72iU5%c7z6D#ysdvKBCix`AX zoj69n(4ux;zkMkSPJl%GzURLI0SN#TAoxSu`>=4Fy#Hqh9}fU{7^)tc%Krw0Jj5V_ z%?FPAS0IEi2i}}}V*T>gd7O?kn{@ytfV+2(U|!T)NqvdrPw8P$y23{T^Y93`ee$`z zQkk!wJJs@*?_*>9i9HEH`*=#?XfQe#SRP@XzK7v7|A<)JzbDVq`qVs3WJG7&%Q%Bv zaMk~@=g-J5FfHjZl9HluKqB5n-$$)<^d()!Z7fQ6v?%CQ?$!LYCh|Q-Z-dX|mWFL! z!tMI}E8g_BCrskP%0blD-Z8IJ-yKagu~aJR*Rqbrl+uPNX$um859z z^c>mf>_^e@`#y%mZaWy1$*Oe;J6|eJ-AnOeFMYzVSC2II7kdGerN|Md%xG!mrwy_m zKA0X9Hr8v-V0(ewOvV+xx9*B8bY4Nu5am74HwuY*js(IkDy)y|hyB=1t@wy7m~}CB zWCo=L87Jww-{`ZBRq8i$1I7iSl@L6XyYkt?s^(wOLQy5Sy5bF%%BIU#g0)3tx=29Q z+jQ~umTjsb{zj97Qis{`JR+2`n#MfkvH~r_vBL^L`4f-#d29FtsJ3my# zURABVh3e8Y47QBN7}w6zrRH05L?yN_4m)DBP3k?i^)4u)1`75og*=TJmp(LjN8V20 zdrYH_=aDtBRa~#>R)}`NQevUGm0*o?w?&Hl6(Nm7 zPfCeT*AibFOBG+R-m&9{og4fN&{%(i-|!gFq(WGy?J$0dMo|*iR%+EjdW?@pB(fl~X3=V_e5qo2>IH-o_1ff*<-rAMyJKEw_y-y29Z(+CuieLI zQjr6xFte);8{5^?K3}FU+;fqw0xGX7CwKc!j@DpX7YF4Z&APt$;W_&Z?=F>BzJz4m zrPAd8N@)FaZuF(5&iu+cDob0|)pTDqk#9evK}%U|_+cnQ{0qBNRa(Y(uU#f`KYjzF zRAnT2&2V4%LA7?yzQ>2^*$mOeXl38rO7(t^l^24kU|;WIKmV|nILz@&qf}o{Ugd{2 z69)HH<>0cv0Si5*Dhd{{n_&_3jsG$OJ=z;AT1%0wTmrAbk#JQw|L=DR2!L>arQd}X vi!rRrEUdbCu8L{Y`n2t8-`jd7{S#+W%h7rLwG^0pKI-VhfGYB%zft>Nz(cP> literal 0 HcmV?d00001 diff --git a/tests/certs/p12/without_password_private_key.key b/tests/certs/p12/without_password_private_key.key new file mode 100644 index 0000000..58bad4a --- /dev/null +++ b/tests/certs/p12/without_password_private_key.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDJOmadGCcKdxFc +dvQJbJJ9NxKmWVHowOm4KFVBw110ViSIcWGbMaq5YAsHku//MipWyFnaErYy6pIK +rE+Z3YYqIG8pfU9VlVjxzqHhMm98rH3hNKEpAwaXHWsd0m+ezGSu2+GCQf8Qlcys +Sjo5ELzSymAm/3cvgH7+1mbn4vsNn3amsQuCzK8n8mqW8IXNjGiInu1wdluQFcgv +dXWdoOJHSRZSnCIg6IWtBmtXSClsnuaKMHAENPqknGuthTik+i7QdPybztQEiF4L +baWurQwlxXU0gEtSgyKl660XC1bEbpRCqAL6pn4KE0lsIlOOK8fDFFWx3btPxXuG +urQvXeeNAgMBAAECggEAQikY7uKvh2HRi/iyUNzpJxEx6Q6p/yBaV8mvCmG8+tCN +z2yT3m5Mhwl8Zt+ZV+r6/7B81lXboM79+FNiEqFCiNxEIDyKloV1in9ZOw0VmcSu +2JowuKa9hnbOLq5vM6NZISK7ONQRFDdkZWs8TGHj61xNk9Tfr3cMiiYdDHXU/EuR +++g/otKr8l5a+zXWMigdr03TaHgSIXKgZzGyznolSP/bK/de0FrGGAVsVjf0pWeZ +avEx5K7Hvjto5HP8UHTytRDK+Fz5/wg7s4VdWxbZIWWptYCx7RMhOAZKRVol6o61 +So2521Jx4XopPXMnELcvGtPfSO+UDhp8uGPvQ7x3gwKBgQDjmh+HTzsm5RDlS1Uy +MZoYfgb5HCI+KJLFkVDK9RCGrUFtVPboxq+nXxklL37f8ZPFXbRnlmTOFPe5GgbK +V1UhGW6khX+KPmSiWRC2wVe3nTNWcmuRjbH9X1QGungSD/ul8vZH+Up6rgVZXrFv +gOYTA3hmPxxSBkkE7nPoxHlTUwKBgQDiVd0jAR0CQg69ktV41OGXqMwXKQL997wc +XAaYtF+4j4si3AdEM+rp4PBUPojOVSWgLygFMugOImj9TrxQfUJ0FcePWTd4D6qr +9rA08NXxQtnm+eROfRMUhae6Fn9so7alnCoT0Czx+Rr01tCN5PVAe8hF2+zjj7Ts +LgsM7opdnwKBgFCqIAB5sTIwvxM05sX6VG3XxKrnMK+s+4+v192Gi0vf/a89DKEl +Qb3k82l9cs71tHSfqD+KSsHLJpzgv4VY/F/VvqPqeHBLeqkbPdQ3o9n8ieRaewtE +F8//yCz2S3XDWmHPQT/y91WRdW3eJK6rFV+pvDMorOXZOmnYBRZ7A7DnAoGBAIlI +OWxM9ZJ0DMrRsCetP/QkTz5RAt6WkAPHkby300N31ZXcTZAByZ/4bu06TPKR1NOX +JrgYi4ZfOr1CL5jGkTMmLrf1Dl8FaakKZRCHb8z5ln+x3Nf6p0MQWo7VrI5xsow6 +7466+zf9t2sAjNk0IcnuCqjM35+bf8qtlshOO6DTAoGBANfrBoNSl+BsRXwF6EHW +O31t83Eo0+tf5MUsZrx0SyRpuPmQw4T0h7UGwh/3qLVsIeIcf1+Z4FBhtKhuDbGt +gf8m6OxP6E8xffIyFkfvyhLEMuUkb4Nye03+L1vyiJd4CT82ajYypotw5E7DdrCH +1URIYbBdleApV4RGF2FwQqEQ +-----END PRIVATE KEY----- diff --git a/tests/certs/p12/without_password_self_signed_certificate.crt b/tests/certs/p12/without_password_self_signed_certificate.crt new file mode 100644 index 0000000..8fecd22 --- /dev/null +++ b/tests/certs/p12/without_password_self_signed_certificate.crt @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDFzCCAf+gAwIBAgIUduV2MQFXbJkaYPrjCuzvrCUUyxowDQYJKoZIhvcNAQEL +BQAwGzEZMBcGA1UEAwwQd2l0aG91dF9wYXNzd29yZDAeFw0yMzA4MDQxMjMwMTJa +Fw0yNDA4MDMxMjMwMTJaMBsxGTAXBgNVBAMMEHdpdGhvdXRfcGFzc3dvcmQwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDJOmadGCcKdxFcdvQJbJJ9NxKm +WVHowOm4KFVBw110ViSIcWGbMaq5YAsHku//MipWyFnaErYy6pIKrE+Z3YYqIG8p +fU9VlVjxzqHhMm98rH3hNKEpAwaXHWsd0m+ezGSu2+GCQf8QlcysSjo5ELzSymAm +/3cvgH7+1mbn4vsNn3amsQuCzK8n8mqW8IXNjGiInu1wdluQFcgvdXWdoOJHSRZS +nCIg6IWtBmtXSClsnuaKMHAENPqknGuthTik+i7QdPybztQEiF4LbaWurQwlxXU0 +gEtSgyKl660XC1bEbpRCqAL6pn4KE0lsIlOOK8fDFFWx3btPxXuGurQvXeeNAgMB +AAGjUzBRMB0GA1UdDgQWBBRKn9mWqtN7XqBv2yV5cSJyKj97/DAfBgNVHSMEGDAW +gBRKn9mWqtN7XqBv2yV5cSJyKj97/DAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQCBVNj42aLsDh7RRxB4wrayhuVvo77yD02L27FYypVPr1SiqFed +znw1ZE1NzXiXLfu1bWAfTXaV6hDWfPH5q+xr63IKArC2dwo6fTNJRS4lySnZPpBO +iC7oavlNZbv9B+hk4w1y9VFK/F0T5raDKADdCQHKViduhAXqMco84epBS+wuuTPs +f3wXXCZ6H+Ok2FS/ryKYRCZvIDAi1JO/vXW5WBpA5PRlsABcw6D6PbBQmSne5NwU +r1c7HRitfeMiBg5MVr4w23U2U04yAhKNnRU5T6dQRgpgFxCM0I2sl8dMVSbMtpWr +Vb3ArbRm8s6JAtrg8F8vEss5q9D1o3mCJM4J +-----END CERTIFICATE----- diff --git a/tests/certs/pem/broken_certificate.pem b/tests/certs/pem/broken_certificate.pem new file mode 100644 index 0000000..57f89ed --- /dev/null +++ b/tests/certs/pem/broken_certificate.pem @@ -0,0 +1 @@ +broken diff --git a/tests/certs/pem/chain.crt b/tests/certs/pem/chain.crt new file mode 100644 index 0000000..2060bd5 --- /dev/null +++ b/tests/certs/pem/chain.crt @@ -0,0 +1,57 @@ +-----BEGIN CERTIFICATE----- +MIIDATCCAemgAwIBAgIUTM3cVRyiy8mcEPxrdQcKBcT1VPEwDQYJKoZIhvcNAQEL +BQAwEDEOMAwGA1UEAwwFY2hhaW4wHhcNMjMwODA0MTI1MDIyWhcNMjQwODAzMTI1 +MDIyWjAQMQ4wDAYDVQQDDAVjaGFpbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAK47f7Wo+1UkhwfMGqJSdE4CXz7YTmQSnMk4eKGF5v88mkikb9+t3u65 +ngsmAMoTt0FBfWC4mFRrs5BWxAVNvpBuywOd2c9FKQG26mKAu1jLjaCetaEyqNqU +QeJVt/6q6eSwnoo/qVo8m13EsdPqtLia9dp6aw9elqAZJNRGT/Sr0tAMX7U7zCw3 +I5xDexeh3batzy7iHMxUGtUKjbrSv9RkViOYlm65NsTRRnxObqxL2gXFrqgLT4kY +KH4ttNwsH1yQRX2Klopn8O7CD6e/K9IYBZwgTvxSqk7bsALIaea9NWU/RwQ7QlJU +zoZLMw1lqBOcBipEtZAPqD6egwTzD9ECAwEAAaNTMFEwHQYDVR0OBBYEFC0Q9q0C +d7YKVStYHzIKrD3OnAVGMB8GA1UdIwQYMBaAFC0Q9q0Cd7YKVStYHzIKrD3OnAVG +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAG0P6CvjDMz0gabj +Pc6mk3/cDF5en4Wcs71UYidLJAkpiK1I+QpAmB00yjEJwQjsHrHI7smRkRs1WHHb +R8dkskga80xU6e549Hh8BxBR+X9qv6a3hyTB1DVXSKZgTRrPSv97GIqKzJHOH7E6 +i6Uex+lFHgQvelquzyAidee4DtVxTpHjs78CqMp5lXH9FQP6EG2VP5Es2OIuWewz +N8adJsxQ2o+UnyMiLj1XFjhA491IAq24BnhGx+ftxhBuhHH4YMXEygogyYGrOFD9 +tqqWVW1EcOilcpEJ5q+c/fo93xlKR4R0OgSzzVMB8b8TGs1c9O9Ju3Hz0g0MQvUS +Mu3l92s= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDDzCCAfegAwIBAgIUGxspvdHEbZsghdL2KkSZQEE9MlowDQYJKoZIhvcNAQEL +BQAwFzEVMBMGA1UEAwwMaW50ZXJtZWRpYXRlMB4XDTIzMDgwNDEyNTAyM1oXDTI0 +MDgwMzEyNTAyM1owFzEVMBMGA1UEAwwMaW50ZXJtZWRpYXRlMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvrhKaGdIZaPT7HMIVA3qVDXmaBMQmJrdrRXy +WYxrfcn/ITK7FxLcaKKZarBObLNRs/V2cuc38zls8HR1bRqMvNoCYjHma99Z+w8t +Oa1cWN9dHXW27rIzJxYOqtyUn+Sf28tqM0hnf564JcSM8hEUJEOPj+EeNrpTOvv/ +c6SnZ9GUNbVMbkEtwI7RiZMz6e93Q1aXqklr7W7obK7s58ovh+4TK/A/AvQMRSVX +MqvzynanJ6vVM5+1a6A1sU4wgEGdi3RqTHD4ZkYPdAJPbXo3Y2E2NdFwz0jllYnN +Ov9O1R2LMQr1PXHUfEC+zD/GEx2FKIIg5giZqIT1pcS6l/g9awIDAQABo1MwUTAd +BgNVHQ4EFgQUkBe/Meaxi+4cO1BdrMewTaFfPt0wHwYDVR0jBBgwFoAUkBe/Meax +i+4cO1BdrMewTaFfPt0wDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC +AQEAkcn90Hj/GrQTRPBtaKA+/OQknHT0crGGifrdgizZXrv7Au2+RBYFVBrNKOVN +06bD0PMfS1IbMkevKCJ02x/ibbj3zNCrMlZuBEJfVV5dFz77kQZecfkysNORZCod +cm6I8d7HReQUAL3i3RequXEPQedE3poioeAj2vIWNX8EDo6lLmOwIn6f+JPmEfJR +o3znybe8A+fUvNC7yq9/YC89/wLrWU6+Qt8prb5gqjjmcNxNfBLhWIHU0Zsoy1u8 +z7L2rFywyOlnD7+VUSU1ZI3ov1cDLCCYjCGRwrM5jg4sjXNuwXl9UqqHs1WDtteU +kBrbaNEALwftYHpamABSypNUKw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC/zCCAeegAwIBAgIUaluTAKmmzwXoeWL2iAaMRQRoiTwwDQYJKoZIhvcNAQEL +BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yMzA4MDQxMjUwMjNaFw0yNDA4MDMxMjUw +MjNaMA8xDTALBgNVBAMMBHJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQDQ17XqXGLxFagfc8+o3k3N7+MSyoe6hTGdrGs/6puL7+p98+4RUxgidUCH +9PtfB5mz77BxkJrAnMVG4kE5aAe3S072y8QAB7ZX7toTDpO5lSBi43rqraylJHDK +1IMwF8AfaTmai+WSu7JWLeG/A2soZcOtG/mDL8KryVzGHbUKHA7pOFNvsG03tDtH +bcaAVr8y5sLQmWDlVrgtjNhsgej6/3SgT/ke/SSUmNz/UZnK8Fp0E15HXiE6p3Zg +qTLorgcu4Jnwt+u5V2/sTdSv4Mlrzszh5gmJU8vOfTX4jXyoc5YJqEYAcQYAXaay +yfgvXMrxjUQNpJpiwGs9MDA4OgcrAgMBAAGjUzBRMB0GA1UdDgQWBBTUGCpkA3La +DITQ75GRereRqS9pZDAfBgNVHSMEGDAWgBTUGCpkA3LaDITQ75GRereRqS9pZDAP +BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBChGiup3H5rqZORnIa +huKCWyB0Yl0AoROfm71k99RyzfztKM02S5Jp5in1miweLfLgXpnOj9AzvFDoHfEz +i4K87p1MMfJREOJWfCIVYPB29VNDcPKeeDsoUMV4KTjFJQ00yBl7C5qlb6ZEcgNa +IuTfw8iJPJKbwVELSV9Tp7vBZTkHAFexhMaVzfYqgOxAN1tlSdfk1CL5/ubct3wf +oTJ6jPEi0kBT2oi6aNr2pt/CJnqATItPa5f07Zn1tgfn5TFUXSWbye03Y98jJEZp +LGowDDgPGan1QUsaI4SJCa9ozH7oVOUav0zPXAHCc1o4Fe129Q5W6mkTZU9MLCD0 +Pqfg +-----END CERTIFICATE----- diff --git a/tests/certs/pem/chain_certificate.pem b/tests/certs/pem/chain_certificate.pem new file mode 100644 index 0000000..1cf5654 --- /dev/null +++ b/tests/certs/pem/chain_certificate.pem @@ -0,0 +1,85 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCuO3+1qPtVJIcH +zBqiUnROAl8+2E5kEpzJOHihheb/PJpIpG/frd7uuZ4LJgDKE7dBQX1guJhUa7OQ +VsQFTb6QbssDndnPRSkBtupigLtYy42gnrWhMqjalEHiVbf+qunksJ6KP6laPJtd +xLHT6rS4mvXaemsPXpagGSTURk/0q9LQDF+1O8wsNyOcQ3sXod22rc8u4hzMVBrV +Co260r/UZFYjmJZuuTbE0UZ8Tm6sS9oFxa6oC0+JGCh+LbTcLB9ckEV9ipaKZ/Du +wg+nvyvSGAWcIE78UqpO27ACyGnmvTVlP0cEO0JSVM6GSzMNZagTnAYqRLWQD6g+ +noME8w/RAgMBAAECggEAAwPTb5s+SKSUe9h+wj3xJmes+mFbt2h5SzPZhgmDNBna +TV0flLg9dCX0/7pDT5vgWx4pD1E4bRcNRRdURmd4T4dkRtJuokMfDNkbhJN30nc4 +wt2WNOUzle80deg/8iWm3RrHjorAGWg0s85fWaR9RrfDPvno8/vR+VCgEhaKpAgk +/5t5YTQEu299OETnDaZs6VwP5VHHqA1o9FhgFwnGECHLkXsrK4X5ORmFyXHlTMaD +wi6NL5Lt4Go4ZyTlEh27qHA368YI38Tno+iR2+P3Kecz2qSCAjf+a+mjEWglO1lu +5aLby786b4JlaUXfZCHLMVK36A7a8TOcXh9oEo/ogQKBgQD0G+ODAS1pczd2X2yD +dp9oF00oLWN2JyEd9YE9DUG+v473ONG4RLBQs5zNXqn43KwO5mtrKyKURW2yxFCu +c5+UwYM3WEd7ISU69+2EP5SZuW1pnFIZ557MF63CCQ76O81IXWIgdjdnFXYBj+V2 +IhC4sQuze7+CNM6F5j5RvnXRUQKBgQC2uDqkUE2pvdD01jbueYZGqU1EFtRdr3gl +fZc9pqREjkUNI0x4V3XNtqEB+euuck9EptLZ6dRbFD066OeZq9ITvp5Od+RVrnh/ +vqiw8dXEFZ732k7QrOteIX7VHtL0nSwdJ0vnc5WSIUUFYwaYVa7KMli9ZJpVz5Ts +ZdRyAzW2gQKBgQCEcOEmQaxGyykrQyiXxvNDwWiuRLny79Xq8DlXS2sBN+M0RJKc +XEAg+OI5FoQ3rlp3lxJuya9wLJ8Q36w6iibpyXgMvgvCRUBy1vL5zpksMkunghWV +UnJ4ntw6KzoCEBIXkfrcS+dROXaV8GF5j4/s9Lm5folv9oCaa0oihahckQKBgCQ9 +KbRJEP4nXXgRvFdT1uPQ1Dg65uel04hr/kEF+fJ23Q8b/yCnCABCxnAj5zB0D3Co +PY1mqO1feD1kz/pUb5fm6HLbqHet4MxFPiPJ8wGu4BZ8P8F3aj8DGaqfMGu/eG5X +yuAetn2DB7NnznkMFVyY26zEdS+rufegwp/SLycBAoGBAK1fD9Euk77nL/13/D8p +nwpt18Sq9LjnW0UHQBqMiqeherHl4sYCCvVaZigJ6I+dgYN1IWIOchLTi/7vzTld +EYt+RfYaChfa9USvk5Uh/wgWkSi+52RhdqXN50WNlVuqJgi8oqFVjwmleiMi7mdt +lkCzPprwq8GFbyVMx2EzBhy7 +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIDATCCAemgAwIBAgIUTM3cVRyiy8mcEPxrdQcKBcT1VPEwDQYJKoZIhvcNAQEL +BQAwEDEOMAwGA1UEAwwFY2hhaW4wHhcNMjMwODA0MTI1MDIyWhcNMjQwODAzMTI1 +MDIyWjAQMQ4wDAYDVQQDDAVjaGFpbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAK47f7Wo+1UkhwfMGqJSdE4CXz7YTmQSnMk4eKGF5v88mkikb9+t3u65 +ngsmAMoTt0FBfWC4mFRrs5BWxAVNvpBuywOd2c9FKQG26mKAu1jLjaCetaEyqNqU +QeJVt/6q6eSwnoo/qVo8m13EsdPqtLia9dp6aw9elqAZJNRGT/Sr0tAMX7U7zCw3 +I5xDexeh3batzy7iHMxUGtUKjbrSv9RkViOYlm65NsTRRnxObqxL2gXFrqgLT4kY +KH4ttNwsH1yQRX2Klopn8O7CD6e/K9IYBZwgTvxSqk7bsALIaea9NWU/RwQ7QlJU +zoZLMw1lqBOcBipEtZAPqD6egwTzD9ECAwEAAaNTMFEwHQYDVR0OBBYEFC0Q9q0C +d7YKVStYHzIKrD3OnAVGMB8GA1UdIwQYMBaAFC0Q9q0Cd7YKVStYHzIKrD3OnAVG +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAG0P6CvjDMz0gabj +Pc6mk3/cDF5en4Wcs71UYidLJAkpiK1I+QpAmB00yjEJwQjsHrHI7smRkRs1WHHb +R8dkskga80xU6e549Hh8BxBR+X9qv6a3hyTB1DVXSKZgTRrPSv97GIqKzJHOH7E6 +i6Uex+lFHgQvelquzyAidee4DtVxTpHjs78CqMp5lXH9FQP6EG2VP5Es2OIuWewz +N8adJsxQ2o+UnyMiLj1XFjhA491IAq24BnhGx+ftxhBuhHH4YMXEygogyYGrOFD9 +tqqWVW1EcOilcpEJ5q+c/fo93xlKR4R0OgSzzVMB8b8TGs1c9O9Ju3Hz0g0MQvUS +Mu3l92s= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDDzCCAfegAwIBAgIUGxspvdHEbZsghdL2KkSZQEE9MlowDQYJKoZIhvcNAQEL +BQAwFzEVMBMGA1UEAwwMaW50ZXJtZWRpYXRlMB4XDTIzMDgwNDEyNTAyM1oXDTI0 +MDgwMzEyNTAyM1owFzEVMBMGA1UEAwwMaW50ZXJtZWRpYXRlMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvrhKaGdIZaPT7HMIVA3qVDXmaBMQmJrdrRXy +WYxrfcn/ITK7FxLcaKKZarBObLNRs/V2cuc38zls8HR1bRqMvNoCYjHma99Z+w8t +Oa1cWN9dHXW27rIzJxYOqtyUn+Sf28tqM0hnf564JcSM8hEUJEOPj+EeNrpTOvv/ +c6SnZ9GUNbVMbkEtwI7RiZMz6e93Q1aXqklr7W7obK7s58ovh+4TK/A/AvQMRSVX +MqvzynanJ6vVM5+1a6A1sU4wgEGdi3RqTHD4ZkYPdAJPbXo3Y2E2NdFwz0jllYnN +Ov9O1R2LMQr1PXHUfEC+zD/GEx2FKIIg5giZqIT1pcS6l/g9awIDAQABo1MwUTAd +BgNVHQ4EFgQUkBe/Meaxi+4cO1BdrMewTaFfPt0wHwYDVR0jBBgwFoAUkBe/Meax +i+4cO1BdrMewTaFfPt0wDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC +AQEAkcn90Hj/GrQTRPBtaKA+/OQknHT0crGGifrdgizZXrv7Au2+RBYFVBrNKOVN +06bD0PMfS1IbMkevKCJ02x/ibbj3zNCrMlZuBEJfVV5dFz77kQZecfkysNORZCod +cm6I8d7HReQUAL3i3RequXEPQedE3poioeAj2vIWNX8EDo6lLmOwIn6f+JPmEfJR +o3znybe8A+fUvNC7yq9/YC89/wLrWU6+Qt8prb5gqjjmcNxNfBLhWIHU0Zsoy1u8 +z7L2rFywyOlnD7+VUSU1ZI3ov1cDLCCYjCGRwrM5jg4sjXNuwXl9UqqHs1WDtteU +kBrbaNEALwftYHpamABSypNUKw== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC/zCCAeegAwIBAgIUaluTAKmmzwXoeWL2iAaMRQRoiTwwDQYJKoZIhvcNAQEL +BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yMzA4MDQxMjUwMjNaFw0yNDA4MDMxMjUw +MjNaMA8xDTALBgNVBAMMBHJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQDQ17XqXGLxFagfc8+o3k3N7+MSyoe6hTGdrGs/6puL7+p98+4RUxgidUCH +9PtfB5mz77BxkJrAnMVG4kE5aAe3S072y8QAB7ZX7toTDpO5lSBi43rqraylJHDK +1IMwF8AfaTmai+WSu7JWLeG/A2soZcOtG/mDL8KryVzGHbUKHA7pOFNvsG03tDtH +bcaAVr8y5sLQmWDlVrgtjNhsgej6/3SgT/ke/SSUmNz/UZnK8Fp0E15HXiE6p3Zg +qTLorgcu4Jnwt+u5V2/sTdSv4Mlrzszh5gmJU8vOfTX4jXyoc5YJqEYAcQYAXaay +yfgvXMrxjUQNpJpiwGs9MDA4OgcrAgMBAAGjUzBRMB0GA1UdDgQWBBTUGCpkA3La +DITQ75GRereRqS9pZDAfBgNVHSMEGDAWgBTUGCpkA3LaDITQ75GRereRqS9pZDAP +BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBChGiup3H5rqZORnIa +huKCWyB0Yl0AoROfm71k99RyzfztKM02S5Jp5in1miweLfLgXpnOj9AzvFDoHfEz +i4K87p1MMfJREOJWfCIVYPB29VNDcPKeeDsoUMV4KTjFJQ00yBl7C5qlb6ZEcgNa +IuTfw8iJPJKbwVELSV9Tp7vBZTkHAFexhMaVzfYqgOxAN1tlSdfk1CL5/ubct3wf +oTJ6jPEi0kBT2oi6aNr2pt/CJnqATItPa5f07Zn1tgfn5TFUXSWbye03Y98jJEZp +LGowDDgPGan1QUsaI4SJCa9ozH7oVOUav0zPXAHCc1o4Fe129Q5W6mkTZU9MLCD0 +Pqfg +-----END CERTIFICATE----- diff --git a/tests/certs/pem/chain_private_key.key b/tests/certs/pem/chain_private_key.key new file mode 100644 index 0000000..802e65f --- /dev/null +++ b/tests/certs/pem/chain_private_key.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCuO3+1qPtVJIcH +zBqiUnROAl8+2E5kEpzJOHihheb/PJpIpG/frd7uuZ4LJgDKE7dBQX1guJhUa7OQ +VsQFTb6QbssDndnPRSkBtupigLtYy42gnrWhMqjalEHiVbf+qunksJ6KP6laPJtd +xLHT6rS4mvXaemsPXpagGSTURk/0q9LQDF+1O8wsNyOcQ3sXod22rc8u4hzMVBrV +Co260r/UZFYjmJZuuTbE0UZ8Tm6sS9oFxa6oC0+JGCh+LbTcLB9ckEV9ipaKZ/Du +wg+nvyvSGAWcIE78UqpO27ACyGnmvTVlP0cEO0JSVM6GSzMNZagTnAYqRLWQD6g+ +noME8w/RAgMBAAECggEAAwPTb5s+SKSUe9h+wj3xJmes+mFbt2h5SzPZhgmDNBna +TV0flLg9dCX0/7pDT5vgWx4pD1E4bRcNRRdURmd4T4dkRtJuokMfDNkbhJN30nc4 +wt2WNOUzle80deg/8iWm3RrHjorAGWg0s85fWaR9RrfDPvno8/vR+VCgEhaKpAgk +/5t5YTQEu299OETnDaZs6VwP5VHHqA1o9FhgFwnGECHLkXsrK4X5ORmFyXHlTMaD +wi6NL5Lt4Go4ZyTlEh27qHA368YI38Tno+iR2+P3Kecz2qSCAjf+a+mjEWglO1lu +5aLby786b4JlaUXfZCHLMVK36A7a8TOcXh9oEo/ogQKBgQD0G+ODAS1pczd2X2yD +dp9oF00oLWN2JyEd9YE9DUG+v473ONG4RLBQs5zNXqn43KwO5mtrKyKURW2yxFCu +c5+UwYM3WEd7ISU69+2EP5SZuW1pnFIZ557MF63CCQ76O81IXWIgdjdnFXYBj+V2 +IhC4sQuze7+CNM6F5j5RvnXRUQKBgQC2uDqkUE2pvdD01jbueYZGqU1EFtRdr3gl +fZc9pqREjkUNI0x4V3XNtqEB+euuck9EptLZ6dRbFD066OeZq9ITvp5Od+RVrnh/ +vqiw8dXEFZ732k7QrOteIX7VHtL0nSwdJ0vnc5WSIUUFYwaYVa7KMli9ZJpVz5Ts +ZdRyAzW2gQKBgQCEcOEmQaxGyykrQyiXxvNDwWiuRLny79Xq8DlXS2sBN+M0RJKc +XEAg+OI5FoQ3rlp3lxJuya9wLJ8Q36w6iibpyXgMvgvCRUBy1vL5zpksMkunghWV +UnJ4ntw6KzoCEBIXkfrcS+dROXaV8GF5j4/s9Lm5folv9oCaa0oihahckQKBgCQ9 +KbRJEP4nXXgRvFdT1uPQ1Dg65uel04hr/kEF+fJ23Q8b/yCnCABCxnAj5zB0D3Co +PY1mqO1feD1kz/pUb5fm6HLbqHet4MxFPiPJ8wGu4BZ8P8F3aj8DGaqfMGu/eG5X +yuAetn2DB7NnznkMFVyY26zEdS+rufegwp/SLycBAoGBAK1fD9Euk77nL/13/D8p +nwpt18Sq9LjnW0UHQBqMiqeherHl4sYCCvVaZigJ6I+dgYN1IWIOchLTi/7vzTld +EYt+RfYaChfa9USvk5Uh/wgWkSi+52RhdqXN50WNlVuqJgi8oqFVjwmleiMi7mdt +lkCzPprwq8GFbyVMx2EzBhy7 +-----END PRIVATE KEY----- diff --git a/tests/certs/pem/chain_private_key.pem b/tests/certs/pem/chain_private_key.pem new file mode 100644 index 0000000..802e65f --- /dev/null +++ b/tests/certs/pem/chain_private_key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCuO3+1qPtVJIcH +zBqiUnROAl8+2E5kEpzJOHihheb/PJpIpG/frd7uuZ4LJgDKE7dBQX1guJhUa7OQ +VsQFTb6QbssDndnPRSkBtupigLtYy42gnrWhMqjalEHiVbf+qunksJ6KP6laPJtd +xLHT6rS4mvXaemsPXpagGSTURk/0q9LQDF+1O8wsNyOcQ3sXod22rc8u4hzMVBrV +Co260r/UZFYjmJZuuTbE0UZ8Tm6sS9oFxa6oC0+JGCh+LbTcLB9ckEV9ipaKZ/Du +wg+nvyvSGAWcIE78UqpO27ACyGnmvTVlP0cEO0JSVM6GSzMNZagTnAYqRLWQD6g+ +noME8w/RAgMBAAECggEAAwPTb5s+SKSUe9h+wj3xJmes+mFbt2h5SzPZhgmDNBna +TV0flLg9dCX0/7pDT5vgWx4pD1E4bRcNRRdURmd4T4dkRtJuokMfDNkbhJN30nc4 +wt2WNOUzle80deg/8iWm3RrHjorAGWg0s85fWaR9RrfDPvno8/vR+VCgEhaKpAgk +/5t5YTQEu299OETnDaZs6VwP5VHHqA1o9FhgFwnGECHLkXsrK4X5ORmFyXHlTMaD +wi6NL5Lt4Go4ZyTlEh27qHA368YI38Tno+iR2+P3Kecz2qSCAjf+a+mjEWglO1lu +5aLby786b4JlaUXfZCHLMVK36A7a8TOcXh9oEo/ogQKBgQD0G+ODAS1pczd2X2yD +dp9oF00oLWN2JyEd9YE9DUG+v473ONG4RLBQs5zNXqn43KwO5mtrKyKURW2yxFCu +c5+UwYM3WEd7ISU69+2EP5SZuW1pnFIZ557MF63CCQ76O81IXWIgdjdnFXYBj+V2 +IhC4sQuze7+CNM6F5j5RvnXRUQKBgQC2uDqkUE2pvdD01jbueYZGqU1EFtRdr3gl +fZc9pqREjkUNI0x4V3XNtqEB+euuck9EptLZ6dRbFD066OeZq9ITvp5Od+RVrnh/ +vqiw8dXEFZ732k7QrOteIX7VHtL0nSwdJ0vnc5WSIUUFYwaYVa7KMli9ZJpVz5Ts +ZdRyAzW2gQKBgQCEcOEmQaxGyykrQyiXxvNDwWiuRLny79Xq8DlXS2sBN+M0RJKc +XEAg+OI5FoQ3rlp3lxJuya9wLJ8Q36w6iibpyXgMvgvCRUBy1vL5zpksMkunghWV +UnJ4ntw6KzoCEBIXkfrcS+dROXaV8GF5j4/s9Lm5folv9oCaa0oihahckQKBgCQ9 +KbRJEP4nXXgRvFdT1uPQ1Dg65uel04hr/kEF+fJ23Q8b/yCnCABCxnAj5zB0D3Co +PY1mqO1feD1kz/pUb5fm6HLbqHet4MxFPiPJ8wGu4BZ8P8F3aj8DGaqfMGu/eG5X +yuAetn2DB7NnznkMFVyY26zEdS+rufegwp/SLycBAoGBAK1fD9Euk77nL/13/D8p +nwpt18Sq9LjnW0UHQBqMiqeherHl4sYCCvVaZigJ6I+dgYN1IWIOchLTi/7vzTld +EYt+RfYaChfa9USvk5Uh/wgWkSi+52RhdqXN50WNlVuqJgi8oqFVjwmleiMi7mdt +lkCzPprwq8GFbyVMx2EzBhy7 +-----END PRIVATE KEY----- diff --git a/tests/certs/pem/chain_self_signed_certificate.crt b/tests/certs/pem/chain_self_signed_certificate.crt new file mode 100644 index 0000000..96bcb1f --- /dev/null +++ b/tests/certs/pem/chain_self_signed_certificate.crt @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDATCCAemgAwIBAgIUTM3cVRyiy8mcEPxrdQcKBcT1VPEwDQYJKoZIhvcNAQEL +BQAwEDEOMAwGA1UEAwwFY2hhaW4wHhcNMjMwODA0MTI1MDIyWhcNMjQwODAzMTI1 +MDIyWjAQMQ4wDAYDVQQDDAVjaGFpbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAK47f7Wo+1UkhwfMGqJSdE4CXz7YTmQSnMk4eKGF5v88mkikb9+t3u65 +ngsmAMoTt0FBfWC4mFRrs5BWxAVNvpBuywOd2c9FKQG26mKAu1jLjaCetaEyqNqU +QeJVt/6q6eSwnoo/qVo8m13EsdPqtLia9dp6aw9elqAZJNRGT/Sr0tAMX7U7zCw3 +I5xDexeh3batzy7iHMxUGtUKjbrSv9RkViOYlm65NsTRRnxObqxL2gXFrqgLT4kY +KH4ttNwsH1yQRX2Klopn8O7CD6e/K9IYBZwgTvxSqk7bsALIaea9NWU/RwQ7QlJU +zoZLMw1lqBOcBipEtZAPqD6egwTzD9ECAwEAAaNTMFEwHQYDVR0OBBYEFC0Q9q0C +d7YKVStYHzIKrD3OnAVGMB8GA1UdIwQYMBaAFC0Q9q0Cd7YKVStYHzIKrD3OnAVG +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAG0P6CvjDMz0gabj +Pc6mk3/cDF5en4Wcs71UYidLJAkpiK1I+QpAmB00yjEJwQjsHrHI7smRkRs1WHHb +R8dkskga80xU6e549Hh8BxBR+X9qv6a3hyTB1DVXSKZgTRrPSv97GIqKzJHOH7E6 +i6Uex+lFHgQvelquzyAidee4DtVxTpHjs78CqMp5lXH9FQP6EG2VP5Es2OIuWewz +N8adJsxQ2o+UnyMiLj1XFjhA491IAq24BnhGx+ftxhBuhHH4YMXEygogyYGrOFD9 +tqqWVW1EcOilcpEJ5q+c/fo93xlKR4R0OgSzzVMB8b8TGs1c9O9Ju3Hz0g0MQvUS +Mu3l92s= +-----END CERTIFICATE----- diff --git a/tests/certs/pem/intermediate_certificate.pem b/tests/certs/pem/intermediate_certificate.pem new file mode 100644 index 0000000..d8fe10f --- /dev/null +++ b/tests/certs/pem/intermediate_certificate.pem @@ -0,0 +1,47 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+uEpoZ0hlo9Ps +cwhUDepUNeZoExCYmt2tFfJZjGt9yf8hMrsXEtxooplqsE5ss1Gz9XZy5zfzOWzw +dHVtGoy82gJiMeZr31n7Dy05rVxY310ddbbusjMnFg6q3JSf5J/by2ozSGd/nrgl +xIzyERQkQ4+P4R42ulM6+/9zpKdn0ZQ1tUxuQS3AjtGJkzPp73dDVpeqSWvtbuhs +ruznyi+H7hMr8D8C9AxFJVcyq/PKdqcnq9Uzn7VroDWxTjCAQZ2LdGpMcPhmRg90 +Ak9tejdjYTY10XDPSOWVic06/07VHYsxCvU9cdR8QL7MP8YTHYUogiDmCJmohPWl +xLqX+D1rAgMBAAECggEAH+sHyOFAJIJ+fRvjUO3jQaSjotdN97wzTTxXCtWNR8f+ +grfSx9HIQVq1Aj3vYhHAorV51VEM9A+wQ6252UCQPSrfKz/eqD8A+BtaHkT9J4J6 +OuvwaZI5LVlrqvyvgvLoLgilBWAgsiMF/oweaoShMlB8PkAWpmIYe86gueHcgmsu +Fx8/f3WWo5rXcDT2Uh25Z3roev8BVG3bLA28cng7Q+MqLiXSWR7dkftOowSxX+gh +zrKEaKRR/U6MhkJeH/jCm1L3uyeZDzdre7RUf2I6V+GO8l5/W6psz+1aPjvcjm/f +N7lY7VWS41yXG6jWqctAiSsclml1yRGLHjpzNw6agQKBgQD9ASs6jsnCPJOVu/6R +7X/JcMhlMBT51DtWKbB+ywm0MrLkyeUFS4J1W5G/L3HTQquvxwMeMCCqotL3bJ/G +wyoFasC1HuBEN+J//3Kocir3PjkUtjoqqq9cPy/4gA6Pjlq/U/n6A5kbt6d74+0f +qGFH0O72TVexd8i6h4+KGzNZAwKBgQDA+lfffMHH6qVE4aTphfVKvJukbbTPwRYT +/bKbqx0mdrEMvemadv7Iv4r9cYD65C/CAGUMRfQOqunE+LXHm1IqbMF0PdNz+bik +2xPZT41jwqlfNnRQ7CrMIUU9lgNaw8NpSDu55ymRiKwQHMs4X9xNTBl5W90/5GFi +hbXPKyC5eQKBgQCe0gEE/WWB3Oz4bc7cZC53kaj6fDhuq9+jsv/sWCB7Uegi3uo5 +bLE0YosXbP0TFSMZcOBwLt4Sv6uXTkTuTM0wIVdfW0aFDF/O4dhkDWcTVagXbF0P +M55pVfETGbAKRd6JhHnDjEass5kbmHTeDqEip/GaA+ssqHkFPtvIYlLVaQKBgFmE +h7i7RaT4Oxwd1AMjyeqWXVjEL0jkV9qEKBNAKDCMhIrVmgS2SHBVMiNpQJyht2m2 +BynPVWxsai6d9K0YZuAZPRAwEePNppKKscVvurXZOfpZ51EWjK/OizELYpj7EK3I +/TO6gLTrAm4i/T40cZxFvddm/tZBmc87GWB1sCN5AoGBAMQDPvKsyT0nidZN1Na6 +EgkFldQDGb44bv/kdnyQnDX9jhlm2adE7MswblH+O8O/vc3vvrS87oAs34d7xDiB +FSqPtG9ZLb/URZM+oP5TfDpo2oQs5M/fFtxRj/DRHr8yI96cmn7iMgcflI3g7etn +99Tz6Wbg1Hl0fXaB8wPcdp23 +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIDDzCCAfegAwIBAgIUGxspvdHEbZsghdL2KkSZQEE9MlowDQYJKoZIhvcNAQEL +BQAwFzEVMBMGA1UEAwwMaW50ZXJtZWRpYXRlMB4XDTIzMDgwNDEyNTAyM1oXDTI0 +MDgwMzEyNTAyM1owFzEVMBMGA1UEAwwMaW50ZXJtZWRpYXRlMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvrhKaGdIZaPT7HMIVA3qVDXmaBMQmJrdrRXy +WYxrfcn/ITK7FxLcaKKZarBObLNRs/V2cuc38zls8HR1bRqMvNoCYjHma99Z+w8t +Oa1cWN9dHXW27rIzJxYOqtyUn+Sf28tqM0hnf564JcSM8hEUJEOPj+EeNrpTOvv/ +c6SnZ9GUNbVMbkEtwI7RiZMz6e93Q1aXqklr7W7obK7s58ovh+4TK/A/AvQMRSVX +MqvzynanJ6vVM5+1a6A1sU4wgEGdi3RqTHD4ZkYPdAJPbXo3Y2E2NdFwz0jllYnN +Ov9O1R2LMQr1PXHUfEC+zD/GEx2FKIIg5giZqIT1pcS6l/g9awIDAQABo1MwUTAd +BgNVHQ4EFgQUkBe/Meaxi+4cO1BdrMewTaFfPt0wHwYDVR0jBBgwFoAUkBe/Meax +i+4cO1BdrMewTaFfPt0wDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC +AQEAkcn90Hj/GrQTRPBtaKA+/OQknHT0crGGifrdgizZXrv7Au2+RBYFVBrNKOVN +06bD0PMfS1IbMkevKCJ02x/ibbj3zNCrMlZuBEJfVV5dFz77kQZecfkysNORZCod +cm6I8d7HReQUAL3i3RequXEPQedE3poioeAj2vIWNX8EDo6lLmOwIn6f+JPmEfJR +o3znybe8A+fUvNC7yq9/YC89/wLrWU6+Qt8prb5gqjjmcNxNfBLhWIHU0Zsoy1u8 +z7L2rFywyOlnD7+VUSU1ZI3ov1cDLCCYjCGRwrM5jg4sjXNuwXl9UqqHs1WDtteU +kBrbaNEALwftYHpamABSypNUKw== +-----END CERTIFICATE----- diff --git a/tests/certs/pem/intermediate_private_key.key b/tests/certs/pem/intermediate_private_key.key new file mode 100644 index 0000000..0f19821 --- /dev/null +++ b/tests/certs/pem/intermediate_private_key.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+uEpoZ0hlo9Ps +cwhUDepUNeZoExCYmt2tFfJZjGt9yf8hMrsXEtxooplqsE5ss1Gz9XZy5zfzOWzw +dHVtGoy82gJiMeZr31n7Dy05rVxY310ddbbusjMnFg6q3JSf5J/by2ozSGd/nrgl +xIzyERQkQ4+P4R42ulM6+/9zpKdn0ZQ1tUxuQS3AjtGJkzPp73dDVpeqSWvtbuhs +ruznyi+H7hMr8D8C9AxFJVcyq/PKdqcnq9Uzn7VroDWxTjCAQZ2LdGpMcPhmRg90 +Ak9tejdjYTY10XDPSOWVic06/07VHYsxCvU9cdR8QL7MP8YTHYUogiDmCJmohPWl +xLqX+D1rAgMBAAECggEAH+sHyOFAJIJ+fRvjUO3jQaSjotdN97wzTTxXCtWNR8f+ +grfSx9HIQVq1Aj3vYhHAorV51VEM9A+wQ6252UCQPSrfKz/eqD8A+BtaHkT9J4J6 +OuvwaZI5LVlrqvyvgvLoLgilBWAgsiMF/oweaoShMlB8PkAWpmIYe86gueHcgmsu +Fx8/f3WWo5rXcDT2Uh25Z3roev8BVG3bLA28cng7Q+MqLiXSWR7dkftOowSxX+gh +zrKEaKRR/U6MhkJeH/jCm1L3uyeZDzdre7RUf2I6V+GO8l5/W6psz+1aPjvcjm/f +N7lY7VWS41yXG6jWqctAiSsclml1yRGLHjpzNw6agQKBgQD9ASs6jsnCPJOVu/6R +7X/JcMhlMBT51DtWKbB+ywm0MrLkyeUFS4J1W5G/L3HTQquvxwMeMCCqotL3bJ/G +wyoFasC1HuBEN+J//3Kocir3PjkUtjoqqq9cPy/4gA6Pjlq/U/n6A5kbt6d74+0f +qGFH0O72TVexd8i6h4+KGzNZAwKBgQDA+lfffMHH6qVE4aTphfVKvJukbbTPwRYT +/bKbqx0mdrEMvemadv7Iv4r9cYD65C/CAGUMRfQOqunE+LXHm1IqbMF0PdNz+bik +2xPZT41jwqlfNnRQ7CrMIUU9lgNaw8NpSDu55ymRiKwQHMs4X9xNTBl5W90/5GFi +hbXPKyC5eQKBgQCe0gEE/WWB3Oz4bc7cZC53kaj6fDhuq9+jsv/sWCB7Uegi3uo5 +bLE0YosXbP0TFSMZcOBwLt4Sv6uXTkTuTM0wIVdfW0aFDF/O4dhkDWcTVagXbF0P +M55pVfETGbAKRd6JhHnDjEass5kbmHTeDqEip/GaA+ssqHkFPtvIYlLVaQKBgFmE +h7i7RaT4Oxwd1AMjyeqWXVjEL0jkV9qEKBNAKDCMhIrVmgS2SHBVMiNpQJyht2m2 +BynPVWxsai6d9K0YZuAZPRAwEePNppKKscVvurXZOfpZ51EWjK/OizELYpj7EK3I +/TO6gLTrAm4i/T40cZxFvddm/tZBmc87GWB1sCN5AoGBAMQDPvKsyT0nidZN1Na6 +EgkFldQDGb44bv/kdnyQnDX9jhlm2adE7MswblH+O8O/vc3vvrS87oAs34d7xDiB +FSqPtG9ZLb/URZM+oP5TfDpo2oQs5M/fFtxRj/DRHr8yI96cmn7iMgcflI3g7etn +99Tz6Wbg1Hl0fXaB8wPcdp23 +-----END PRIVATE KEY----- diff --git a/tests/certs/pem/intermediate_private_key.pem b/tests/certs/pem/intermediate_private_key.pem new file mode 100644 index 0000000..0f19821 --- /dev/null +++ b/tests/certs/pem/intermediate_private_key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+uEpoZ0hlo9Ps +cwhUDepUNeZoExCYmt2tFfJZjGt9yf8hMrsXEtxooplqsE5ss1Gz9XZy5zfzOWzw +dHVtGoy82gJiMeZr31n7Dy05rVxY310ddbbusjMnFg6q3JSf5J/by2ozSGd/nrgl +xIzyERQkQ4+P4R42ulM6+/9zpKdn0ZQ1tUxuQS3AjtGJkzPp73dDVpeqSWvtbuhs +ruznyi+H7hMr8D8C9AxFJVcyq/PKdqcnq9Uzn7VroDWxTjCAQZ2LdGpMcPhmRg90 +Ak9tejdjYTY10XDPSOWVic06/07VHYsxCvU9cdR8QL7MP8YTHYUogiDmCJmohPWl +xLqX+D1rAgMBAAECggEAH+sHyOFAJIJ+fRvjUO3jQaSjotdN97wzTTxXCtWNR8f+ +grfSx9HIQVq1Aj3vYhHAorV51VEM9A+wQ6252UCQPSrfKz/eqD8A+BtaHkT9J4J6 +OuvwaZI5LVlrqvyvgvLoLgilBWAgsiMF/oweaoShMlB8PkAWpmIYe86gueHcgmsu +Fx8/f3WWo5rXcDT2Uh25Z3roev8BVG3bLA28cng7Q+MqLiXSWR7dkftOowSxX+gh +zrKEaKRR/U6MhkJeH/jCm1L3uyeZDzdre7RUf2I6V+GO8l5/W6psz+1aPjvcjm/f +N7lY7VWS41yXG6jWqctAiSsclml1yRGLHjpzNw6agQKBgQD9ASs6jsnCPJOVu/6R +7X/JcMhlMBT51DtWKbB+ywm0MrLkyeUFS4J1W5G/L3HTQquvxwMeMCCqotL3bJ/G +wyoFasC1HuBEN+J//3Kocir3PjkUtjoqqq9cPy/4gA6Pjlq/U/n6A5kbt6d74+0f +qGFH0O72TVexd8i6h4+KGzNZAwKBgQDA+lfffMHH6qVE4aTphfVKvJukbbTPwRYT +/bKbqx0mdrEMvemadv7Iv4r9cYD65C/CAGUMRfQOqunE+LXHm1IqbMF0PdNz+bik +2xPZT41jwqlfNnRQ7CrMIUU9lgNaw8NpSDu55ymRiKwQHMs4X9xNTBl5W90/5GFi +hbXPKyC5eQKBgQCe0gEE/WWB3Oz4bc7cZC53kaj6fDhuq9+jsv/sWCB7Uegi3uo5 +bLE0YosXbP0TFSMZcOBwLt4Sv6uXTkTuTM0wIVdfW0aFDF/O4dhkDWcTVagXbF0P +M55pVfETGbAKRd6JhHnDjEass5kbmHTeDqEip/GaA+ssqHkFPtvIYlLVaQKBgFmE +h7i7RaT4Oxwd1AMjyeqWXVjEL0jkV9qEKBNAKDCMhIrVmgS2SHBVMiNpQJyht2m2 +BynPVWxsai6d9K0YZuAZPRAwEePNppKKscVvurXZOfpZ51EWjK/OizELYpj7EK3I +/TO6gLTrAm4i/T40cZxFvddm/tZBmc87GWB1sCN5AoGBAMQDPvKsyT0nidZN1Na6 +EgkFldQDGb44bv/kdnyQnDX9jhlm2adE7MswblH+O8O/vc3vvrS87oAs34d7xDiB +FSqPtG9ZLb/URZM+oP5TfDpo2oQs5M/fFtxRj/DRHr8yI96cmn7iMgcflI3g7etn +99Tz6Wbg1Hl0fXaB8wPcdp23 +-----END PRIVATE KEY----- diff --git a/tests/certs/pem/intermediate_self_signed_certificate.crt b/tests/certs/pem/intermediate_self_signed_certificate.crt new file mode 100644 index 0000000..41d154e --- /dev/null +++ b/tests/certs/pem/intermediate_self_signed_certificate.crt @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDDzCCAfegAwIBAgIUGxspvdHEbZsghdL2KkSZQEE9MlowDQYJKoZIhvcNAQEL +BQAwFzEVMBMGA1UEAwwMaW50ZXJtZWRpYXRlMB4XDTIzMDgwNDEyNTAyM1oXDTI0 +MDgwMzEyNTAyM1owFzEVMBMGA1UEAwwMaW50ZXJtZWRpYXRlMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvrhKaGdIZaPT7HMIVA3qVDXmaBMQmJrdrRXy +WYxrfcn/ITK7FxLcaKKZarBObLNRs/V2cuc38zls8HR1bRqMvNoCYjHma99Z+w8t +Oa1cWN9dHXW27rIzJxYOqtyUn+Sf28tqM0hnf564JcSM8hEUJEOPj+EeNrpTOvv/ +c6SnZ9GUNbVMbkEtwI7RiZMz6e93Q1aXqklr7W7obK7s58ovh+4TK/A/AvQMRSVX +MqvzynanJ6vVM5+1a6A1sU4wgEGdi3RqTHD4ZkYPdAJPbXo3Y2E2NdFwz0jllYnN +Ov9O1R2LMQr1PXHUfEC+zD/GEx2FKIIg5giZqIT1pcS6l/g9awIDAQABo1MwUTAd +BgNVHQ4EFgQUkBe/Meaxi+4cO1BdrMewTaFfPt0wHwYDVR0jBBgwFoAUkBe/Meax +i+4cO1BdrMewTaFfPt0wDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC +AQEAkcn90Hj/GrQTRPBtaKA+/OQknHT0crGGifrdgizZXrv7Au2+RBYFVBrNKOVN +06bD0PMfS1IbMkevKCJ02x/ibbj3zNCrMlZuBEJfVV5dFz77kQZecfkysNORZCod +cm6I8d7HReQUAL3i3RequXEPQedE3poioeAj2vIWNX8EDo6lLmOwIn6f+JPmEfJR +o3znybe8A+fUvNC7yq9/YC89/wLrWU6+Qt8prb5gqjjmcNxNfBLhWIHU0Zsoy1u8 +z7L2rFywyOlnD7+VUSU1ZI3ov1cDLCCYjCGRwrM5jg4sjXNuwXl9UqqHs1WDtteU +kBrbaNEALwftYHpamABSypNUKw== +-----END CERTIFICATE----- diff --git a/tests/certs/pem/kustomization.yaml b/tests/certs/pem/kustomization.yaml new file mode 100644 index 0000000..58fad0a --- /dev/null +++ b/tests/certs/pem/kustomization.yaml @@ -0,0 +1,19 @@ +--- +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +configMapGenerator: + - name: pem-broken-certificate + files: + - broken_certificate.pem + - name: pem-chain-certificate + files: + - chain_certificate.pem + - name: pem-with-password-certificate + files: + - with_password_certificate.pem + - name: pem-without-password-certificate + files: + - with_password_certificate.pem + +generatorOptions: + disableNameSuffixHash: true diff --git a/tests/certs/pem/root_certificate.pem b/tests/certs/pem/root_certificate.pem new file mode 100644 index 0000000..58b331f --- /dev/null +++ b/tests/certs/pem/root_certificate.pem @@ -0,0 +1,47 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDQ17XqXGLxFagf +c8+o3k3N7+MSyoe6hTGdrGs/6puL7+p98+4RUxgidUCH9PtfB5mz77BxkJrAnMVG +4kE5aAe3S072y8QAB7ZX7toTDpO5lSBi43rqraylJHDK1IMwF8AfaTmai+WSu7JW +LeG/A2soZcOtG/mDL8KryVzGHbUKHA7pOFNvsG03tDtHbcaAVr8y5sLQmWDlVrgt +jNhsgej6/3SgT/ke/SSUmNz/UZnK8Fp0E15HXiE6p3ZgqTLorgcu4Jnwt+u5V2/s +TdSv4Mlrzszh5gmJU8vOfTX4jXyoc5YJqEYAcQYAXaayyfgvXMrxjUQNpJpiwGs9 +MDA4OgcrAgMBAAECggEAUr6EtxxvnzGDcSLDjha2IPgAsftIl6AaLmyX+bUMd/9Q +myLAmmCf2Vc3gCaSSe6K+X3oHLa8ecAjcZhHW2VaWUcfPC0ztQdZObHK+W33Hbp2 +IHgcxUqWcr/jaJmWeMGQP2HDjvYKuX5ghECdhr7mABWB196Tl2Se7s1TUrOGfUA1 +HUuSK0j71XsU8Nf8E/+YwBsjdtCXZWgzX1M1Wr9CeZ5aPmiIQ0LTQhqwrAi5DrQg +XAIuK2xLB1ewFzvAbo0RrksHzLh9vv+U7tzqGscFo41Gb6HgP1uiBR9W6pIy82eH +yWdYls6SVrc/4ZMwgvKeemwd/4KZK/FP/1OQT0MvwQKBgQD18GagIh1pzJrpD/cD +oTE3nCywyW5c/D53hSLBtD8JkI2d/DPRauj+6HHxJ0hcz3EQQnTfPUXXhRDATU1a +yEeQtLCeZRNskK4AcKcRdMA+M0nzrUdFmWgzX8nitwGlFgCn0uauMvXmGXg8P7Zz +2DwfrmOcqNz4QK+5wprHseek0QKBgQDZYtEdOF2vQcfNaoFDChiHLXkGUN+rnOhy +vxqtYtspyKZKOJReo9wVYEwK86/TW7W4kwp4hEN8XmNj//Us6VAUmlw/sZPKd56m +ffrKpeO1m+ipXEo3I0l/xwEh5wyG7dFeUl6/Cke1UB2vdGgROYoRX0FPuw9wnZgj +L9EjU2UbOwKBgQDa7lotCrFsUTtFZXTawk9x1ZDi/y1DkTh6ZQX/sVi8RvYKQUxP +jABFit6Dchi0peVcOAyZ/Y2CwW2cAjRuMAOlCXSATDHyXwjGU4Ilw+yucjHOvd3I +UzuzH/4z1/2a2+9RdijrwWmsn9esqnrcvQ0olrEN8DRkuhC0KExooDI5QQKBgHgy +sGeUvBBkseJ96l00Ht3XodyBKTuNteWEj26hg4c1/+R4Jmmx9sYHCeTgWy7lvbQB +8b8zetEwq4omg91CYFoUA7/gI1THEX0DmYEleqP3Qg0rD4ovQ7uYQKMLSxzsMGET +8Hl3aLDzTIawOb6Ubygt4EICr4XYTb/e96etu/DzAoGAS20wk+hJ5dfmhyxD47lB +MMTe4MzXx4je6kcv67ycFNV+iOtwQ8BsGtLupdBzCeVlZ1AGmpKDA1xlkOMQQz9z +mf0w7bMJSv9t1YeIfGYMhhslITp+AD0lNdtx6TZMjnK1YZGjoDrxKFt9AQ7NZ8L6 +T1D931ColqjidfDFGZM4z94= +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIC/zCCAeegAwIBAgIUaluTAKmmzwXoeWL2iAaMRQRoiTwwDQYJKoZIhvcNAQEL +BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yMzA4MDQxMjUwMjNaFw0yNDA4MDMxMjUw +MjNaMA8xDTALBgNVBAMMBHJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQDQ17XqXGLxFagfc8+o3k3N7+MSyoe6hTGdrGs/6puL7+p98+4RUxgidUCH +9PtfB5mz77BxkJrAnMVG4kE5aAe3S072y8QAB7ZX7toTDpO5lSBi43rqraylJHDK +1IMwF8AfaTmai+WSu7JWLeG/A2soZcOtG/mDL8KryVzGHbUKHA7pOFNvsG03tDtH +bcaAVr8y5sLQmWDlVrgtjNhsgej6/3SgT/ke/SSUmNz/UZnK8Fp0E15HXiE6p3Zg +qTLorgcu4Jnwt+u5V2/sTdSv4Mlrzszh5gmJU8vOfTX4jXyoc5YJqEYAcQYAXaay +yfgvXMrxjUQNpJpiwGs9MDA4OgcrAgMBAAGjUzBRMB0GA1UdDgQWBBTUGCpkA3La +DITQ75GRereRqS9pZDAfBgNVHSMEGDAWgBTUGCpkA3LaDITQ75GRereRqS9pZDAP +BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBChGiup3H5rqZORnIa +huKCWyB0Yl0AoROfm71k99RyzfztKM02S5Jp5in1miweLfLgXpnOj9AzvFDoHfEz +i4K87p1MMfJREOJWfCIVYPB29VNDcPKeeDsoUMV4KTjFJQ00yBl7C5qlb6ZEcgNa +IuTfw8iJPJKbwVELSV9Tp7vBZTkHAFexhMaVzfYqgOxAN1tlSdfk1CL5/ubct3wf +oTJ6jPEi0kBT2oi6aNr2pt/CJnqATItPa5f07Zn1tgfn5TFUXSWbye03Y98jJEZp +LGowDDgPGan1QUsaI4SJCa9ozH7oVOUav0zPXAHCc1o4Fe129Q5W6mkTZU9MLCD0 +Pqfg +-----END CERTIFICATE----- diff --git a/tests/certs/pem/root_private_key.key b/tests/certs/pem/root_private_key.key new file mode 100644 index 0000000..8585899 --- /dev/null +++ b/tests/certs/pem/root_private_key.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDQ17XqXGLxFagf +c8+o3k3N7+MSyoe6hTGdrGs/6puL7+p98+4RUxgidUCH9PtfB5mz77BxkJrAnMVG +4kE5aAe3S072y8QAB7ZX7toTDpO5lSBi43rqraylJHDK1IMwF8AfaTmai+WSu7JW +LeG/A2soZcOtG/mDL8KryVzGHbUKHA7pOFNvsG03tDtHbcaAVr8y5sLQmWDlVrgt +jNhsgej6/3SgT/ke/SSUmNz/UZnK8Fp0E15HXiE6p3ZgqTLorgcu4Jnwt+u5V2/s +TdSv4Mlrzszh5gmJU8vOfTX4jXyoc5YJqEYAcQYAXaayyfgvXMrxjUQNpJpiwGs9 +MDA4OgcrAgMBAAECggEAUr6EtxxvnzGDcSLDjha2IPgAsftIl6AaLmyX+bUMd/9Q +myLAmmCf2Vc3gCaSSe6K+X3oHLa8ecAjcZhHW2VaWUcfPC0ztQdZObHK+W33Hbp2 +IHgcxUqWcr/jaJmWeMGQP2HDjvYKuX5ghECdhr7mABWB196Tl2Se7s1TUrOGfUA1 +HUuSK0j71XsU8Nf8E/+YwBsjdtCXZWgzX1M1Wr9CeZ5aPmiIQ0LTQhqwrAi5DrQg +XAIuK2xLB1ewFzvAbo0RrksHzLh9vv+U7tzqGscFo41Gb6HgP1uiBR9W6pIy82eH +yWdYls6SVrc/4ZMwgvKeemwd/4KZK/FP/1OQT0MvwQKBgQD18GagIh1pzJrpD/cD +oTE3nCywyW5c/D53hSLBtD8JkI2d/DPRauj+6HHxJ0hcz3EQQnTfPUXXhRDATU1a +yEeQtLCeZRNskK4AcKcRdMA+M0nzrUdFmWgzX8nitwGlFgCn0uauMvXmGXg8P7Zz +2DwfrmOcqNz4QK+5wprHseek0QKBgQDZYtEdOF2vQcfNaoFDChiHLXkGUN+rnOhy +vxqtYtspyKZKOJReo9wVYEwK86/TW7W4kwp4hEN8XmNj//Us6VAUmlw/sZPKd56m +ffrKpeO1m+ipXEo3I0l/xwEh5wyG7dFeUl6/Cke1UB2vdGgROYoRX0FPuw9wnZgj +L9EjU2UbOwKBgQDa7lotCrFsUTtFZXTawk9x1ZDi/y1DkTh6ZQX/sVi8RvYKQUxP +jABFit6Dchi0peVcOAyZ/Y2CwW2cAjRuMAOlCXSATDHyXwjGU4Ilw+yucjHOvd3I +UzuzH/4z1/2a2+9RdijrwWmsn9esqnrcvQ0olrEN8DRkuhC0KExooDI5QQKBgHgy +sGeUvBBkseJ96l00Ht3XodyBKTuNteWEj26hg4c1/+R4Jmmx9sYHCeTgWy7lvbQB +8b8zetEwq4omg91CYFoUA7/gI1THEX0DmYEleqP3Qg0rD4ovQ7uYQKMLSxzsMGET +8Hl3aLDzTIawOb6Ubygt4EICr4XYTb/e96etu/DzAoGAS20wk+hJ5dfmhyxD47lB +MMTe4MzXx4je6kcv67ycFNV+iOtwQ8BsGtLupdBzCeVlZ1AGmpKDA1xlkOMQQz9z +mf0w7bMJSv9t1YeIfGYMhhslITp+AD0lNdtx6TZMjnK1YZGjoDrxKFt9AQ7NZ8L6 +T1D931ColqjidfDFGZM4z94= +-----END PRIVATE KEY----- diff --git a/tests/certs/pem/root_private_key.pem b/tests/certs/pem/root_private_key.pem new file mode 100644 index 0000000..8585899 --- /dev/null +++ b/tests/certs/pem/root_private_key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDQ17XqXGLxFagf +c8+o3k3N7+MSyoe6hTGdrGs/6puL7+p98+4RUxgidUCH9PtfB5mz77BxkJrAnMVG +4kE5aAe3S072y8QAB7ZX7toTDpO5lSBi43rqraylJHDK1IMwF8AfaTmai+WSu7JW +LeG/A2soZcOtG/mDL8KryVzGHbUKHA7pOFNvsG03tDtHbcaAVr8y5sLQmWDlVrgt +jNhsgej6/3SgT/ke/SSUmNz/UZnK8Fp0E15HXiE6p3ZgqTLorgcu4Jnwt+u5V2/s +TdSv4Mlrzszh5gmJU8vOfTX4jXyoc5YJqEYAcQYAXaayyfgvXMrxjUQNpJpiwGs9 +MDA4OgcrAgMBAAECggEAUr6EtxxvnzGDcSLDjha2IPgAsftIl6AaLmyX+bUMd/9Q +myLAmmCf2Vc3gCaSSe6K+X3oHLa8ecAjcZhHW2VaWUcfPC0ztQdZObHK+W33Hbp2 +IHgcxUqWcr/jaJmWeMGQP2HDjvYKuX5ghECdhr7mABWB196Tl2Se7s1TUrOGfUA1 +HUuSK0j71XsU8Nf8E/+YwBsjdtCXZWgzX1M1Wr9CeZ5aPmiIQ0LTQhqwrAi5DrQg +XAIuK2xLB1ewFzvAbo0RrksHzLh9vv+U7tzqGscFo41Gb6HgP1uiBR9W6pIy82eH +yWdYls6SVrc/4ZMwgvKeemwd/4KZK/FP/1OQT0MvwQKBgQD18GagIh1pzJrpD/cD +oTE3nCywyW5c/D53hSLBtD8JkI2d/DPRauj+6HHxJ0hcz3EQQnTfPUXXhRDATU1a +yEeQtLCeZRNskK4AcKcRdMA+M0nzrUdFmWgzX8nitwGlFgCn0uauMvXmGXg8P7Zz +2DwfrmOcqNz4QK+5wprHseek0QKBgQDZYtEdOF2vQcfNaoFDChiHLXkGUN+rnOhy +vxqtYtspyKZKOJReo9wVYEwK86/TW7W4kwp4hEN8XmNj//Us6VAUmlw/sZPKd56m +ffrKpeO1m+ipXEo3I0l/xwEh5wyG7dFeUl6/Cke1UB2vdGgROYoRX0FPuw9wnZgj +L9EjU2UbOwKBgQDa7lotCrFsUTtFZXTawk9x1ZDi/y1DkTh6ZQX/sVi8RvYKQUxP +jABFit6Dchi0peVcOAyZ/Y2CwW2cAjRuMAOlCXSATDHyXwjGU4Ilw+yucjHOvd3I +UzuzH/4z1/2a2+9RdijrwWmsn9esqnrcvQ0olrEN8DRkuhC0KExooDI5QQKBgHgy +sGeUvBBkseJ96l00Ht3XodyBKTuNteWEj26hg4c1/+R4Jmmx9sYHCeTgWy7lvbQB +8b8zetEwq4omg91CYFoUA7/gI1THEX0DmYEleqP3Qg0rD4ovQ7uYQKMLSxzsMGET +8Hl3aLDzTIawOb6Ubygt4EICr4XYTb/e96etu/DzAoGAS20wk+hJ5dfmhyxD47lB +MMTe4MzXx4je6kcv67ycFNV+iOtwQ8BsGtLupdBzCeVlZ1AGmpKDA1xlkOMQQz9z +mf0w7bMJSv9t1YeIfGYMhhslITp+AD0lNdtx6TZMjnK1YZGjoDrxKFt9AQ7NZ8L6 +T1D931ColqjidfDFGZM4z94= +-----END PRIVATE KEY----- diff --git a/tests/certs/pem/root_self_signed_certificate.crt b/tests/certs/pem/root_self_signed_certificate.crt new file mode 100644 index 0000000..6eae85e --- /dev/null +++ b/tests/certs/pem/root_self_signed_certificate.crt @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIC/zCCAeegAwIBAgIUaluTAKmmzwXoeWL2iAaMRQRoiTwwDQYJKoZIhvcNAQEL +BQAwDzENMAsGA1UEAwwEcm9vdDAeFw0yMzA4MDQxMjUwMjNaFw0yNDA4MDMxMjUw +MjNaMA8xDTALBgNVBAMMBHJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQDQ17XqXGLxFagfc8+o3k3N7+MSyoe6hTGdrGs/6puL7+p98+4RUxgidUCH +9PtfB5mz77BxkJrAnMVG4kE5aAe3S072y8QAB7ZX7toTDpO5lSBi43rqraylJHDK +1IMwF8AfaTmai+WSu7JWLeG/A2soZcOtG/mDL8KryVzGHbUKHA7pOFNvsG03tDtH +bcaAVr8y5sLQmWDlVrgtjNhsgej6/3SgT/ke/SSUmNz/UZnK8Fp0E15HXiE6p3Zg +qTLorgcu4Jnwt+u5V2/sTdSv4Mlrzszh5gmJU8vOfTX4jXyoc5YJqEYAcQYAXaay +yfgvXMrxjUQNpJpiwGs9MDA4OgcrAgMBAAGjUzBRMB0GA1UdDgQWBBTUGCpkA3La +DITQ75GRereRqS9pZDAfBgNVHSMEGDAWgBTUGCpkA3LaDITQ75GRereRqS9pZDAP +BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBChGiup3H5rqZORnIa +huKCWyB0Yl0AoROfm71k99RyzfztKM02S5Jp5in1miweLfLgXpnOj9AzvFDoHfEz +i4K87p1MMfJREOJWfCIVYPB29VNDcPKeeDsoUMV4KTjFJQ00yBl7C5qlb6ZEcgNa +IuTfw8iJPJKbwVELSV9Tp7vBZTkHAFexhMaVzfYqgOxAN1tlSdfk1CL5/ubct3wf +oTJ6jPEi0kBT2oi6aNr2pt/CJnqATItPa5f07Zn1tgfn5TFUXSWbye03Y98jJEZp +LGowDDgPGan1QUsaI4SJCa9ozH7oVOUav0zPXAHCc1o4Fe129Q5W6mkTZU9MLCD0 +Pqfg +-----END CERTIFICATE----- diff --git a/tests/certs/pem/with_password_certificate.pem b/tests/certs/pem/with_password_certificate.pem new file mode 100644 index 0000000..0a26819 --- /dev/null +++ b/tests/certs/pem/with_password_certificate.pem @@ -0,0 +1,47 @@ +-----BEGIN PRIVATE KEY----- +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDVOBzkZMbNhX64 +GSF0Xc8D/WjRNZUTUUMQeio3wdU1sYHykwzfmjmnhZjcBpggE5Qgg5+GFexLMgjq +UkzB7o+s3hAlBR9fzbXQiPtholYr56opPEwhBXrs2pVI8BjSGTXZ038Ubplnaztr +gsqtBrzdGYp+Dr06T+JodL6U0bVjLy43Ev4akAyDOdxzH4dqlMuLlpeDXkDt7sDj +wKjZ3y9yFSadeX+luY0EkrawIKJAJk0TH6x2nO6cgYLphOwyU6O97/w//sW+pPud +zqrTgvYt9irGRSqDzkqKnIQfMBRuMOcRrFKvxpOztVt6PDS7mAHsYKpsA2SPw5k3 ++uPG5H0NAgMBAAECggEABooUCMU2e7MuccMDjaga40pwXopAKjmBzw2QIeml+mGZ +VLFB4dG/Fu44A/eHzuQK1Px0dg5SEvRT5avkgsYoTer5n8kKb0vF2cF5xELQVcRj +KaSZySF75avGjFggysDPMAEWkq/ZsJxPVDrMsIXWYQmZf8g/8Xvlu8Jo3fOYlpQb +h4wqgsDJXzcJS5KeRYv6rgL8EnBCIg8SBW8xWM1wjvsD0/rkEQt/6y08JWjOdm7+ +B09lHYtea3XxLgHSMnEWAvx+ktEYr2TRlikRvIaZsl6fp+AMnv+TNW4C6GowRC+d +9/wybCKYgJQ/yBrFvWDWLg6+IPsp4mJcPEiJYVT/WQKBgQDtToYVAHKewqHXF7Uw +n5TZT9cXNefpcSHdOvzsSUoS7LU1WIabEA93Tu8HzH2RiRYXLpj7TsKOxrivAPVf +Mcahy99Hkk1QPoidZLcrWB/kyF9dYMNr8LgGFuZAX1SFM71ZOxIGa4Z0PWG6B8Xk +BqN0Li4zEchjWFGkGbDRCUWuzwKBgQDmA9hNWN38Zh0thrraNfPx+tXoDLg+OqxG +LI7oog7zthTzLi/EPhgA/ZR8Xw7Uskr+UuVlYd50XL5Na1zVkNE3bcw9jeT6JoKk +qFLcw26AlrXgLsc4tbRtFIssQqW5uE0SF4lvHy98CHGkdXLE18eF/L4IU7KdrRj6 +o+wfPTCtYwKBgQCdaBuaLKza0AFn2irucLvcFZB3reMBvnAW/byswsRmnypnkyve +CR4pJmt5AdQ8x/CmOdtxvsFg0UHJm1om5a56ve+B2vJ7iq81r4usLY0iRSK0nq2h +mI+IQoJCKrm2jSZI3NzM81/BFMIREnzaDuk29Dbi2yXPd9LXhc76KStWkwKBgQDC +jZQCcF1rZM/fNyuK8MHC9mDB4yhf8m7O+Fd0a8br2yJDQtjCS6cwB0z2Gc1ImPoX +vfQsWai4kc2hXGNsfQ6JrMRpeECqWbJ9JabY9jDccR2rXsXBsOfIr+y75i+ZNEt0 +NxZXOHCIn/fHnFQULVOlgE8YafsVpVkQf2B0V+R5cwKBgQCTiZgcKhcj9LP3vVuO +siU8IvdDBjfaG3JfntM4qNIoWOu7T5meLuQxQ++/U3vl/S+3kgJHA+SFTSokOLv8 +A75cXAuGAJJzFCzrpGc0NVrDPgknfuxI/Q8/adg8dOZ+2ipwHhavcQLVbvAVIYhN +x1p1BElyGO1rInCAMqXDJGBVkg== +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIDETCCAfmgAwIBAgIUXXG97RzJc0DJoY9w89nwwBcIWp8wDQYJKoZIhvcNAQEL +BQAwGDEWMBQGA1UEAwwNd2l0aF9wYXNzd29yZDAeFw0yMzA4MDQxMjUwMjNaFw0y +NDA4MDMxMjUwMjNaMBgxFjAUBgNVBAMMDXdpdGhfcGFzc3dvcmQwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVOBzkZMbNhX64GSF0Xc8D/WjRNZUTUUMQ +eio3wdU1sYHykwzfmjmnhZjcBpggE5Qgg5+GFexLMgjqUkzB7o+s3hAlBR9fzbXQ +iPtholYr56opPEwhBXrs2pVI8BjSGTXZ038UbplnaztrgsqtBrzdGYp+Dr06T+Jo +dL6U0bVjLy43Ev4akAyDOdxzH4dqlMuLlpeDXkDt7sDjwKjZ3y9yFSadeX+luY0E +krawIKJAJk0TH6x2nO6cgYLphOwyU6O97/w//sW+pPudzqrTgvYt9irGRSqDzkqK +nIQfMBRuMOcRrFKvxpOztVt6PDS7mAHsYKpsA2SPw5k3+uPG5H0NAgMBAAGjUzBR +MB0GA1UdDgQWBBQv+zjx48FQARo0pX2xJAQ98p31qjAfBgNVHSMEGDAWgBQv+zjx +48FQARo0pX2xJAQ98p31qjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUA +A4IBAQBdFDE7JmxjgPy9paqaUeiBOLEHv47GGp7TGcsOa2qjD2+hBJJoaeJS0GEi +nmyceYLAM1IG8Q4FXdMh9eZQ+a8Cm7AYMBkqUSzyiznZuSX3XUGublTL95US9zbD +ZBDNaQqfVU2tbnKu/4KtShKGNIm+/WrdCcjAtTXj6YgFDrHQ9CjvVPsqb/m4oexI +r1hqIpLYAj69jGovn/1YIZrliR6GWlHL10lhbnXBGrJXTDjcG3BM27ZRc+jjUJma +Eeo8Ggq8sej2uYld/tJvP4dYpIkmp5/emsz7JiTJ+jDWbY4BoyPbPr1Ql4q3b5M1 +gcQlxtpMSICEHu1lez5YSQ9L/lV6 +-----END CERTIFICATE----- diff --git a/tests/certs/pem/with_password_private_key.key b/tests/certs/pem/with_password_private_key.key new file mode 100644 index 0000000..68307d4 --- /dev/null +++ b/tests/certs/pem/with_password_private_key.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDVOBzkZMbNhX64 +GSF0Xc8D/WjRNZUTUUMQeio3wdU1sYHykwzfmjmnhZjcBpggE5Qgg5+GFexLMgjq +UkzB7o+s3hAlBR9fzbXQiPtholYr56opPEwhBXrs2pVI8BjSGTXZ038Ubplnaztr +gsqtBrzdGYp+Dr06T+JodL6U0bVjLy43Ev4akAyDOdxzH4dqlMuLlpeDXkDt7sDj +wKjZ3y9yFSadeX+luY0EkrawIKJAJk0TH6x2nO6cgYLphOwyU6O97/w//sW+pPud +zqrTgvYt9irGRSqDzkqKnIQfMBRuMOcRrFKvxpOztVt6PDS7mAHsYKpsA2SPw5k3 ++uPG5H0NAgMBAAECggEABooUCMU2e7MuccMDjaga40pwXopAKjmBzw2QIeml+mGZ +VLFB4dG/Fu44A/eHzuQK1Px0dg5SEvRT5avkgsYoTer5n8kKb0vF2cF5xELQVcRj +KaSZySF75avGjFggysDPMAEWkq/ZsJxPVDrMsIXWYQmZf8g/8Xvlu8Jo3fOYlpQb +h4wqgsDJXzcJS5KeRYv6rgL8EnBCIg8SBW8xWM1wjvsD0/rkEQt/6y08JWjOdm7+ +B09lHYtea3XxLgHSMnEWAvx+ktEYr2TRlikRvIaZsl6fp+AMnv+TNW4C6GowRC+d +9/wybCKYgJQ/yBrFvWDWLg6+IPsp4mJcPEiJYVT/WQKBgQDtToYVAHKewqHXF7Uw +n5TZT9cXNefpcSHdOvzsSUoS7LU1WIabEA93Tu8HzH2RiRYXLpj7TsKOxrivAPVf +Mcahy99Hkk1QPoidZLcrWB/kyF9dYMNr8LgGFuZAX1SFM71ZOxIGa4Z0PWG6B8Xk +BqN0Li4zEchjWFGkGbDRCUWuzwKBgQDmA9hNWN38Zh0thrraNfPx+tXoDLg+OqxG +LI7oog7zthTzLi/EPhgA/ZR8Xw7Uskr+UuVlYd50XL5Na1zVkNE3bcw9jeT6JoKk +qFLcw26AlrXgLsc4tbRtFIssQqW5uE0SF4lvHy98CHGkdXLE18eF/L4IU7KdrRj6 +o+wfPTCtYwKBgQCdaBuaLKza0AFn2irucLvcFZB3reMBvnAW/byswsRmnypnkyve +CR4pJmt5AdQ8x/CmOdtxvsFg0UHJm1om5a56ve+B2vJ7iq81r4usLY0iRSK0nq2h +mI+IQoJCKrm2jSZI3NzM81/BFMIREnzaDuk29Dbi2yXPd9LXhc76KStWkwKBgQDC +jZQCcF1rZM/fNyuK8MHC9mDB4yhf8m7O+Fd0a8br2yJDQtjCS6cwB0z2Gc1ImPoX +vfQsWai4kc2hXGNsfQ6JrMRpeECqWbJ9JabY9jDccR2rXsXBsOfIr+y75i+ZNEt0 +NxZXOHCIn/fHnFQULVOlgE8YafsVpVkQf2B0V+R5cwKBgQCTiZgcKhcj9LP3vVuO +siU8IvdDBjfaG3JfntM4qNIoWOu7T5meLuQxQ++/U3vl/S+3kgJHA+SFTSokOLv8 +A75cXAuGAJJzFCzrpGc0NVrDPgknfuxI/Q8/adg8dOZ+2ipwHhavcQLVbvAVIYhN +x1p1BElyGO1rInCAMqXDJGBVkg== +-----END PRIVATE KEY----- diff --git a/tests/certs/pem/with_password_private_key.pem b/tests/certs/pem/with_password_private_key.pem new file mode 100644 index 0000000..68307d4 --- /dev/null +++ b/tests/certs/pem/with_password_private_key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDVOBzkZMbNhX64 +GSF0Xc8D/WjRNZUTUUMQeio3wdU1sYHykwzfmjmnhZjcBpggE5Qgg5+GFexLMgjq +UkzB7o+s3hAlBR9fzbXQiPtholYr56opPEwhBXrs2pVI8BjSGTXZ038Ubplnaztr +gsqtBrzdGYp+Dr06T+JodL6U0bVjLy43Ev4akAyDOdxzH4dqlMuLlpeDXkDt7sDj +wKjZ3y9yFSadeX+luY0EkrawIKJAJk0TH6x2nO6cgYLphOwyU6O97/w//sW+pPud +zqrTgvYt9irGRSqDzkqKnIQfMBRuMOcRrFKvxpOztVt6PDS7mAHsYKpsA2SPw5k3 ++uPG5H0NAgMBAAECggEABooUCMU2e7MuccMDjaga40pwXopAKjmBzw2QIeml+mGZ +VLFB4dG/Fu44A/eHzuQK1Px0dg5SEvRT5avkgsYoTer5n8kKb0vF2cF5xELQVcRj +KaSZySF75avGjFggysDPMAEWkq/ZsJxPVDrMsIXWYQmZf8g/8Xvlu8Jo3fOYlpQb +h4wqgsDJXzcJS5KeRYv6rgL8EnBCIg8SBW8xWM1wjvsD0/rkEQt/6y08JWjOdm7+ +B09lHYtea3XxLgHSMnEWAvx+ktEYr2TRlikRvIaZsl6fp+AMnv+TNW4C6GowRC+d +9/wybCKYgJQ/yBrFvWDWLg6+IPsp4mJcPEiJYVT/WQKBgQDtToYVAHKewqHXF7Uw +n5TZT9cXNefpcSHdOvzsSUoS7LU1WIabEA93Tu8HzH2RiRYXLpj7TsKOxrivAPVf +Mcahy99Hkk1QPoidZLcrWB/kyF9dYMNr8LgGFuZAX1SFM71ZOxIGa4Z0PWG6B8Xk +BqN0Li4zEchjWFGkGbDRCUWuzwKBgQDmA9hNWN38Zh0thrraNfPx+tXoDLg+OqxG +LI7oog7zthTzLi/EPhgA/ZR8Xw7Uskr+UuVlYd50XL5Na1zVkNE3bcw9jeT6JoKk +qFLcw26AlrXgLsc4tbRtFIssQqW5uE0SF4lvHy98CHGkdXLE18eF/L4IU7KdrRj6 +o+wfPTCtYwKBgQCdaBuaLKza0AFn2irucLvcFZB3reMBvnAW/byswsRmnypnkyve +CR4pJmt5AdQ8x/CmOdtxvsFg0UHJm1om5a56ve+B2vJ7iq81r4usLY0iRSK0nq2h +mI+IQoJCKrm2jSZI3NzM81/BFMIREnzaDuk29Dbi2yXPd9LXhc76KStWkwKBgQDC +jZQCcF1rZM/fNyuK8MHC9mDB4yhf8m7O+Fd0a8br2yJDQtjCS6cwB0z2Gc1ImPoX +vfQsWai4kc2hXGNsfQ6JrMRpeECqWbJ9JabY9jDccR2rXsXBsOfIr+y75i+ZNEt0 +NxZXOHCIn/fHnFQULVOlgE8YafsVpVkQf2B0V+R5cwKBgQCTiZgcKhcj9LP3vVuO +siU8IvdDBjfaG3JfntM4qNIoWOu7T5meLuQxQ++/U3vl/S+3kgJHA+SFTSokOLv8 +A75cXAuGAJJzFCzrpGc0NVrDPgknfuxI/Q8/adg8dOZ+2ipwHhavcQLVbvAVIYhN +x1p1BElyGO1rInCAMqXDJGBVkg== +-----END PRIVATE KEY----- diff --git a/tests/certs/pem/with_password_self_signed_certificate.crt b/tests/certs/pem/with_password_self_signed_certificate.crt new file mode 100644 index 0000000..fc5310c --- /dev/null +++ b/tests/certs/pem/with_password_self_signed_certificate.crt @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDETCCAfmgAwIBAgIUXXG97RzJc0DJoY9w89nwwBcIWp8wDQYJKoZIhvcNAQEL +BQAwGDEWMBQGA1UEAwwNd2l0aF9wYXNzd29yZDAeFw0yMzA4MDQxMjUwMjNaFw0y +NDA4MDMxMjUwMjNaMBgxFjAUBgNVBAMMDXdpdGhfcGFzc3dvcmQwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVOBzkZMbNhX64GSF0Xc8D/WjRNZUTUUMQ +eio3wdU1sYHykwzfmjmnhZjcBpggE5Qgg5+GFexLMgjqUkzB7o+s3hAlBR9fzbXQ +iPtholYr56opPEwhBXrs2pVI8BjSGTXZ038UbplnaztrgsqtBrzdGYp+Dr06T+Jo +dL6U0bVjLy43Ev4akAyDOdxzH4dqlMuLlpeDXkDt7sDjwKjZ3y9yFSadeX+luY0E +krawIKJAJk0TH6x2nO6cgYLphOwyU6O97/w//sW+pPudzqrTgvYt9irGRSqDzkqK +nIQfMBRuMOcRrFKvxpOztVt6PDS7mAHsYKpsA2SPw5k3+uPG5H0NAgMBAAGjUzBR +MB0GA1UdDgQWBBQv+zjx48FQARo0pX2xJAQ98p31qjAfBgNVHSMEGDAWgBQv+zjx +48FQARo0pX2xJAQ98p31qjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUA +A4IBAQBdFDE7JmxjgPy9paqaUeiBOLEHv47GGp7TGcsOa2qjD2+hBJJoaeJS0GEi +nmyceYLAM1IG8Q4FXdMh9eZQ+a8Cm7AYMBkqUSzyiznZuSX3XUGublTL95US9zbD +ZBDNaQqfVU2tbnKu/4KtShKGNIm+/WrdCcjAtTXj6YgFDrHQ9CjvVPsqb/m4oexI +r1hqIpLYAj69jGovn/1YIZrliR6GWlHL10lhbnXBGrJXTDjcG3BM27ZRc+jjUJma +Eeo8Ggq8sej2uYld/tJvP4dYpIkmp5/emsz7JiTJ+jDWbY4BoyPbPr1Ql4q3b5M1 +gcQlxtpMSICEHu1lez5YSQ9L/lV6 +-----END CERTIFICATE----- diff --git a/tests/certs/pem/without_password_certificate.pem b/tests/certs/pem/without_password_certificate.pem new file mode 100644 index 0000000..5fe69c6 --- /dev/null +++ b/tests/certs/pem/without_password_certificate.pem @@ -0,0 +1,47 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCtBCcumutp41ek +dbYbQXcpn0MjACpBFtEynE0zYGUkeoiu9kXFCrIC1RIG8I6blMwoD0W38ik/VzpJ +GDlAg4QBNLknYp4PszEVSXrBCdTaPYrdKfwnBWs884+4w3qm2LMrj5mVK7f0TN++ +6NQtWlMfOXPwizF+vgqW4CVOqKb99m4wcd/ah04ok0FSR/Qr6obYtrm+L3xP4i/l +bgrRKB6jCkkN5brtzMUxyf6WI4SDifOkaje4+L1cTR8dBOR3SH8CmmSNCtbQaeOS +AAJwG+Csj1hkSJt1r6a2ZyXmXlE9UZe/DkP+EIYJpNEOesneJLY9mhFCUWYNshyJ +IYiQAe01AgMBAAECggEAGftkbe+GWEuzeudRbmTlofrAgIZTEhy81DqcLlG0xqZf +FdU2c4lwY5P/RcsEw3D0OrTWbbIARzqQbm8kk99cKLkz7+nznhx1C8MR2+Df1dlF +nAJk0zBRYyEZbW/voJQszecd84SR9q4/sIHy8Q+eKXN9iXtBtsyPtwoYmCgkEcGb +hJ5xG9WjVJ/R6fAAtoAtNxLGmqUFS/lZi9Q1iGiv1Kg1z2Eu1j9n9Ie7d/33Xhk6 +pfWY+IqEfPPVmR3mjhXMZlqzTP6iQKAQR/D8dPMfGZC7N4USyXnIo3LGl70XFEbV +N55dbqPKIFZr68w/VrSlXfqgxwshl4jlOciZo8FL4QKBgQDf0Y/WZnlJqTjDZxD0 +8pEutfb0b4wR/KlbrYwkzrWt7nviN1zdtYM3ZmXTmC/jDBskIygUZob78KBpo4y9 +ELRj6t35Q4u7h1kNCqbPMwYEfmENWpy6+Wn7w2d6KvMVHY+hYRtsTG4zDzDJxZxW +IPbB/a/fQ6griY6tvOZWqfu6oQKBgQDF5KEbIKewpGPf5DT1KE0epL4TSskOQc2q +wfIOJ8tFL3XNU/nVYrtjdlQPbUUpTdnKPTmbpEpO4rpexBcbRey7/yiulk3XMyE2 ++s6gNaM0vRfYH/ZabTxOnxMMZcBWL0ag3IuK403U2Dh+fYFv/O82TzkJUIqip+rx +F4bEaATeFQKBgQDeseykLyHPIQjRo+NDVXcPOw6U98guvW7lQTCIDwTGItwwoVVN +ZCVDIid++ZXsG0eGFVTzt2/njeyOL6UBGXXjVPW35nVKCcmZKFgBIYuDPRvj5Zy8 +jR3e2vZCoCltgRRARha7EvEy7JJmsLB1Iidjrb8oLnFNoHjOdX3aDRfjAQKBgFUN +UWy+WTQjQ0Wr6FLhsluURJk4EDePcpyMZMNOuR+QKVpJWFws5gr2hWRn+0yoSA2S +yNqq/sDu01j9gEzZfcjC/rIiqWvvbrwZiYrz4qQ9DS13d0MgJcZIukAez057XSiw +AU19KitrjsRWnrYKCKnX3NSzCBKmhuR9zw9FAaqNAoGAJxa/EzMewYMgddyvtAWs +CIv/E31UxdRKZ2ipGrX+GS7ueMbCk9yu2P3H46AewG9U3QhXMFH707Vdn5yy3cse +ciKyv0Y2OwsiGHP+pEKHBdZdsZZbRf/jUdGz5e2mjNzV+RqCVfufzjrimPE++6jy +HeTJhUVj+eLOOK4Tbccs4VA= +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIDFzCCAf+gAwIBAgIUA72dAywXsfIb/FF/U86SR+xEY8gwDQYJKoZIhvcNAQEL +BQAwGzEZMBcGA1UEAwwQd2l0aG91dF9wYXNzd29yZDAeFw0yMzA4MDQxMjUwMjNa +Fw0yNDA4MDMxMjUwMjNaMBsxGTAXBgNVBAMMEHdpdGhvdXRfcGFzc3dvcmQwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtBCcumutp41ekdbYbQXcpn0Mj +ACpBFtEynE0zYGUkeoiu9kXFCrIC1RIG8I6blMwoD0W38ik/VzpJGDlAg4QBNLkn +Yp4PszEVSXrBCdTaPYrdKfwnBWs884+4w3qm2LMrj5mVK7f0TN++6NQtWlMfOXPw +izF+vgqW4CVOqKb99m4wcd/ah04ok0FSR/Qr6obYtrm+L3xP4i/lbgrRKB6jCkkN +5brtzMUxyf6WI4SDifOkaje4+L1cTR8dBOR3SH8CmmSNCtbQaeOSAAJwG+Csj1hk +SJt1r6a2ZyXmXlE9UZe/DkP+EIYJpNEOesneJLY9mhFCUWYNshyJIYiQAe01AgMB +AAGjUzBRMB0GA1UdDgQWBBTxWajKJf0Fsk4nUNTEmk5qgJf0MDAfBgNVHSMEGDAW +gBTxWajKJf0Fsk4nUNTEmk5qgJf0MDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBDj6eNYQLyisYpLejIRyD1jMshKf26+0i7blxCs7jFsXImDQ0o +ert1tMFD/ghv7PqM5hemFrlu437NKVaXSnQjqxz0tJKnHfDHhJ7McNMqjZhbiXv9 +gIZ/7kMCl2TnW1OQbvXVQyclRkQKy2XbZ+VmK0KaHosIG7PzNXYrEWQO92T+psDP +9gumDGLpEN+G7R7wEnBbimPYnGZunXfDD3gVI2QZud++VjNbfSxNxxUQsk4pWE4x +paMfrkoYQCuyEYQsyRAkG4Nsff6JKzFPZ+V3iVbAW54CiZfh0XF47lFJxJzY6rPg +KqD87Mdw2de4EUOIX1OpOfpnKgOsxHQQ/dAF +-----END CERTIFICATE----- diff --git a/tests/certs/pem/without_password_private_key.key b/tests/certs/pem/without_password_private_key.key new file mode 100644 index 0000000..d6b9f6f --- /dev/null +++ b/tests/certs/pem/without_password_private_key.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCtBCcumutp41ek +dbYbQXcpn0MjACpBFtEynE0zYGUkeoiu9kXFCrIC1RIG8I6blMwoD0W38ik/VzpJ +GDlAg4QBNLknYp4PszEVSXrBCdTaPYrdKfwnBWs884+4w3qm2LMrj5mVK7f0TN++ +6NQtWlMfOXPwizF+vgqW4CVOqKb99m4wcd/ah04ok0FSR/Qr6obYtrm+L3xP4i/l +bgrRKB6jCkkN5brtzMUxyf6WI4SDifOkaje4+L1cTR8dBOR3SH8CmmSNCtbQaeOS +AAJwG+Csj1hkSJt1r6a2ZyXmXlE9UZe/DkP+EIYJpNEOesneJLY9mhFCUWYNshyJ +IYiQAe01AgMBAAECggEAGftkbe+GWEuzeudRbmTlofrAgIZTEhy81DqcLlG0xqZf +FdU2c4lwY5P/RcsEw3D0OrTWbbIARzqQbm8kk99cKLkz7+nznhx1C8MR2+Df1dlF +nAJk0zBRYyEZbW/voJQszecd84SR9q4/sIHy8Q+eKXN9iXtBtsyPtwoYmCgkEcGb +hJ5xG9WjVJ/R6fAAtoAtNxLGmqUFS/lZi9Q1iGiv1Kg1z2Eu1j9n9Ie7d/33Xhk6 +pfWY+IqEfPPVmR3mjhXMZlqzTP6iQKAQR/D8dPMfGZC7N4USyXnIo3LGl70XFEbV +N55dbqPKIFZr68w/VrSlXfqgxwshl4jlOciZo8FL4QKBgQDf0Y/WZnlJqTjDZxD0 +8pEutfb0b4wR/KlbrYwkzrWt7nviN1zdtYM3ZmXTmC/jDBskIygUZob78KBpo4y9 +ELRj6t35Q4u7h1kNCqbPMwYEfmENWpy6+Wn7w2d6KvMVHY+hYRtsTG4zDzDJxZxW +IPbB/a/fQ6griY6tvOZWqfu6oQKBgQDF5KEbIKewpGPf5DT1KE0epL4TSskOQc2q +wfIOJ8tFL3XNU/nVYrtjdlQPbUUpTdnKPTmbpEpO4rpexBcbRey7/yiulk3XMyE2 ++s6gNaM0vRfYH/ZabTxOnxMMZcBWL0ag3IuK403U2Dh+fYFv/O82TzkJUIqip+rx +F4bEaATeFQKBgQDeseykLyHPIQjRo+NDVXcPOw6U98guvW7lQTCIDwTGItwwoVVN +ZCVDIid++ZXsG0eGFVTzt2/njeyOL6UBGXXjVPW35nVKCcmZKFgBIYuDPRvj5Zy8 +jR3e2vZCoCltgRRARha7EvEy7JJmsLB1Iidjrb8oLnFNoHjOdX3aDRfjAQKBgFUN +UWy+WTQjQ0Wr6FLhsluURJk4EDePcpyMZMNOuR+QKVpJWFws5gr2hWRn+0yoSA2S +yNqq/sDu01j9gEzZfcjC/rIiqWvvbrwZiYrz4qQ9DS13d0MgJcZIukAez057XSiw +AU19KitrjsRWnrYKCKnX3NSzCBKmhuR9zw9FAaqNAoGAJxa/EzMewYMgddyvtAWs +CIv/E31UxdRKZ2ipGrX+GS7ueMbCk9yu2P3H46AewG9U3QhXMFH707Vdn5yy3cse +ciKyv0Y2OwsiGHP+pEKHBdZdsZZbRf/jUdGz5e2mjNzV+RqCVfufzjrimPE++6jy +HeTJhUVj+eLOOK4Tbccs4VA= +-----END PRIVATE KEY----- diff --git a/tests/certs/pem/without_password_self_signed_certificate.crt b/tests/certs/pem/without_password_self_signed_certificate.crt new file mode 100644 index 0000000..252b309 --- /dev/null +++ b/tests/certs/pem/without_password_self_signed_certificate.crt @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDFzCCAf+gAwIBAgIUA72dAywXsfIb/FF/U86SR+xEY8gwDQYJKoZIhvcNAQEL +BQAwGzEZMBcGA1UEAwwQd2l0aG91dF9wYXNzd29yZDAeFw0yMzA4MDQxMjUwMjNa +Fw0yNDA4MDMxMjUwMjNaMBsxGTAXBgNVBAMMEHdpdGhvdXRfcGFzc3dvcmQwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtBCcumutp41ekdbYbQXcpn0Mj +ACpBFtEynE0zYGUkeoiu9kXFCrIC1RIG8I6blMwoD0W38ik/VzpJGDlAg4QBNLkn +Yp4PszEVSXrBCdTaPYrdKfwnBWs884+4w3qm2LMrj5mVK7f0TN++6NQtWlMfOXPw +izF+vgqW4CVOqKb99m4wcd/ah04ok0FSR/Qr6obYtrm+L3xP4i/lbgrRKB6jCkkN +5brtzMUxyf6WI4SDifOkaje4+L1cTR8dBOR3SH8CmmSNCtbQaeOSAAJwG+Csj1hk +SJt1r6a2ZyXmXlE9UZe/DkP+EIYJpNEOesneJLY9mhFCUWYNshyJIYiQAe01AgMB +AAGjUzBRMB0GA1UdDgQWBBTxWajKJf0Fsk4nUNTEmk5qgJf0MDAfBgNVHSMEGDAW +gBTxWajKJf0Fsk4nUNTEmk5qgJf0MDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBDj6eNYQLyisYpLejIRyD1jMshKf26+0i7blxCs7jFsXImDQ0o +ert1tMFD/ghv7PqM5hemFrlu437NKVaXSnQjqxz0tJKnHfDHhJ7McNMqjZhbiXv9 +gIZ/7kMCl2TnW1OQbvXVQyclRkQKy2XbZ+VmK0KaHosIG7PzNXYrEWQO92T+psDP +9gumDGLpEN+G7R7wEnBbimPYnGZunXfDD3gVI2QZud++VjNbfSxNxxUQsk4pWE4x +paMfrkoYQCuyEYQsyRAkG4Nsff6JKzFPZ+V3iVbAW54CiZfh0XF47lFJxJzY6rPg +KqD87Mdw2de4EUOIX1OpOfpnKgOsxHQQ/dAF +-----END CERTIFICATE-----