{"record":{"id":"0280c32bc0ed8f3e","repo":"SonarSource/sonarqube","slug":"unsupported-connector","errorCode":null,"errorMessage":"Unsupported connector: ","messagePattern":"Unsupported connector: ","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"server/sonar-webserver/src/main/java/org/sonar/server/app/EmbeddedTomcat.java","lineNumber":88,"sourceCode":"    webappContext = new TomcatContexts().configure(tomcat, props);\n    try {\n      tomcat.start();\n      validateConnectorScheme();\n    } catch (LifecycleException e) {\n      LOGGER.error(\"Failed to start web server\", e);\n      Throwables.propagate(e);\n    }\n  }\n\n  private File tomcatBasedir() {\n    return new File(props.value(PATH_TEMP.getKey()), \"tc\");\n  }\n\n  private void validateConnectorScheme() {\n    Connector[] connectors = tomcat.getService().findConnectors();\n    for (Connector connector : connectors) {\n      if (!connector.getScheme().equals(\"http\")) {\n        throw new IllegalArgumentException(\"Unsupported connector: \" + connector);\n      }\n    }\n  }\n\n  Status getStatus() {\n    if (webappContext == null) {\n      return Status.DOWN;\n    }\n    return switch (webappContext.getState()) {\n      case NEW, INITIALIZING, INITIALIZED, STARTING_PREP, STARTING -> Status.DOWN;\n      case STARTED -> Status.UP;\n      default ->\n        // problem, stopped or failed\n        Status.FAILED;\n    };\n  }\n\n  public enum Status {","sourceCodeStart":70,"sourceCodeEnd":106,"githubUrl":"https://github.com/SonarSource/sonarqube/blob/184c821202192afc1c599fc912d0889b69fffa53/server/sonar-webserver/src/main/java/org/sonar/server/app/EmbeddedTomcat.java#L70-L106","documentation":"During startup, EmbeddedTomcat.validateConnectorScheme iterates all configured Tomcat connectors and asserts each reports scheme \"http\". Any connector configured with a non-http scheme (e.g. https/SSL) is unsupported because SonarQube expects TLS termination to happen in a reverse proxy in front of Tomcat; such a connector triggers this IllegalArgumentException and aborts startup.","triggerScenarios":"Configuring sonar.web.https.* / an SSL-enabled connector, or programmatically adding an HTTPS connector to the embedded Tomcat before start().","commonSituations":"Users trying to enable HTTPS directly on SonarQube's embedded Tomcat instead of using a reverse proxy (nginx/Apache/IIS); leftover custom connector configuration.","solutions":["Remove the HTTPS/SSL connector configuration and serve SonarQube over plain HTTP on the web port","Terminate TLS in a reverse proxy in front of SonarQube and set sonar.web.https related proxy headers (sonar.web.port / sonar.server.basehttpurl accordingly)","If embedding Tomcat programmatically, only add connectors whose getScheme() returns \"http\""],"exampleFix":"// before\nconnector.setScheme(\"https\");\nconnector.setSecure(true);\n// after\nconnector.setScheme(\"http\"); // terminate TLS at the reverse proxy instead","handlingStrategy":"validation","validationCode":"if (!connector.getScheme().equals(\"http\")) throw new IllegalArgumentException(\"Serve HTTPS via a reverse proxy, not the embedded Tomcat connector\");","typeGuard":null,"tryCatchPattern":"try { tomcat.start(); } catch (IllegalArgumentException e) { if (e.getMessage().startsWith(\"Unsupported connector\")) { log.error(\"Use a reverse proxy for TLS; remove SSL connector config\"); } throw e; }","preventionTips":["Never configure sonar.web HTTPS/SSL on the embedded Tomcat; front it with nginx/Apache/IIS","Keep sonar.web.port plain HTTP and set sonar.server.basehttpurl to the public HTTPS URL"],"tags":["tomcat","https","configuration"],"backgroundTag":"invalid-config-value","analyzedSha":"184c821202192afc1c599fc912d0889b69fffa53","analyzedAt":"2026-09-09T12:23:51.573Z","contentChangedAt":"2026-09-09T12:23:51.573Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}