Skip to main content
Third-party signature verification is a Dify Community Edition feature. Dify Cloud manages signatures centrally and does not expose these controls.
Self-hosted Dify enforces signature verification by default. Third-party signature verification lets administrators safely install plugins that are not on the Marketplace without disabling verification entirely. Two scenarios:

Admin signs an approved plugin

The admin reviews a .difypkg from a trusted developer and signs it with their own key before installing.

Developer ships a signed plugin

The developer signs the .difypkg and publishes the matching public key. Admins who trust the developer add that public key to the verification list.
The mechanics are the same in both cases: generate a key pair, sign with the private key, verify with the public key.

Generate a Key Pair

Two files appear in the current directory:
Guard the private key. Anyone who has it can sign plugins that pass verification on installations trusting your public key.

Sign and Verify a Plugin

1

Sign the package

Produces your_plugin_project.signed.difypkg in the same directory.
2

Verify the signed package

Confirms the signature matches before you distribute or install.
If you omit -p, dify signature verify checks against the Dify Marketplace public key. Any plugin not signed by Dify will fail verification in that mode.

Enable Verification on the Daemon

Admins install signed plugins by giving the plugin daemon a list of trusted public keys.
1

Place the public key

Put the .public.pem file somewhere the daemon container can reach it. For Docker Compose installs:
2

Configure the daemon environment

Set these variables on the plugin_daemon service:A docker-compose.override.yaml snippet:
docker/volumes/plugin_daemon mounts to /app/storage inside the container, so the path in THIRD_PARTY_SIGNATURE_VERIFICATION_PUBLIC_KEYS must use the in-container path.
3

Restart Dify

Verified installs are now enforced: signed .difypkg files matching the configured public keys install cleanly; unsigned or mismatched ones are rejected.
Last modified on June 24, 2026