{"record":{"id":"0a03a4a6079c7bcf","repo":"conductor-oss/conductor","slug":"each-conductor-file-storage-conductor-signing-keys","errorCode":null,"errorMessage":"Each conductor.file-storage.conductor.signing.keys entry requires id and secret","messagePattern":"Each conductor\\.file-storage\\.conductor\\.signing\\.keys entry requires id and secret","errorType":"validation","errorClass":"IllegalStateException","httpStatus":null,"severity":"critical","filePath":"core/src/main/java/org/conductoross/conductor/core/storage/ConductorFileStorageProperties.java","lineNumber":116,"sourceCode":"\n        @AssertTrue(message = \"at least one signing key is required when signing is enabled\")\n        public boolean isValid() {\n            return !enabled || (keys != null && !keys.isEmpty());\n        }\n\n        /** Throws a startup-friendly error for unusable key configuration. */\n        public void validate() {\n            if (!enabled) {\n                return;\n            }\n            if (keys == null || keys.isEmpty()) {\n                throw new IllegalStateException(\n                        \"conductor.file-storage.conductor.signing.keys is required when signing is enabled\");\n            }\n            Set<String> ids = new HashSet<>();\n            for (Key key : keys) {\n                if (key == null || isBlank(key.getId()) || isBlank(key.getSecret())) {\n                    throw new IllegalStateException(\n                            \"Each conductor.file-storage.conductor.signing.keys entry requires id and secret\");\n                }\n                if (!ids.add(key.getId())) {\n                    throw new IllegalStateException(\n                            \"conductor.file-storage.conductor.signing.keys contains duplicate id: \"\n                                    + key.getId());\n                }\n            }\n        }\n\n        private boolean isBlank(String value) {\n            return value == null || value.isBlank();\n        }\n    }\n\n    /** An ordered signing key. The first key signs new URLs; every key verifies existing URLs. */\n    public static class Key {\n","sourceCodeStart":98,"sourceCodeEnd":134,"githubUrl":"https://github.com/conductor-oss/conductor/blob/cf7c3e4a8adfb158be778ab1ec525323c363cd3a/core/src/main/java/org/conductoross/conductor/core/storage/ConductorFileStorageProperties.java#L98-L134","documentation":"Thrown by SigningProperties.validate() when signing is enabled and a key entry is null or has a blank id or blank secret. Each signing key must carry a non-blank id and a non-blank secret. Raised at startup as IllegalStateException, failing context initialization.","triggerScenarios":"A keys entry with missing id, missing secret, or whitespace-only values, while conductor.file-storage.conductor.signing.enabled=true. For example a key with id set via an env var that resolves to empty.","commonSituations":"Secret supplied through an environment variable that is unset in the deployment; YAML key list with a placeholder that was never substituted; partial key object copied from docs with secret left blank.","solutions":["Ensure every keys entry has both a non-empty id and secret.","Resolve the source env var/secret and confirm it is non-empty in the runtime environment.","Use a secrets manager / devkey to inject the secret rather than hardcoding blanks."],"exampleFix":"# before\nsigning:\n  enabled: true\n  keys:\n    - id: key-1\n      secret:    # blank -> startup failure\n\n# after\nsigning:\n  enabled: true\n  keys:\n    - id: key-1\n      secret: ${SIGNING_KEY_SECRET}","handlingStrategy":"validation","validationCode":"// Fail fast in a test:\nfor (Key k : props.getSigning().getKeys()) {\n    org.junit.jupiter.api.Assertions.assertFalse(\n        k.getId() == null || k.getId().isBlank() || k.getSecret() == null || k.getSecret().isBlank());\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Confirm signing secrets are non-empty in the runtime environment","Resolve env vars before deploy and check they are set","Do not leave secret placeholders blank in YAML"],"tags":["config","signing","startup","file-storage","conductor","java"],"backgroundTag":null,"analyzedSha":"cf7c3e4a8adfb158be778ab1ec525323c363cd3a","analyzedAt":"2026-08-14T03:33:19.897Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}