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, nilView on GitHub (pinned to 2a29f1770b)
Solutions
- Import the plugin signer's public key and pass a keyring that contains it (gpg --import key.asc, then --keyring ~/.gnupg/pubring.gpg)
- 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
- Re-download both the .tgz and .prov together from the authoritative source to rule out truncation or partial mirror sync
- 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
- Import the plugin author's public key into a dedicated keyring before scripted --verify installs
- Never rebuild/re-tar a signed tarball; regenerate provenance whenever the artifact changes
- Ship .tgz and .prov from the same release pipeline so hashes always match
- Treat persistent verification failure on a trusted mirror as a possible compromise indicator
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
- failed to access provenance file %s: %w
- plugin source does not support verification. Use --verify=fa
- failed to download plugin: %w
- failed to get verification data: %w
- failed to extract archive: %w
AI-assisted analysis of helm/helm@2a29f1770b (2026-08-15).
Data as JSON: /api/errors/866baab36f1bb7e9.
Report an issue: GitHub.