基于Apache SSL的websocket上的MQTT

时间:2018-06-13 16:19:39

标签: apache ssl websocket proxy mqtt

我有一个提供未加密的websocket的mqtt代理。我想通过Apache代理它,它应该将websocket加密到外部。

它是Windows机器上的Apache 2.4。

我的配置是:



<VirtualHost *:80>
  ServerName test.someurl.com

  RewriteEngine On
  RewriteCond %{HTTP:Upgrade} =websocket [NC]
  RewriteRule /(.*)           ws://localhost:9876/$1 [P,L]
  
</VirtualHost>

<VirtualHost *:443>
  ServerName test.someurl.com
  
  SSLEngine on
  SSLCertificateFile "C:/Program Files (x86)/Apache24/conf/ssl/some_certificate.crt"
  SSLCertificateKeyFile "C:/Program Files (x86)/Apache24/conf/ssl/some_key.key"
  
  RewriteEngine On
  RewriteCond %{HTTP:Upgrade} =websocket [NC]
  RewriteRule /(.*)           ws://localhost:9876/$1 [P,L]

  # Websocket proxy
  # wss redirects to working ws protocol
  # ProxyPass /wss ws://127.0.0.1:9876 retry=0 keepalive=On 
  # ProxyPassReverse /wss ws://127.0.0.1:9876 retry=0
 </VirtualHost> 
&#13;
&#13;
&#13;

我可以通过ws / 80连接。它工作正常。但是,我无法使用wss进行连接。

我尝试使用重写和proxy_pass指令。我试过100种不同的解决方案然而,这个看起来最有希望,因为端口80正在为ws工作,但不适用于加密部分。任何的想法?或者我只是被选项O:)

蒙蔽了

1 个答案:

答案 0 :(得分:0)

这是一个老问题,但因为我刚刚开始工作:

我让 Mosquitto 监听端口 8000(该端口被防火墙阻止以阻止除本地主机之外的任何连接)

listener 8000
socket_domain ipv4
allow_anonymous true
protocol websockets

然后像这样设置apache:

<VirtualHost *:80>
  ProxyPass /ws/ ws://localhost:8000/
  ProxyPassReverse /ws/ ws://localhost:8000/
</VirtualHost>
<VirtualHost *:443>
    SSLCertificateFile ...
    SSLCertificateChainFile ...
    SSLCertificateKeyFile ...
    ProxyPass /ws/ ws://localhost:8000/
    ProxyPassReverse /ws/ ws://localhost:8000/
</VirtualHost>

最后,网络应用程序设置为如下连接:

mqtt.connect((window.location.protocol == "https:" ? "wss:" : "ws:") + "//example.org/ws/");

请注意,代理协议可以是“ws”或“wss”——两者似乎可以互换工作。这是apache和mosquitto之间的连接,不需要加密(它们在同一台主机上)。在路径上使用“/ws/”后缀意味着我可以不用 mod_rewrite,只需使用 mod_proxy。

这种方法是我在通过 HTTPS(公开)而不是通过 HTTP(在防火墙后面)访问时需要身份验证的唯一方法。