SwaggerUI TIBCO BusinessWorks is one of the features available by default to all the TIBCO BusinessWorks REST Service developed. As you probably know, SwaggerUI is just an HTML Page with a graphical representation of the Swagger definition file (or OpenAPI specification to be more accurate with the current version of the standards in use) that helps to understand the operation and capabilities exposed by the service and also provide an easy way to test the service as you can see in the picture below:
This interface is provided out of the box for any REST Service developed using TIBCO BusinessWorks that uses a different port (7777 by default) in case we’re talking about an on-premises deployment or in the /swagger endpoint in case we are talking about a TIBCO BusinessWorks Container Edition.
How does SwaggerUI work to load the Swagger Specification?
SwaggerUI works in a particular way. When you reach the URL of the SwaggerUI, there is another URL that is usually part of a text field inside the web page that holds the link to the JSON or YAML document that stores the actual specification, as you can see in the picture below:
So, you can think that this is a 2-call kind of process:
- First call loads the SwaggerUI as a graphical container
- Then, based on the internal URL provided there, do a second call to retrieve the document specification
- And with that information, render the information in the SwaggerUI format.
The issue is raised when the SwaggerUI is exposed behind a Load Balancer because the second URL needs to use the advertised URL as the backend server is not reached directly by the client browsing the SwaggerUI. This is solved out of the box with Kubernetes capabilities in the case of TIBCO BWCE, and for the on-premises deployment, it offers two properties to handle that as follows:
# ------------------------------------------------------------------------------ # Section: BW REST Swagger Configuration. The properties in this section # are applicable to the Swagger framework that is utilized by the BW REST # Binding. # # Note: There are additional BW REST Swagger configuration properties that # can be specified in the BW AppNode configuration file "config.ini". Refer to # the BW AppNode configuration file's section "BW REST Swagger configuration" # for details. # ------------------------------------------------------------------------------ # Swagger framework reverse proxy host name. This property is optional and # it specifies the reverse proxy host name on which Swagger framework serves # the API's, documentation endpoint, api-docs, etc.. bw.rest.docApi.reverseProxy.hostName=localhost # Swagger framework port. This property is optional and it specifies the # reverse proxy port on which Swagger framework serves the API's, documentation # endpoint, api-docs, etc. bw.rest.docApi.reverseProxy.port=0000
You can browse the official documentation page for more detailed information.
That solves the main issue regarding the hostname and the port to be reached as the final user requires. Still, there is an outstanding component on the URL that could generate an issue, and that’s the protocol, so, in a nutshell, if this is exposed using HTTP or HTTPS.
How to Handle Swagger URL when offloading SSL?
Until the release of TIBCO BWCE 2.8.3, the protocol depended on the HTTP Connector configuration you used to expose the swagger component. So, if you use an HTTP connector without SSL configuration, it will try to reach the endpoint using an HTTP connection. In the other case, if you use an HTTP connector with an SSL connection, it will try to use an HTTPS connection. That seems fine, but some use cases could generate a problem:
SSL Certificate offloaded in the Load Balancer: If we offload the SSL configuration on the Load Balancer as it is used in traditional on-premises deployments and some of the Kubernetes configurations, the consumer will establish an HTTPS connection to the Load Balancer, but internally the communication with the BWCE will be done using HTTP, so, in this case, it will generate a mismatch, because in the second call of the requests it will guess that as the HTTP Connector from BWCE is not using HTTPS, the URL should be reached using HTTP but that’s not the case as the communication goes through the Load Balancer that is handled the security.
Service Mesh Service Exposition: Similar to the previous case, but in that case, close to the Kubernetes deployment. Suppose we are using Service Mesh such as Istio or others. In that case, security is one of the things that needs to be handled. Hence, the situation is the same as the scenario above because the BWCE doesn’t know the security configuration but is impacting the default endpoint generated.
How To Enable SwaggerUI TIBCO BusinessWorks when Offloading SSL Certificates?
Since BWCE 2.8.3, there is a new JVM property that we can use to force the endpoint generated to be HTTPS even if the HTTP Connector used by the BWCE application doesn’t have any security configuration that helps us to solve this issue in the cases above and similar scenario. The property can be added as any other JVM property using the
BW_JAVA_OPTS environment property, and the value is this: