{"record":{"id":"845b1a26280478fe","repo":"grpc/grpc-java","slug":"server-serveruri-no-supported-channel-credenti","errorCode":null,"errorMessage":"Server ${serverUri}: no supported channel credentials found","messagePattern":"Server (.+?): no supported channel credentials found","errorType":"exception","errorClass":"XdsInitializationException","httpStatus":null,"severity":"critical","filePath":"xds/src/main/java/io/grpc/xds/GrpcBootstrapperImpl.java","lineNumber":141,"sourceCode":"      } else {\n        defaultBootstrap = new GrpcBootstrapperImpl().bootstrap(defaultBootstrapOverride);\n      }\n    }\n    return defaultBootstrap;\n  }\n\n  private static ConfiguredChannelCredentials getChannelCredentials(Map<String, ?> serverConfig,\n                                                                  String serverUri)\n      throws XdsInitializationException {\n    List<?> rawChannelCredsList = JsonUtil.getList(serverConfig, \"channel_creds\");\n    if (rawChannelCredsList == null || rawChannelCredsList.isEmpty()) {\n      throw new XdsInitializationException(\n          \"Invalid bootstrap: server \" + serverUri + \" 'channel_creds' required\");\n    }\n    ConfiguredChannelCredentials credentials =\n        parseChannelCredentials(JsonUtil.checkObjectList(rawChannelCredsList), serverUri);\n    if (credentials == null) {\n      throw new XdsInitializationException(\n          \"Server \" + serverUri + \": no supported channel credentials found\");\n    }\n    return credentials;\n  }\n\n  @Nullable\n  private static ConfiguredChannelCredentials parseChannelCredentials(List<Map<String, ?>> jsonList,\n          String serverUri)\n      throws XdsInitializationException {\n    for (Map<String, ?> channelCreds : jsonList) {\n      String type = JsonUtil.getString(channelCreds, \"type\");\n      if (type == null) {\n        throw new XdsInitializationException(\n            \"Invalid bootstrap: server \" + serverUri + \" with 'channel_creds' type unspecified\");\n      }\n      XdsCredentialsProvider provider =  XdsCredentialsRegistry.getDefaultRegistry()\n          .getProvider(type);\n      if (provider != null) {","sourceCodeStart":123,"sourceCodeEnd":159,"githubUrl":"https://github.com/grpc/grpc-java/blob/64daddc1f3d1975670f769f3e97bde8b2ba32d25/xds/src/main/java/io/grpc/xds/GrpcBootstrapperImpl.java#L123-L159","documentation":"Thrown by GrpcBootstrapperImpl.getChannelCredentials when the bootstrap file's servers[].channel_creds list contains no entry whose 'type' matches a registered provider in XdsCredentialsRegistry. The gRPC xDS bootstrap requires at least one supported channel credential type per xDS server to establish the control-plane channel. If parseChannelCredentials returns null (all types unrecognized), initialization aborts with this XdsInitializationException.","triggerScenarios":"Calling Bootstrapper readBootstrap with a bootstrap JSON whose server entry lists only channel_creds entries with unsupported or typo'd 'type' values (e.g. 'tls' misspelled, or a custom type without a registered provider), so parseChannelCredentials iterates the whole list and returns null.","commonSituations":"Hand-edited bootstrap files with wrong credential type strings; bootstraps generated for a different gRPC implementation (e.g. Envoy-style types not registered in the Java registry); older grpc-java versions lacking a credential provider that the bootstrap assumes.","solutions":["Add a channel_creds entry with a supported 'type' (e.g. \"type\": \"google_default\" or \"insecure\") to the failing server in the bootstrap file.","Verify the 'type' string spelling against the types registered in XdsCredentialsRegistry for your grpc-java version.","If using a custom credential type, register an XdsCredentialsProvider in the registry before bootstrap parsing.","Regenerate the bootstrap file with a tool/version matching your grpc-java runtime."],"exampleFix":"// before (bootstrap.json)\n\"channel_creds\": [{\"type\": \"tls_pem\"}]\n// after\n\"channel_creds\": [{\"type\": \"insecure\"}]","handlingStrategy":"validation","validationCode":"// Java: pre-validate bootstrap JSON before feeding to xDS\nMap<String, ?> server = JsonUtil.getObject(bootstrapJson, \"servers\")[0];\nList<Map<String, ?>> creds = JsonUtil.checkObjectList(server.get(\"channel_creds\"));\nboolean supported = creds.stream().anyMatch(c ->\n    XdsCredentialsRegistry.getDefaultRegistry().getProvider(JsonUtil.getString(c, \"type\")) != null);\nif (!supported) throw new IllegalArgumentException(\"bootstrap has no supported channel_creds type\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use only documented channel_creds types in bootstrap files","Validate bootstrap JSON against the gRPC xDS bootstrap schema in CI","Pin bootstrap generator tooling to versions matching your grpc-java"],"tags":["xds","bootstrap","credentials","config"],"backgroundTag":"unsupported-config-value","analyzedSha":"64daddc1f3d1975670f769f3e97bde8b2ba32d25","analyzedAt":"2026-09-08T06:14:57.704Z","contentChangedAt":"2026-09-08T06:14:57.704Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}