hyperledger/fabric · error

cannot obtain orderer endpoint, no signer was configured

Error message

cannot obtain orderer endpoint, no signer was configured

What it means

Some lifecycle commands need to discover an orderer endpoint (via the cscc system chaincode) when none is given on the command line. That discovery requires signing the request, so if viper's "orderer.address" is unset and c.Signer is nil, this error is returned.

Source

Thrown at internal/peer/lifecycle/chaincode/client_connections.go:205

func (c *ClientConnections) setCertificate() error {
	certificate, err := common.GetClientCertificate()
	if err != nil {
		return errors.WithMessage(err, "failed to retrieve client cerificate")
	}

	c.Certificate = certificate

	return nil
}

func (c *ClientConnections) setOrdererClient() error {
	oe := viper.GetString("orderer.address")
	if oe == "" {
		// if we're here we didn't get an orderer endpoint from the command line
		// so we'll attempt to get one from cscc - bless it
		if c.Signer == nil {
			return errors.New("cannot obtain orderer endpoint, no signer was configured")
		}

		if len(c.EndorserClients) == 0 {
			return errors.New("cannot obtain orderer endpoint, empty endorser list")
		}

		orderingEndpoints, err := common.GetOrdererEndpointOfChainFnc(channelID, c.Signer, c.EndorserClients[0], c.CryptoProvider)
		if err != nil {
			return errors.WithMessagef(err, "error getting channel (%s) orderer endpoint", channelID)
		}
		if len(orderingEndpoints) == 0 {
			return errors.Errorf("no orderer endpoints retrieved for channel %s, pass orderer endpoint with -o flag instead", channelID)
		}

		logger.Infof("Retrieved channel (%s) orderer endpoint: %s", channelID, orderingEndpoints[0])
		// override viper env
		viper.Set("orderer.address", orderingEndpoints[0])
	}

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Pass --ordererAddress (orderer.address) explicitly so discovery is unnecessary
  2. Configure a valid signer/MSP identity (check CORE_PEER_LOCALMSPID, CORE_PEER_MSPCONFIGPATH) so c.Signer is populated
  3. Ensure at least one endorser client exists too, since the next check requires it for discovery
  4. If embedding the library, initialize the Signer before calling NewClientConnections

Example fix

// before
peer lifecycle chaincode <cmd> ...   // no orderer address, no valid MSP
// after
export CORE_PEER_MSPCONFIGPATH=$PWD/crypto-config/peerOrganizations/org1/users/Admin@org1/msp
peer lifecycle chaincode <cmd> --ordererAddress orderer.example.com:7050 ...
Defensive patterns

Strategy: validation

Validate before calling

if os.Getenv("ORDERER_ADDRESS") == "" && viper.GetString("orderer.address") == "" {
  if mspConfigPath == "" { return errors.New("configure --ordererAddress or a valid MSP identity") }
}

Type guard

func canDiscoverOrderer(ordererAddress string, signer identity.Signer) bool { return ordererAddress != "" || signer != nil }

Try / catch

if err := run(cmd); err != nil && strings.Contains(err.Error(), "no signer was configured") { log.Fatal("set --ordererAddress or fix CORE_PEER_MSPCONFIGPATH so a signer exists") }

Prevention

When it happens

Trigger: setOrdererClient runs with no orderer.address configured and a nil Signer — e.g. the client identity/signer was not initialized before NewClientConnections, typically when embedding the library or a misconfigured identity.

Common situations: Programmatic use of the lifecycle chaincode package without loading the user's MSP/signer; running the CLI without a valid membership identity so no signer could be created; no --ordererAddress and no orderer.address in config/env.

Related errors


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