hyperledger/fabric · error

cannot load identity for consenter %s:%d: %s

Error message

cannot load identity for consenter %s:%d: %s

What it means

configtxgen's consenterProtosFromConfig builds orderer consenters for the genesis block. When a consenter entry in configtx.yaml specifies an Identity path, the file must be readable; otherwise the encoder aborts group creation with this wrapped os.ReadFile error.

Source

Thrown at internal/configtxgen/encoder/encoder.go:279

			clientCert, err := os.ReadFile(consenter.ClientTLSCert)
			if err != nil {
				return nil, fmt.Errorf("cannot load client cert for consenter %s:%d: %s", c.GetHost(), c.GetPort(), err)
			}
			c.ClientTlsCert = clientCert
		}

		if consenter.ServerTLSCert != "" {
			serverCert, err := os.ReadFile(consenter.ServerTLSCert)
			if err != nil {
				return nil, fmt.Errorf("cannot load server cert for consenter %s:%d: %s", c.GetHost(), c.GetPort(), err)
			}
			c.ServerTlsCert = serverCert
		}

		if consenter.Identity != "" {
			identity, err := os.ReadFile(consenter.Identity)
			if err != nil {
				return nil, fmt.Errorf("cannot load identity for consenter %s:%d: %s", c.GetHost(), c.GetPort(), err)
			}
			c.Identity = identity
		}

		consenterProtos = append(consenterProtos, c)
	}
	return consenterProtos, nil
}

// NewConsortiumOrgGroup returns an org component of the channel configuration.  It defines the crypto material for the
// organization (its MSP).  It sets the mod_policy of all elements to "Admins".
func NewConsortiumOrgGroup(conf *genesisconfig.Organization) (*cb.ConfigGroup, error) {
	consortiumsOrgGroup := protoutil.NewConfigGroup()
	consortiumsOrgGroup.ModPolicy = channelconfig.AdminsPolicyKey

	if conf.SkipAsForeign {
		return consortiumsOrgGroup, nil
	}

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Fix the Identity path in configtx.yaml (Consenter.Identity) to point to the existing certificate file, or use FABRIC_CFG_PATH/-configPath so relative paths resolve.
  2. Verify the file exists and is readable: ls -l <path> and check ownership/permissions.
  3. Regenerate crypto material with cryptogen if the MSP/tls directory tree is incomplete or stale.
  4. Set Identity to "" if the consenter genuinely has no identity file; the field is optional.

Example fix

// before (configtx.yaml)
Consenters:
  - Host: orderer.example.com
    Port: 7050
    Identity: ./crypto-config/ordererOrganizations/example.com/tlsca/server.crt
// after (path that actually exists relative to where configtxgen runs)
Consenters:
  - Host: orderer.example.com
    Port: 7050
    Identity: /full/path/crypto-config/ordererOrganizations/example.com/tlsca/server.crt
Defensive patterns

Strategy: validation

Validate before calling

const identityPath := consenter.Identity
if identityPath != "" {
    if _, err := os.Stat(identityPath); err != nil {
        return fmt.Errorf("consenter identity file not accessible at %s: %w", identityPath, err)
    }
}

Try / catch

if _, err := os.ReadFile(consenter.Identity); err != nil {
    // fail fast with a clear message naming the path from configtx.yaml
    return fmt.Errorf("cannot read consenter identity %q: %w", consenter.Identity, err)
}

Prevention

When it happens

Trigger: An Orderer's Org consenter in the OrdererGroup config has Consenter.Identity set to a TLS root-cert/identity file path that does not exist, is a relative path resolved from the wrong working directory, or is unreadable due to file permissions.

Common situations: Running configtxgen with -configPath different from where the crypto material was generated; using relative paths in configtx.yaml while invoking from another directory; incomplete cryptogen output; mounting only part of the crypto-config volume in a container.

Understand the failure class

Background: "File not found" and ENOENT errors: why libraries can't find a file that should exist — this error's family across 50 libraries.

Related errors


AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04). Data as JSON: /api/errors/d7bb59cbde382d71. Report an issue: GitHub.