En un servidor de aplicaciones sobre JAVA, existe la posibilidad de definir y personalizar determinadas restricciones de seguridad (security constraints) con el fin de limitar los privilegios y métodos de acceso a determinadas aplicaciones ó URLs.
Una de estas restricciones se basa en la capa de transporte (transport-guarantee), permitiendo especificar los métodos de comunicación permitidos entre el cliente y el servidor de aplicaciones, o más concretamente en este caso, la aplicación. En otras palabras, podemos obligar a que los datos recibidos por parte del cliente estén cifrados (HTTPS).
Así pues, podemos encontrarnos por ejemplo, con el error del título al intentar acceder a una aplicación utilizando HTTPS cuando está preparada para recibir sólo HTTP (o viceversa):
javax.enterprise.system.container.ejb|_ThreadID=694;_ThreadName=TP-Processor662; _RequestID=11ba432a-13f8-4e8e-a4ea-dd2a41f07e03;| Invalid request scheme for Endpoint. Expected http . Received https|#]
En este caso, el frontal web (Apache) estaba accediendo a la aplicación a través de un vhost HTTPS, siendo que la app esperaba recibir tráfico HTTP.
La solución es, configurar la aplicación para permitir tráfico HTTPS, que en este caso es el transport-guarantee del tipo CONFIDENTIAL. En el caso de un glassfish, por ejemplo, especificamos esta configuración en el archivo sun-ejb-jar.xml de la aplicación (dentro de META-INF). O en cualquier caso, donde se estén especificando las restricciones de seguridad de JAVA para el webservice:
<sun-ejb-jar> <enterprise-beans> <ejb> <ejb-name>FOO</ejb-name> <webservice-endpoint> <port-component-name>FOO</port-component-name> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </webservice-endpoint> </ejb> </enterprise-beans> </sun-ejb-jar>
Redespliegue de la aplicación, y listo. El error debería desaparecer.