使用ngrok在Web Service上托管的Alexa技能:主机和端口的这种组合需要TLS

时间:2018-12-31 14:22:37

标签: alexa alexa-skills-kit ngrok

我正在尝试在我的Web服务上托管alexa技能。

出于测试目的,我使用ngrok生成https webservice网址。 我已将该网址添加到alexa配置中。

当我尝试测试服务时,我可以看到我的本地ngrok服务器收到如下请求。

GET /alexa/service/processrequest
Summary
Headers
Raw
Binary
GET /alexa/service/processrequest HTTP/1.1
Host: 9286ef9a.ngrok.io
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
X-Forwarded-Proto: https
X-Forwarded-For: 49.248.168.79

但是,它无法到达我正在通过Eclipse远程断点进行调试的Web服务/技能代码。 在ngrok中,我可以看到以下错误:

HTTP/1.1 400 
Content-Type: text/plain;charset=ISO-8859-1
Connection: close

Bad Request
This combination of host and port requires TLS.

我已通过生成自签名证书将spring-boot配置为在https端口443上运行。相同的证书已上传到Alexa开发人员控制台。

如果我使用ngrok网址在Google chrome中点击我的网络服务网址,则会出现相同的错误:

enter image description here

但是,如果我在URL中使用localhost,则chrome能够检测到https,如下所示:

enter image description here

我无法找到根本原因。 这里有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

我已经找到问题的答案,并且正在发布它,以便它可以帮助其他人了解在上述情况下的处理方法。

Spring-boot在端口443上为我的Web服务创建https端点。 在chrome中,如果我使用 https URL击中该端口,则它可以正常工作,但是如果我使用 http URL击中该端口,则将出现错误,如上面的屏幕截图所示。 因此,总的来说, spring-boot表示应该在https端点处接收到一个请求

罪魁祸首是 NGROK 。 :-(

尽管,ngrok正在创建一个https端点以供公共访问,但它并未创建从ngrok客户端(在我的PC上运行)到tomcat服务器的https隧道。 使用- tls选项,ngrok支持https / tls隧道传输,但这仅在ngrok的付费计划中发生

与ngrok类似,我也探索了localtunnel,但是它也存在 tls隧道的问题。

解决方法

由于我一直在调试本地计算机上的技能,因此我尝试了第2点here中提到的证书提供的其他选项。 此选项允许我仅将本地Web服务器用作http,而现在ngrok或localtunnel可以很好地支持它。 :-)

因此,按照我在开发期间启用调试Alexa Skill的步骤:

  1. 在Alexa Web控制台中使用SSL Provisioning的第二个选项。
  2. 删除了本地SSL端点,并在纯HTTP而非https上运行tomcat。
  3. 在Alexa Web控制台中使用ngrok https终结点。