Skip to content

Conversation

@felixfontein
Copy link
Contributor

Follow-up to #1919.

While working on #1946, I noticed that #1919 did not handle keys specified in key groups (which already have to be split up into their three parts).

CC @daogilvie @r4vi

@felixfontein felixfontein requested a review from a team September 12, 2025 20:36
@r4vi
Copy link

r4vi commented Sep 13, 2025

I think this might lead to unexpected behaviour you were worried about in the original PR.

Afaik the 3 part definition is used inside a sops encrypted file, and if you omit the version then it might lead to unexpected behaviour when there is a new key version available. You'd want the sops file to reference the exact version it was encrypted with.

While this PR won't by itself introduce that as a problem. I assume the code for creating a sops encrypted file will add all three parts by default.

A user might remove it thinking it'll be safe and everything will continue to work until they create a new azkv key version. After that point if someone tries to decrypt the sops file it will break.

@felixfontein
Copy link
Contributor Author

I don't think this is relevant: when reading SOPS encrypted files, the metadata from the file is convert to a azkv.MasterKey using

sops/stores/stores.go

Lines 395 to 407 in d3bb109

func (azkvKey *azkvkey) toInternal() (*azkv.MasterKey, error) {
creationDate, err := time.Parse(time.RFC3339, azkvKey.CreatedAt)
if err != nil {
return nil, err
}
return &azkv.MasterKey{
VaultURL: azkvKey.VaultURL,
Name: azkvKey.Name,
Version: azkvKey.Version,
EncryptedKey: azkvKey.EncryptedDataKey,
CreationDate: creationDate,
}, nil
}
, which does not call any of the helper functions in azkv/keysource.go (that would query the API). So if a user deletes the version from a SOPS encrypted file, SOPS will no longer be able to decrypt that file (assuming there are no other keys that can be used) since MasterKey.version is never filled in (resp. set to its default "").

@r4vi
Copy link

r4vi commented Sep 14, 2025

I trust your intuition more than mine, my assumption was solely based on where I've seen the 3 part definition rather than any familiarity with the code base

@daogilvie
Copy link
Contributor

daogilvie commented Sep 16, 2025

Oh great spot, yes I didn't even think about testing key groups. However, wouldn't this line already cover this case?

@felixfontein
Copy link
Contributor Author

Oh great spot, yes I didn't even think about testing key groups. However, wouldn't this line already cover this case?

That line covers AZKV keys outside key groups :) Key groups are handled in

sops/config/config.go

Lines 355 to 363 in 286dffc

if len(cRule.KeyGroups) > 0 {
for _, group := range cRule.KeyGroups {
keyGroup, err := extractMasterKeys(group)
if err != nil {
return nil, err
}
groups = append(groups, keyGroup)
}
} else {
further up in this function. This else branch handles the case that key_groups has not been specified (or is empty), and uses the other fields to compose a single key group.

@daogilvie
Copy link
Contributor

Oh great spot, yes I didn't even think about testing key groups. However, wouldn't this line already cover this case?

That line covers AZKV keys outside key groups :) Key groups are handled in

sops/config/config.go

Lines 355 to 363 in 286dffc

if len(cRule.KeyGroups) > 0 {
for _, group := range cRule.KeyGroups {
keyGroup, err := extractMasterKeys(group)
if err != nil {
return nil, err
}
groups = append(groups, keyGroup)
}
} else {

further up in this function. This else branch handles the case that key_groups has not been specified (or is empty), and uses the other fields to compose a single key group.

Ah, thank you — Sorry, go is not my daily driver and I found reading that function a little confusing. So, to be clear:

  1. Any key in an AZKV KeyGroup MUST currently be already broken into the 3 constituent values, not the URL form
  2. This PR just means that if the Version field is a blank string, that particular keygroup key will be resolved to the latest version as per what we did for the URL handling

This PR itself is not putting URLs into the KeyGroup format, right? I looked at your docs PR, and here you have written it as though URLs will work, but I don't see how that is the case 🤔 It looks like the only thing doing any parsing before the bit you've changed is the YAML unmarshal, and that won't allow raw URLs because the azkv struct is a map of 3 strings... I think? I really want to like Go but I keep bouncing off the syntax for some reason 😂 sorry if I've missed something obvious again

@felixfontein
Copy link
Contributor Author

Ah, thank you — Sorry, go is not my daily driver and I found reading that function a little confusing. So, to be clear:

No worries :) I'm (almost) only working with Go when working on SOPS, so I know that feeling very well (though I got more familiar with it over the years)...

  1. Any key in an AZKV KeyGroup MUST currently be already broken into the 3 constituent values, not the URL form

Yes.

  1. This PR just means that if the Version field is a blank string, that particular keygroup key will be resolved to the latest version as per what we did for the URL handling

Yes.

This PR itself is not putting URLs into the KeyGroup format, right?

No, it's not.

I looked at your docs PR, and here you have written it as though URLs will work, but I don't see how that is the case 🤔

Well, that example isn't using key groups (key_groups is missing - see https://github.com/getsops/sops/pull/1946/files#diff-7b3ed02bc73dc06b7db906cf97aa91dec2b2eb21f2d92bc5caa761df5bbc168fR1798-R1826 for an example), but defines a single key group by not using key_groups (this is the most common form to provide keys, and very likely was there before key groups were added). In that form, you always have to provide URLs.

But for key groups (directly, not with the "only one key-group" "hack"/backwards compatibility thing), you always have to supply 2-3 fields (it was all three until this PR, now with this PR you can leave the version away). So basically this PR gives you feature parity between the backwards compatible way (and the most common way keys are provided) and the key_groups way (which you need if you want to use Shamir's secret sharing, or if you want to use merge groups with YAML anchors).

It looks like the only thing doing any parsing before the bit you've changed is the YAML unmarshal, and that won't allow raw URLs because the azkv struct is a map of 3 strings... I think?

Yes, that's correct. You always have to provide the three fields (or now also two, as you can leave version empty with this PR). But that's only the case for inside key_groups, and for destination rules (which are for publishing, I think).

I really want to like Go but I keep bouncing off the syntax for some reason 😂 sorry if I've missed something obvious again

This is probably more a confusion with SOPS, since it defines some of these structures multiple times (for multiple situations: config file syntax, where you have two forms to provide keys depending on where you provide them; SOPS file metadata; and the actual AZKV keystore code). Almost all of these forms have the three fields (except the URL one outside of key_groups in creation rules), and only some of them allow version to be empty (namely in the config file; in the AZKV keystore code and in the SOPS metadata version has to be filled out). It also confused me, and when working through all data structures to compile the information for #1946 it at least got clearer to me :)

@daogilvie
Copy link
Contributor

Thank you for such a thorough response! No further questions from me; this makes sense. I'll leave an approval, for whatever that is worth.

Copy link
Contributor

@daogilvie daogilvie left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for adding this case!

Copy link
Member

@hiddeco hiddeco left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Two minor nits, but other than this it LGTM.


// NewMasterKey creates a new MasterKey from a URL, key name and (optional) version,
// setting the creation date to the current date.
func NewMasterKey(vaultURL string, keyName string, keyVersion string) (*MasterKey, error) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wondering if instead of introducing a breaking change — we should introduce a NewMasterKeyWithVersion.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Technically no since the only public Go part of SOPS is the decrypt package, but I've changed it back in 51c97fa. I've decided to keep the private (newMasterKey) and public (NewMasterKey) function, which currently do both the same though.

Comment on lines 82 to 83
err := key.ensureKeyHasVersion(context.Background())
return key, err
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typically, you would return nil on error.

Suggested change
err := key.ensureKeyHasVersion(context.Background())
return key, err
if err := key.ensureKeyHasVersion(context.Background()); err != nil {
return nil, err
}
return key, nil

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 51c97fa.

Signed-off-by: Felix Fontein <felix@fontein.de>
Signed-off-by: Felix Fontein <felix@fontein.de>
@felixfontein felixfontein merged commit 2ade87b into getsops:main Sep 27, 2025
15 checks passed
@felixfontein felixfontein deleted the azkv-version branch September 27, 2025 18:36
@felixfontein
Copy link
Contributor Author

@hiddeco thanks again!

@felixfontein
Copy link
Contributor Author

@r4vi @daogilvie also thanks a lot for testing and reviewing this, and for your work in #1919!

tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Oct 1, 2025
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [getsops/sops](https://github.com/getsops/sops) | minor | `v3.10.2` -> `v3.11.0` |

MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot).

**Proposed changes to behavior should be submitted there as MRs.**

---

### Release Notes

<details>
<summary>getsops/sops (getsops/sops)</summary>

### [`v3.11.0`](https://github.com/getsops/sops/releases/tag/v3.11.0)

[Compare Source](getsops/sops@v3.10.2...v3.11.0)

#### Installation

To install `sops`, download one of the pre-built binaries provided for your platform from the artifacts attached to this release.

For instance, if you are using Linux on an AMD64 architecture:

```shell

### Download the binary
curl -LO https://github.com/getsops/sops/releases/download/v3.11.0/sops-v3.11.0.linux.amd64

### Move the binary in to your PATH
mv sops-v3.11.0.linux.amd64 /usr/local/bin/sops

### Make the binary executable
chmod +x /usr/local/bin/sops
```

##### Verify checksums file signature

The checksums file provided within the artifacts attached to this release is signed using [Cosign](https://docs.sigstore.dev/cosign/overview/) with GitHub OIDC. To validate the signature of this file, run the following commands:

```shell

### Download the checksums file, certificate and signature
curl -LO https://github.com/getsops/sops/releases/download/v3.11.0/sops-v3.11.0.checksums.txt
curl -LO https://github.com/getsops/sops/releases/download/v3.11.0/sops-v3.11.0.checksums.pem
curl -LO https://github.com/getsops/sops/releases/download/v3.11.0/sops-v3.11.0.checksums.sig

### Verify the checksums file
cosign verify-blob sops-v3.11.0.checksums.txt \
  --certificate sops-v3.11.0.checksums.pem \
  --signature sops-v3.11.0.checksums.sig \
  --certificate-identity-regexp=https://github.com/getsops \
  --certificate-oidc-issuer=https://token.actions.githubusercontent.com
```

##### Verify binary integrity

To verify the integrity of the downloaded binary, you can utilize the checksums file after having validated its signature:

```shell

### Verify the binary using the checksums file
sha256sum -c sops-v3.11.0.checksums.txt --ignore-missing
```

##### Verify artifact provenance

The [SLSA provenance](https://slsa.dev/provenance/v0.2) of the binaries, packages, and SBOMs can be found within the artifacts associated with this release. It is presented through an [in-toto](https://in-toto.io/) link metadata file named `sops-v3.11.0.intoto.jsonl`. To verify the provenance of an artifact, you can utilize the [`slsa-verifier`](https://github.com/slsa-framework/slsa-verifier#artifacts) tool:

```shell

### Download the metadata file
curl -LO  https://github.com/getsops/sops/releases/download/v3.11.0/sops-v3.11.0.intoto.jsonl

### Verify the provenance of the artifact
slsa-verifier verify-artifact <artifact> \
  --provenance-path sops-v3.11.0.intoto.jsonl \
  --source-uri github.com/getsops/sops \
  --source-tag v3.11.0
```

#### Container Images

The `sops` binaries are also available as container images, based on Debian (slim) and Alpine Linux. The Debian-based container images include any dependencies which may be required to make use of certain key services, such as GnuPG, AWS KMS, Azure Key Vault, and Google Cloud KMS. The Alpine-based container images are smaller in size, but do not include these dependencies.

These container images are available for the following architectures: `linux/amd64` and `linux/arm64`.

##### GitHub Container Registry

- `ghcr.io/getsops/sops:v3.11.0`
- `ghcr.io/getsops/sops:v3.11.0-alpine`

##### Quay.io

- `quay.io/getsops/sops:v3.11.0`
- `quay.io/getsops/sops:v3.11.0-alpine`

##### Verify container image signature

The container images are signed using [Cosign](https://docs.sigstore.dev/cosign/overview/) with GitHub OIDC. To validate the signature of an image, run the following command:

```shell
cosign verify ghcr.io/getsops/sops:v3.11.0 \
  --certificate-identity-regexp=https://github.com/getsops \
  --certificate-oidc-issuer=https://token.actions.githubusercontent.com \
  -o text
```

##### Verify container image provenance

The container images include [SLSA provenance](https://slsa.dev/provenance/v0.2) attestations. For more information around the verification of this, please refer to the [`slsa-verifier` documentation](https://github.com/slsa-framework/slsa-verifier#containers).

#### Software Bill of Materials

The Software Bill of Materials (SBOM) for each binary is accessible within the artifacts enclosed with this release. It is presented as an [SPDX](https://spdx.dev/) JSON file, formatted as `<binary>.spdx.sbom.json`.

#### What's Changed

- build(deps): Bump the go group with 4 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1845](getsops/sops#1845)
- build(deps): Bump the go group with 5 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1850](getsops/sops#1850)
- build(deps): Bump the ci group with 4 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1849](getsops/sops#1849)
- build(deps): Bump the go group with 8 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1854](getsops/sops#1854)
- build(deps): Bump tempfile from 3.19.1 to 3.20.0 in /functional-tests in the rust group by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1853](getsops/sops#1853)
- build(deps): Bump actions/setup-go from 5.4.0 to 5.5.0 in the ci group by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1852](getsops/sops#1852)
- use bullet points for structure by [@&#8203;md42](https://github.com/md42) in [#&#8203;1844](getsops/sops#1844)
- Introduce EncryptContext and DecryptContext for AWS, Azure, GCP, PGP and HashiCorp Vault by [@&#8203;matheuscscp](https://github.com/matheuscscp) in [#&#8203;1848](getsops/sops#1848)
- build(deps): Bump the go group with 5 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1856](getsops/sops#1856)
- build(deps): Bump the ci group with 2 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1857](getsops/sops#1857)
- Allow injecting custom HTTP client for AWS, Azure, GCP and HashiCorp Vault by [@&#8203;matheuscscp](https://github.com/matheuscscp) in [#&#8203;1838](getsops/sops#1838)
- Update authors in main.go by [@&#8203;jvehent](https://github.com/jvehent) in [#&#8203;1860](getsops/sops#1860)
- build(deps): Bump the go group with 7 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1861](getsops/sops#1861)
- Remove unmatched '\`' from README.rst by [@&#8203;wasv](https://github.com/wasv) in [#&#8203;1863](getsops/sops#1863)
- build(deps): Bump the go group with 4 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1867](getsops/sops#1867)
- build(deps): Bump alpine from 3.21 to 3.22 in /.release in the docker group by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1866](getsops/sops#1866)
- build(deps): Bump the go group with 12 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1870](getsops/sops#1870)
- build(deps): Bump github/codeql-action from 3.28.18 to 3.28.19 in the ci group by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1869](getsops/sops#1869)
- build(deps): Bump github.com/cloudflare/circl from 1.6.0 to 1.6.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1871](getsops/sops#1871)
- build(deps): Bump the go group with 12 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1872](getsops/sops#1872)
- build(deps): Bump the ci group across 1 directory with 3 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1874](getsops/sops#1874)
- build(deps): Bump the go group with 8 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1878](getsops/sops#1878)
- build(deps): Bump the ci group with 2 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1879](getsops/sops#1879)
- build(deps): Bump github.com/go-viper/mapstructure/v2 from 2.2.1 to 2.3.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1882](getsops/sops#1882)
- Fix Typo in README.rst by [@&#8203;inverted-tree](https://github.com/inverted-tree) in [#&#8203;1881](getsops/sops#1881)
- build(deps): Bump the go group with 4 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1884](getsops/sops#1884)
- build(deps): Bump the ci group with 2 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1883](getsops/sops#1883)
- Correct Windows path to store keys.txt by [@&#8203;EshemMimi](https://github.com/EshemMimi) in [#&#8203;1885](getsops/sops#1885)
- build(deps): Bump the go group with 3 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1888](getsops/sops#1888)
- build(deps): Bump the ci group with 2 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1889](getsops/sops#1889)
- build(deps): Bump the go group with 6 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1893](getsops/sops#1893)
- Add "--value-file" option to "sops set \[...]" by [@&#8203;bjornfor](https://github.com/bjornfor) in [#&#8203;1876](getsops/sops#1876)
- Document XDG\_CONFIG\_HOME support on mac by [@&#8203;fredericrous](https://github.com/fredericrous) in [#&#8203;1897](getsops/sops#1897)
- Fix Shamir threshold encoding for INI and ENV files by [@&#8203;felixfontein](https://github.com/felixfontein) in [#&#8203;1899](getsops/sops#1899)
- build(deps): Bump the go group with 12 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1908](getsops/sops#1908)
- build(deps): Bump serde\_json from 1.0.140 to 1.0.142 in /functional-tests in the rust group by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1907](getsops/sops#1907)
- build(deps): Bump the ci group with 3 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1905](getsops/sops#1905)
- Fix docs: mention all stores instead of just YAML, JSON, and BINARY by [@&#8203;felixfontein](https://github.com/felixfontein) in [#&#8203;1895](getsops/sops#1895)
- Ensure temporary file for editing is only read-writable by owner by [@&#8203;felixfontein](https://github.com/felixfontein) in [#&#8203;1903](getsops/sops#1903)
- Add `--value-stdin` option to `sops set` by [@&#8203;felixfontein](https://github.com/felixfontein) in [#&#8203;1894](getsops/sops#1894)
- Collect age identity loading errors and only report if decryption failed by [@&#8203;felixfontein](https://github.com/felixfontein) in [#&#8203;1898](getsops/sops#1898)
- add completion script. Resolves [#&#8203;1868](getsops/sops#1868) by [@&#8203;longxiucai](https://github.com/longxiucai) in [#&#8203;1892](getsops/sops#1892)
- Resolves [#&#8203;1864](getsops/sops#1864). Adds Native List as an option for configuring keys.  by [@&#8203;lucqui](https://github.com/lucqui) in [#&#8203;1880](getsops/sops#1880)
- Fix example.yaml file by [@&#8203;felixfontein](https://github.com/felixfontein) in [#&#8203;1909](getsops/sops#1909)
- build(deps): Bump the go group with 15 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1912](getsops/sops#1912)
- build(deps): Bump the ci group with 4 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1911](getsops/sops#1911)
- build(deps): Bump the go group with 9 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1917](getsops/sops#1917)
- build(deps): Bump the ci group with 4 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1916](getsops/sops#1916)
- build(deps): Bump github.com/go-viper/mapstructure/v2 from 2.3.0 to 2.4.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1920](getsops/sops#1920)
- build(deps): Bump the go group with 14 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1923](getsops/sops#1923)
- build(deps): Bump the rust group in /functional-tests with 2 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1921](getsops/sops#1921)
- build(deps): Bump github/codeql-action from 3.29.9 to 3.29.11 in the ci group by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1922](getsops/sops#1922)
- Docs: remove paragraph on GPG/PGP keyservers by [@&#8203;felixfontein](https://github.com/felixfontein) in [#&#8203;1928](getsops/sops#1928)
- Allow to configure --enable-local-keyservice and --keyservice through env variables by [@&#8203;felixfontein](https://github.com/felixfontein) in [#&#8203;1930](getsops/sops#1930)
- build(deps): Bump the ci group with 2 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1937](getsops/sops#1937)
- fix: correct destination validation logic to detect all conflicts by [@&#8203;bruce-szalwinski-he](https://github.com/bruce-szalwinski-he) in [#&#8203;1936](getsops/sops#1936)
- Switch from deprecated gopkg.in/yaml.v3 to go.yaml.in/yaml/v3 by [@&#8203;sylr](https://github.com/sylr) in [#&#8203;1934](getsops/sops#1934)
- INI: fix converting integers to strings; improve float and time.Time formatting by [@&#8203;felixfontein](https://github.com/felixfontein) in [#&#8203;1929](getsops/sops#1929)
- feat(azkv): Skipping key-version will get latest key by [@&#8203;daogilvie](https://github.com/daogilvie) in [#&#8203;1919](getsops/sops#1919)
- Fix keyservice client for unix domain sockets by [@&#8203;matheuscscp](https://github.com/matheuscscp) in [#&#8203;1910](getsops/sops#1910)
- README: fix argument order by [@&#8203;felixfontein](https://github.com/felixfontein) in [#&#8203;1940](getsops/sops#1940)
- Allow non-complex non-string values in dotenv and exec-env by [@&#8203;billy4479](https://github.com/billy4479) in [#&#8203;1933](getsops/sops#1933)
- Fix mention of macOS XDG\_CONFIG\_HOME fallback by [@&#8203;felixfontein](https://github.com/felixfontein) in [#&#8203;1944](getsops/sops#1944)
- Improve age identity loading by [@&#8203;felixfontein](https://github.com/felixfontein) in [#&#8203;1931](getsops/sops#1931)
- build(deps): Bump the rust group in /functional-tests with 4 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1948](getsops/sops#1948)
- build(deps): Bump the ci group with 2 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1949](getsops/sops#1949)
- build(deps): Bump the rust group in /functional-tests with 2 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1954](getsops/sops#1954)
- build(deps): Bump anchore/sbom-action from 0.20.5 to 0.20.6 in the ci group by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1955](getsops/sops#1955)
- Start documenting the configuration file format by [@&#8203;felixfontein](https://github.com/felixfontein) in [#&#8203;1946](getsops/sops#1946)
- CI: Build with Go 1.24 and 1.25, release with 1.25 by [@&#8203;felixfontein](https://github.com/felixfontein) in [#&#8203;1945](getsops/sops#1945)
- build(deps): Bump the go group across 1 directory with 21 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1956](getsops/sops#1956)
- When encrypting, load the config only once by [@&#8203;felixfontein](https://github.com/felixfontein) in [#&#8203;1939](getsops/sops#1939)
- build(deps): Bump the go group across 1 directory with 10 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;1958](getsops/sops#1958)
- Ignore encryption selection options for binary store (and warn when they are used) by [@&#8203;felixfontein](https://github.com/felixfontein) in [#&#8203;1927](getsops/sops#1927)
- AZKV: Also allow to omit version for AZKV keys specified in key groups by [@&#8203;felixfontein](https://github.com/felixfontein) in [#&#8203;1947](getsops/sops#1947)
- Complex values in dotenv, and exec-env: do not print sensitive value in error message by [@&#8203;felixfontein](https://github.com/felixfontein) in [#&#8203;1959](getsops/sops#1959)
- Release 3.11.0 by [@&#8203;felixfontein](https://github.com/felixfontein) in [#&#8203;1960](getsops/sops#1960)

#### New Contributors

- [@&#8203;md42](https://github.com/md42) made their first contribution in [#&#8203;1844](getsops/sops#1844)
- [@&#8203;wasv](https://github.com/wasv) made their first contribution in [#&#8203;1863](getsops/sops#1863)
- [@&#8203;inverted-tree](https://github.com/inverted-tree) made their first contribution in [#&#8203;1881](getsops/sops#1881)
- [@&#8203;EshemMimi](https://github.com/EshemMimi) made their first contribution in [#&#8203;1885](getsops/sops#1885)
- [@&#8203;bjornfor](https://github.com/bjornfor) made their first contribution in [#&#8203;1876](getsops/sops#1876)
- [@&#8203;fredericrous](https://github.com/fredericrous) made their first contribution in [#&#8203;1897](getsops/sops#1897)
- [@&#8203;longxiucai](https://github.com/longxiucai) made their first contribution in [#&#8203;1892](getsops/sops#1892)
- [@&#8203;lucqui](https://github.com/lucqui) made their first contribution in [#&#8203;1880](getsops/sops#1880)
- [@&#8203;bruce-szalwinski-he](https://github.com/bruce-szalwinski-he) made their first contribution in [#&#8203;1936](getsops/sops#1936)
- [@&#8203;sylr](https://github.com/sylr) made their first contribution in [#&#8203;1934](getsops/sops#1934)
- [@&#8203;daogilvie](https://github.com/daogilvie) made their first contribution in [#&#8203;1919](getsops/sops#1919)
- [@&#8203;billy4479](https://github.com/billy4479) made their first contribution in [#&#8203;1933](getsops/sops#1933)

**Full Changelog**: <getsops/sops@v3.10.2...v3.11.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 MR becomes conflicted, or you tick the rebase/retry checkbox.

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

---

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

---

This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xMzEuMiIsInVwZGF0ZWRJblZlciI6IjQxLjEzMS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiXX0=-->
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.

4 participants