{"record":{"id":"f2c57484d5b8b19e","repo":"hyperledger/fabric","slug":"error-creating-signed-proposal-s","errorCode":null,"errorMessage":"Error creating signed proposal %s","messagePattern":"Error creating signed proposal (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/peer/channel/join.go","lineNumber":97,"sourceCode":"func executeJoin(cf *ChannelCmdFactory, spec *pb.ChaincodeSpec) (err error) {\n\t// Build the ChaincodeInvocationSpec message\n\tinvocation := &pb.ChaincodeInvocationSpec{ChaincodeSpec: spec}\n\n\tcreator, err := cf.Signer.Serialize()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"Error serializing identity for %s: %s\", cf.Signer.GetIdentifier(), err)\n\t}\n\n\tvar prop *pb.Proposal\n\tprop, _, err = protoutil.CreateProposalFromCIS(pcommon.HeaderType_CONFIG, \"\", invocation, creator)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"Error creating proposal for join %s\", err)\n\t}\n\n\tvar signedProp *pb.SignedProposal\n\tsignedProp, err = protoutil.GetSignedProposal(prop, cf.Signer)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"Error creating signed proposal %s\", err)\n\t}\n\n\tvar proposalResp *pb.ProposalResponse\n\tproposalResp, err = cf.EndorserClient.ProcessProposal(context.Background(), signedProp)\n\tif err != nil {\n\t\treturn ProposalFailedErr(err.Error())\n\t}\n\n\tif proposalResp == nil {\n\t\treturn ProposalFailedErr(\"nil proposal response\")\n\t}\n\n\tif proposalResp.Response.Status != 0 && proposalResp.Response.Status != http.StatusOK {\n\t\treturn ProposalFailedErr(fmt.Sprintf(\"bad proposal response %d: %s\", proposalResp.Response.Status, proposalResp.Response.Message))\n\t}\n\tlogger.Info(\"Successfully submitted proposal to join channel\")\n\treturn nil\n}","sourceCodeStart":79,"sourceCodeEnd":115,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/internal/peer/channel/join.go#L79-L115","documentation":"After building the join proposal, executeJoin signs it with protoutil.GetSignedProposal(cf.Signer). If signing fails — the signer cannot produce a valid signature over the proposal (e.g. missing or unreadable private key) — this error is returned. It occurs before the proposal is sent to the endorser.","triggerScenarios":"Running `peer channel join` when the local MSP signing identity lacks a usable private key: empty keystore, wrong key file permissions, or an msp config path where the signcert does not match the keystore key.","commonSituations":"Admin MSP directory copied without the keystore; key file renamed or with 000 permissions; mismatched cert/key after regenerating crypto material; BCCSP/HSM keystore misconfiguration in core.yaml.","solutions":["Ensure CORE_PEER_MSPCONFIGPATH/keystore contains the private key matching signcerts and is readable.","Fix file permissions (chmod 600) or re-copy the full admin MSP directory.","Verify BCCSP configuration (software vs PKCS11/HSM) matches how the key was generated.","Regenerate the admin identity if cert and key no longer match."],"exampleFix":"// before\nls msp/keystore   # empty — key missing\n// after\ncp admin_sk msp/keystore/priv_sk && chmod 600 msp/keystore/priv_sk","handlingStrategy":"validation","validationCode":"// bash\nKEY=$(ls \"$CORE_PEER_MSPCONFIGPATH/keystore\" 2>/dev/null | head -n1)\n[ -n \"$KEY\" ] && [ -r \"$CORE_PEER_MSPCONFIGPATH/keystore/$KEY\" ] \\\n  || { echo \"no readable private key in keystore\"; exit 1; }\nchmod 600 \"$CORE_PEER_MSPCONFIGPATH/keystore/$KEY\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Ensure keystore contains the private key matching signcerts before any signing operation.","Set 600 permissions on key files and correct ownership for the CLI user.","Match BCCSP config (SW vs PKCS11) to how keys were provisioned.","Copy complete MSP directories, never cert-only subsets."],"tags":["hyperledger-fabric","signing","msp"],"backgroundTag":"proposal-signing-failed","analyzedSha":"2736b63f8fd5932511d56fe68b7039d15977f7f6","analyzedAt":"2026-09-04T08:52:36.465Z","contentChangedAt":"2026-09-04T08:52:36.465Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}