helm/helm · error

plugin verification failed: %w

Error message

plugin verification failed: %w

What it means

The provenance file existed and was loaded, but plugin.VerifyPlugin failed: the clearsigned OpenPGP .prov could not be verified against the archive using the keyring in opts.Keyring. Typical inner failures: keyring path missing or empty, the signer's public key not present in the keyring, a malformed (not clearsigned) .prov file, or the SHA256 file hash in .prov not matching the archive bytes.

Source

Thrown at internal/plugin/installer/installer.go:107

		if !ok || !verifier.SupportsVerification() {
			return nil, errors.New("--verify is only supported for plugin tarballs (.tgz files)")
		}

		// Get verification data (works for both memory and file-based installers)
		archiveData, provData, filename, err := verifier.GetVerificationData()
		if err != nil {
			return nil, fmt.Errorf("failed to get verification data: %w", err)
		}

		// Check if provenance data exists
		if len(provData) == 0 {
			return nil, errors.New("plugin verification failed: no provenance file (.prov) found")
		}

		// Provenance data exists - verify the plugin
		verification, err := plugin.VerifyPlugin(archiveData, provData, filename, opts.Keyring)
		if err != nil {
			return nil, fmt.Errorf("plugin verification failed: %w", err)
		}

		// Collect verification info
		result = &VerificationResult{
			SignedBy:    make([]string, 0),
			Fingerprint: fmt.Sprintf("%X", verification.SignedBy.PrimaryKey.Fingerprint),
			FileHash:    verification.FileHash,
		}
		for name := range verification.SignedBy.Identities {
			result.SignedBy = append(result.SignedBy, name)
		}
	}

	if err := i.Install(); err != nil {
		return nil, err
	}

	return result, nil

View on GitHub (pinned to 2a29f1770b)

Solutions

  1. Import the plugin signer's public key and pass a keyring that contains it (gpg --import key.asc, then --keyring ~/.gnupg/pubring.gpg)
  2. If you publish the plugin: regenerate the provenance file from the exact tarball being shipped (clearsigned SHA256 message over the final .tgz), never re-tar after signing
  3. Re-download both the .tgz and .prov together from the authoritative source to rule out truncation or partial mirror sync
  4. Only if the source is fully trusted and you accept the risk, install without --verify (defeats the purpose; last resort)

Example fix

# before: keyring lacks the signer
gpg --list-keys | grep -c 'plugin-signer' || true
helm plugin install --verify --keyring ~/.gnupg/pubring.gpg myplugin-1.0.0.tgz
# after: import signer key into the keyring used for verification
gpg --import plugin-signer.asc
helm plugin install --verify --keyring ~/.gnupg/pubring.gpg myplugin-1.0.0.tgz
Defensive patterns

Strategy: validation

Validate before calling

func keyringReady(keyringPath string) error {
	fi, err := os.Stat(keyringPath)
	if err != nil {
		return fmt.Errorf("keyring %s not accessible: %w", keyringPath, err)
	}
	if fi.Size() == 0 {
		return fmt.Errorf("keyring %s is empty — import the signer's public key first", keyringPath)
	}
	return nil
}

Try / catch

if _, err := installer.InstallWithOptions(inst, installer.Options{Verify: true, Keyring: kr}); err != nil {
	if strings.Contains(err.Error(), "plugin verification failed") {
		// Do NOT retry or bypass: either the keyring lacks the signer, or the artifact/prov pair is mismatched.
		// Fetch the authoritative .tgz+.prov pair and a keyring containing the signer, then retry once.
	}
}

Prevention

When it happens

Trigger: helm plugin install --verify --keyring ~/.gnupg/pubring.gpg myplugin-1.0.0.tgz where the tarball was rebuilt after the .prov was generated (hash mismatch), the signer key was never imported, the .prov is corrupt/truncated, or --keyring points at a nonexistent file.

Common situations: Plugin authors re-packaging the tarball without regenerating provenance; users passing a fresh keyring that lacks the author's key; cross-machine gpg setups where pubring differs; man-in-the-middle or accidentally corrupted downloads (verification is doing its job).

Related errors


AI-assisted analysis of helm/helm@2a29f1770b (2026-08-15). Data as JSON: /api/errors/866baab36f1bb7e9. Report an issue: GitHub.