Skip to content

SSHKey generator#5083

Merged
Skarlso merged 9 commits intoexternal-secrets:mainfrom
dex4er:sshkey-generator
Jul 30, 2025
Merged

SSHKey generator#5083
Skarlso merged 9 commits intoexternal-secrets:mainfrom
dex4er:sshkey-generator

Conversation

@dex4er
Copy link
Copy Markdown
Contributor

@dex4er dex4er commented Jul 30, 2025

Problem Statement

Implements new generator that creates SSH key pair.

Related Issue

Fixes #5081

Proposed Changes

Implements it.

Checklist

  • I have read the contribution guidelines
  • All commits are signed with git commit --signoff
  • My changes have reasonable test coverage
  • All tests pass with make test
  • I ensured my PR is ready for review with make reviewable

@dex4er dex4er requested a review from a team as a code owner July 30, 2025 00:50
@dex4er dex4er requested a review from knelasevero July 30, 2025 00:50
@dex4er
Copy link
Copy Markdown
Contributor Author

dex4er commented Jul 30, 2025

Oh God, why again --signoff.

Edit: git rebase -i main --exec 'git commit --amend --no-edit --signoff' saved me a day^Hnight

@dex4er dex4er force-pushed the sshkey-generator branch from 66e68bd to 497331f Compare July 30, 2025 00:54
@Skarlso
Copy link
Copy Markdown
Contributor

Skarlso commented Jul 30, 2025

In general, this looks okay to me. Could you please show some working examples of this? Like paste in the created secret, show that it reconciled, etc?

@dex4er
Copy link
Copy Markdown
Contributor Author

dex4er commented Jul 30, 2025

Here you are:

apiVersion: generators.external-secrets.io/v1alpha1
kind: SSHKey
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"generators.external-secrets.io/v1alpha1","kind":"SSHKey","metadata":{"annotations":{},"name":"example-ssh-key","namespace":"default"},"spec":{"comment":"user@example.com","keyType":"ed25519"}}
  creationTimestamp: "2025-07-30T00:26:51Z"
  generation: 2
  name: example-ssh-key
  namespace: default
  resourceVersion: "355930"
  uid: fde7d258-14d7-4c30-8e9d-f9fad95cc036
spec:
  comment: user@example.com
  keySize: 2048
  keyType: ed25519
apiVersion: v1
data:
  privateKey: LS0tLS1CRUdJTiBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0KYjNCbGJuTnphQzFyWlhrdGRqRUFBQUFBQkc1dmJtVUFBQUFFYm05dVpRQUFBQUFBQUFBQkFBQUFNd0FBQUF0egpjMmd0WldReU5UVXhPUUFBQUNCeW1JcWN4WVpCWncrbnN1b1JFdHl2S2NYbGdvbHBwSjRJZWpQb29MUHhSQUFBCkFKamd3a0J4NE1KQWNRQUFBQXR6YzJndFpXUXlOVFV4T1FBQUFDQnltSXFjeFlaQlp3K25zdW9SRXR5dktjWGwKZ29scHBKNEllalBvb0xQeFJBQUFBRURWUkZsdWpPVWc3cFJWZkZqRjZPekdvVkhWKzMwejBBdnMzT3RQTzlOcwo4SEtZaXB6RmhrRm5ENmV5NmhFUzNLOHB4ZVdDaVdta25naDZNK2lncy9GRUFBQUFFSFZ6WlhKQVpYaGhiWEJzClpTNWpiMjBCQWdNRUJRPT0KLS0tLS1FTkQgT1BFTlNTSCBQUklWQVRFIEtFWS0tLS0tCg==
  publicKey: c3NoLWVkMjU1MTkgQUFBQUMzTnphQzFsWkRJMU5URTVBQUFBSUhLWWlwekZoa0ZuRDZleTZoRVMzSzhweGVXQ2lXbWtuZ2g2TStpZ3MvRkUgdXNlckBleGFtcGxlLmNvbQo=
kind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"external-secrets.io/v1","kind":"ExternalSecret","metadata":{"annotations":{},"name":"example-ssh-key","namespace":"default"},"spec":{"dataFrom":[{"sourceRef":{"generatorRef":{"apiVersion":"generators.external-secrets.io/v1alpha1","kind":"SSHKey","name":"example-ssh-key"}}}],"refreshInterval":"30m","target":{"name":"ssh-key-secret"}}}
    reconcile.external-secrets.io/data-hash: 1557de1a741f02070760c1a64529d0b1c4c1ec9289d7cfc397bf6357
  creationTimestamp: "2025-07-30T00:48:09Z"
  labels:
    reconcile.external-secrets.io/created-by: 8841e71abe51cc9f72aaa4934514304cd241f42fc536ea8b26b01f31
    reconcile.external-secrets.io/managed: "true"
  name: ssh-key-secret
  namespace: default
  ownerReferences:
  - apiVersion: external-secrets.io/v1
    blockOwnerDeletion: true
    controller: true
    kind: ExternalSecret
    name: example-ssh-key
    uid: 6c81c9e6-9531-4780-af97-a8f877e12aab
  resourceVersion: "358797"
  uid: b24e5abd-c9fc-4c2b-9bbb-aa624bd97fbf
type: Opaque

which is after base64 decode:

-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtz
c2gtZWQyNTUxOQAAACBymIqcxYZBZw+nsuoREtyvKcXlgolppJ4IejPooLPxRAAA
AJjgwkBx4MJAcQAAAAtzc2gtZWQyNTUxOQAAACBymIqcxYZBZw+nsuoREtyvKcXl
golppJ4IejPooLPxRAAAAEDVRFlujOUg7pRVfFjF6OzGoVHV+30z0Avs3OtPO9Ns
8HKYipzFhkFnD6ey6hES3K8pxeWCiWmkngh6M+igs/FEAAAAEHVzZXJAZXhhbXBs
ZS5jb20BAgMEBQ==
-----END OPENSSH PRIVATE KEY-----
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHKYipzFhkFnD6ey6hES3K8pxeWCiWmkngh6M+igs/FE user@example.com

and log:

{"level":"info","ts":1753836194.7923188,"logger":"controllers.ExternalSecret","msg":"reconciled secret","ExternalSecret":{"name":"example-ssh-key","namespace":"default"}}

@dex4er
Copy link
Copy Markdown
Contributor Author

dex4er commented Jul 30, 2025

I'm going to make keySize nullable as it is misleading to see default 2048 for ed25519

@dex4er
Copy link
Copy Markdown
Contributor Author

dex4er commented Jul 30, 2025

3 examples:

apiVersion: generators.external-secrets.io/v1alpha1
kind: SSHKey
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: >
      {"apiVersion":"generators.external-secrets.io/v1alpha1","kind":"SSHKey","metadata":{"annotations":{},"name":"example-ssh-key","namespace":"default"},"spec":{"comment":"user@example.com","keyType":"ed25519"}}
  creationTimestamp: "2025-07-30T09:06:44Z"
  generation: 1
  name: example-ssh-key
  namespace: default
  resourceVersion: "365345"
  selfLink: >-
    /apis/generators.external-secrets.io/v1alpha1/namespaces/default/sshkeys/example-ssh-key
  uid: 05aa53d5-38b8-4596-9ff4-dc7057f4fbbc
spec:
  comment: user@example.com
  keyType: ed25519
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAII6NdYxtpsLyoscm3kjLxAZFn+nkqm0FsIMmtXjO3g29 user@example.com
apiVersion: generators.external-secrets.io/v1alpha1
kind: SSHKey
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: >
      {"apiVersion":"generators.external-secrets.io/v1alpha1","kind":"SSHKey","metadata":{"annotations":{},"name":"example-rsa-key","namespace":"default"},"spec":{"comment":"rsa@example.com","keySize":4096,"keyType":"rsa"}}
  creationTimestamp: "2025-07-30T09:52:56Z"
  generation: 1
  name: example-rsa-key
  namespace: default
  resourceVersion: "365651"
  selfLink: >-
    /apis/generators.external-secrets.io/v1alpha1/namespaces/default/sshkeys/example-rsa-key
  uid: f5c78c16-4bb6-4fca-ab2e-88024a25c861
spec:
  comment: rsa@example.com
  keySize: 4096
  keyType: rsa
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCrNJA4QxMAaKJPnW5S/1nufw4ad/wK/pExhPFTeUojOFQjrqc2199kQHzuQDxIeMs4lM6TvaSfIe0WNbDU3eSSedt2SnwaojQ3iXCK/5NKOXPh9IjUzs7MDvQXwQILD7jy4Jm9uu4/wM/r0jN2Xcu1iy0tYeF5z6NmhbnTRRcHYMpcL6m3F412T3kADSxwwWvD1+s/jkD10LKaDXayac4ErSRZbvgs9mg9nf4s1KMucCfEApE0Vmtoe8ZpfTcGrivDGY04i7dZqWW7rxfWM89ddCrZCxNyI++R0O654Pnmt2m3Qp4GDUqAGPtv7S1xl2PQaPRREG4iibdFjnbboPvq1lfrVxHdfyD2C4hc8cVvrs/q0/S6yJ0fCeD9yPehmYMxnj8Pk82AVgF/3zPO6P9BulPHQBy00pJh5xvw956BSC7KgZNKQLljXIh3m1yh31EkRnljv77P0VyPuvSWSLczhUYLd6zzrbRl7xlzSLBDnJBpcCXhW1QInxTyZTQ1f/S0UVea5MI4K7YQNMKmOyS2TdKUHNdvnCdMj6K0I193X479gVLJkhXxekzzfxIlVkPG7rkofpE/2FThDyAxie3hWBgSiCe21ISJ15fjNsME+dw/LE/1K4vBO5CpLyWBygEn6ROG70H2/rkKbZSd3tNb33N/09Zzq+5M1xgOMHO+pw== rsa@example.com
apiVersion: generators.external-secrets.io/v1alpha1
kind: SSHKey
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: >
      {"apiVersion":"generators.external-secrets.io/v1alpha1","kind":"SSHKey","metadata":{"annotations":{},"name":"example-rsa-default-key","namespace":"default"},"spec":{"comment":"rsa-default@example.com","keyType":"rsa"}}
  creationTimestamp: "2025-07-30T10:09:25Z"
  generation: 1
  name: example-rsa-default-key
  namespace: default
  resourceVersion: "367143"
  selfLink: >-
    /apis/generators.external-secrets.io/v1alpha1/namespaces/default/sshkeys/example-rsa-default-key
  uid: f133a706-fd31-4525-9db1-259989aa2ab6
spec:
  comment: rsa-default@example.com
  keyType: rsa
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDPPKLED6+SbtFM+Zdq4BcbAamzoaDz6PkOmahNp5Sq9ASqbB72QS5TRmWH8AH2BOQDmU2C0NIeXcp0RXY0k/XZ66+0EuffYawZq7A74xHD0jPxQz7xachXilHJAof92bOvGH/9fX7jbiC4yrcVDwnVgztc7AW88Cp5YRecjwFKJ5nabyayyYdiagHXmeg2WlT3qAtTQak63q8UBMz90BXFZgD+ffP+57SzOOyKib7bHXXewFiAmoa6GuPuVXq7srmUx8PqNcAzb2dZMLBsc3jEl6fizcq/qAywkOs29cysYp0+JToxWLaTUG5kILByKpJQdIvxM5C0cKD/hkeztdaR rsa-default@example.com

All looks fine.

dex4er added 7 commits July 30, 2025 12:27
Signed-off-by: Piotr Roszatycki <piotr.roszatycki@gmail.com>
Signed-off-by: Piotr Roszatycki <piotr.roszatycki@gmail.com>
Signed-off-by: Piotr Roszatycki <piotr.roszatycki@gmail.com>
Signed-off-by: Piotr Roszatycki <piotr.roszatycki@gmail.com>
Signed-off-by: Piotr Roszatycki <piotr.roszatycki@gmail.com>
Signed-off-by: Piotr Roszatycki <piotr.roszatycki@gmail.com>
Signed-off-by: Piotr Roszatycki <piotr.roszatycki@gmail.com>
@dex4er dex4er force-pushed the sshkey-generator branch from 8d1fe3a to 72e2229 Compare July 30, 2025 10:27
dex4er added 2 commits July 30, 2025 12:30
Signed-off-by: Piotr Roszatycki <piotr.roszatycki@gmail.com>
@dex4er dex4er force-pushed the sshkey-generator branch from 3d6741c to d94b895 Compare July 30, 2025 12:25
@sonarqubecloud
Copy link
Copy Markdown

@Skarlso Skarlso merged commit e2f4be0 into external-secrets:main Jul 30, 2025
23 checks passed
alexlebens pushed a commit to alexlebens/infrastructure that referenced this pull request Aug 3, 2025
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [external-secrets](https://github.com/external-secrets/external-secrets) | minor | `0.18.2` -> `0.19.0` |

---

### Release Notes

<details>
<summary>external-secrets/external-secrets (external-secrets)</summary>

### [`v0.19.0`](https://github.com/external-secrets/external-secrets/releases/tag/v0.19.0)

[Compare Source](external-secrets/external-secrets@v0.18.2...v0.19.0)

#### **BREAKING CHANGE**

🔴 🔴  BREAKING CHANGE 🔴 🔴

Please note that this a breaking change because our CRDs are now too big. Meaning a simple kubectl apply or Argo's default client side apply WILL NOT WORK! You have to add `--server-side` to kubectl apply and in argo add:

```yaml
spec:
  project: default
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true
    - ServerSideApply=true
```

for it to correctly install the CRDs. Thank you.

Image: `ghcr.io/external-secrets/external-secrets:v0.19.0`
Image: `ghcr.io/external-secrets/external-secrets:v0.19.0-ubi`
Image: `ghcr.io/external-secrets/external-secrets:v0.19.0-ubi-boringssl`

#### What's Changed

- chore: release helm chart for v0.18.2 by [@&#8203;Skarlso](https://github.com/Skarlso) in external-secrets/external-secrets#4985
- chore(deps): bump golang from `ee7ff13` to `10f549d` in /e2e by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in external-secrets/external-secrets#4997
- chore(deps): bump golang from `68932fa` to `68932fa` by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in external-secrets/external-secrets#5000
- chore(deps): bump mkdocs-material from 9.6.14 to 9.6.15 in /hack/api-docs by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in external-secrets/external-secrets#4998
- chore(deps): bump anchore/sbom-action from 0.20.1 to 0.20.2 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in external-secrets/external-secrets#5001
- chore(deps): bump github/codeql-action from 3.29.1 to 3.29.2 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in external-secrets/external-secrets#5003
- chore(deps): bump aquasecurity/trivy-action from 0.31.0 to 0.32.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in external-secrets/external-secrets#5002
- fix: do not turn original value into string on value scope by [@&#8203;Skarlso](https://github.com/Skarlso) in external-secrets/external-secrets#5011
- fix: add uuid in edit and view clusterroles by [@&#8203;sylvainOL](https://github.com/sylvainOL) in external-secrets/external-secrets#5017
- chore: update dependencies by [@&#8203;eso-service-account-app](https://github.com/eso-service-account-app)\[bot] in external-secrets/external-secrets#4999
- fix: template data should not be the secret Data itself by [@&#8203;gusfcarvalho](https://github.com/gusfcarvalho) in external-secrets/external-secrets#5023
- Fix: Return appropriate error in ValidateStore by [@&#8203;prakash-218](https://github.com/prakash-218) in external-secrets/external-secrets#5019
- feat(helm): allow to set init containers by [@&#8203;rclsilver](https://github.com/rclsilver) in external-secrets/external-secrets#4745
- chore(deps): bump certifi from 2025.6.15 to 2025.7.14 in /hack/api-docs by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in external-secrets/external-secrets#5032
- Fix: Remove root/buildinfo from ubi build files by [@&#8203;bainsy88](https://github.com/bainsy88) in external-secrets/external-secrets#5037
- chore(deps): bump ubi8/ubi from `19eae3d` to `c0b0729` by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in external-secrets/external-secrets#5033
- chore(deps): bump golang from 1.24.4-bookworm to 1.24.5-bookworm in /e2e by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in external-secrets/external-secrets#5029
- chore(deps): bump golang from 1.24.4 to 1.24.5 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in external-secrets/external-secrets#5034
- chore: update dependencies by [@&#8203;eso-service-account-app](https://github.com/eso-service-account-app)\[bot] in external-secrets/external-secrets#5031
- Add Red Hat OpenShift in Adopters by [@&#8203;KeenonLee](https://github.com/KeenonLee) in external-secrets/external-secrets#5039
- fix: remove authentication option with JWT token from STSSessionToken generator by [@&#8203;Skarlso](https://github.com/Skarlso) in external-secrets/external-secrets#5026
- fix: add validation constraints to ExternalSecretRewrite  by [@&#8203;Aakkash-Suresh](https://github.com/Aakkash-Suresh) in external-secrets/external-secrets#5006
- fix: stability support matrix by [@&#8203;gusfcarvalho](https://github.com/gusfcarvalho) in external-secrets/external-secrets#5043
- docs(decoding-strategy): clarify base64 auto-detection limitations by [@&#8203;orymate](https://github.com/orymate) in external-secrets/external-secrets#5004
- feat(infisical): auth methods by [@&#8203;DanielHougaard](https://github.com/DanielHougaard) in external-secrets/external-secrets#5040
- chore(deps): bump alpine from 3.22.0 to 3.22.1 in /e2e by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in external-secrets/external-secrets#5046
- chore(aws): parameterstore unit tests improvement by [@&#8203;ivankatliarchuk](https://github.com/ivankatliarchuk) in external-secrets/external-secrets#4986
- fix(helm): grafana dashboard: fix heatmaps to actually be heatmaps, not time series by [@&#8203;desaintmartin](https://github.com/desaintmartin) in external-secrets/external-secrets#5069
- chore(deps): bump sigstore/cosign-installer from 3.9.1 to 3.9.2 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in external-secrets/external-secrets#5047
- chore(deps): bump step-security/harden-runner from 2.12.2 to 2.13.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in external-secrets/external-secrets#5048
- chore(deps): bump golang from `ddf5200` to `daae04e` by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in external-secrets/external-secrets#5049
- chore(deps): bump alpine from `8a1f59f` to `4bcff63` by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in external-secrets/external-secrets#5051
- chore(deps): bump alpine from `8a1f59f` to `4bcff63` in /hack/api-docs by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in external-secrets/external-secrets#5052
- chore(deps): bump mkdocs-material from 9.6.15 to 9.6.16 in /hack/api-docs by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in external-secrets/external-secrets#5077
- Add SelfSubjectAccessReview as a fallback for failing SelfSubjectRulesReview by [@&#8203;alvin-rw](https://github.com/alvin-rw) in external-secrets/external-secrets#5025
- chore(deps): bump golang from `69adc37` to `ef8c5c7` in /e2e by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in external-secrets/external-secrets#5076
- chore(deps): bump ubi8/ubi from `c0b0729` to `785d38c` by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in external-secrets/external-secrets#5075
- chore(deps): bump github/codeql-action from 3.29.2 to 3.29.4 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in external-secrets/external-secrets#5072
- chore(deps): bump anchore/sbom-action from 0.20.2 to 0.20.4 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in external-secrets/external-secrets#5073
- SSHKey generator by [@&#8203;dex4er](https://github.com/dex4er) in external-secrets/external-secrets#5083
- fix: restore AWS credential chain resolution for ECRAuthorizationToken generator by [@&#8203;aditmeno](https://github.com/aditmeno) in external-secrets/external-secrets#5082
- fix(helm): grafana dashboard: add widget for sum of not ready secrets by [@&#8203;desaintmartin](https://github.com/desaintmartin) in external-secrets/external-secrets#5086
- feat(aws): secretsmanager to update/patch/delete tags by [@&#8203;ivankatliarchuk](https://github.com/ivankatliarchuk) in external-secrets/external-secrets#4984
- fix: update the e2e test with the new store status value by [@&#8203;Skarlso](https://github.com/Skarlso) in external-secrets/external-secrets#5089
- fix: correct usage of if in dlc and update for server side apply by [@&#8203;Skarlso](https://github.com/Skarlso) in external-secrets/external-secrets#5092

#### New Contributors

- [@&#8203;sylvainOL](https://github.com/sylvainOL) made their first contribution in external-secrets/external-secrets#5017
- [@&#8203;prakash-218](https://github.com/prakash-218) made their first contribution in external-secrets/external-secrets#5019
- [@&#8203;rclsilver](https://github.com/rclsilver) made their first contribution in external-secrets/external-secrets#4745
- [@&#8203;bainsy88](https://github.com/bainsy88) made their first contribution in external-secrets/external-secrets#5037
- [@&#8203;KeenonLee](https://github.com/KeenonLee) made their first contribution in external-secrets/external-secrets#5039
- [@&#8203;orymate](https://github.com/orymate) made their first contribution in external-secrets/external-secrets#5004
- [@&#8203;desaintmartin](https://github.com/desaintmartin) made their first contribution in external-secrets/external-secrets#5069
- [@&#8203;alvin-rw](https://github.com/alvin-rw) made their first contribution in external-secrets/external-secrets#5025
- [@&#8203;dex4er](https://github.com/dex4er) made their first contribution in external-secrets/external-secrets#5083
- [@&#8203;aditmeno](https://github.com/aditmeno) made their first contribution in external-secrets/external-secrets#5082

**Full Changelog**: external-secrets/external-secrets@v0.18.2...v0.19.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xLjMiLCJ1cGRhdGVkSW5WZXIiOiI0MS4xLjMiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImNoYXJ0Il19-->

Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/1114
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Feature Request: SSH key pair generator

2 participants