Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用apache隧道安全websocket连接_Apache_Ssl_Websocket_Mod Proxy - Fatal编程技术网

使用apache隧道安全websocket连接

使用apache隧道安全websocket连接,apache,ssl,websocket,mod-proxy,Apache,Ssl,Websocket,Mod Proxy,我有一个只能通过HTTPS访问的Apache。我想从运行在同一台机器上的另一个服务器应用程序为websocket提供服务,但由于客户端不可能在443以外的其他端口连接到我们的服务器,因此这些websocket连接需要通过Apache代理 现在,我已经安装了mod_proxy,并将其配置如下: SSLProxyEngine on ProxyPass /ws https://127.0.0.1:9001 然而,这不起作用。我可以连接到https://server/ws 现在在我的浏览器中,apac

我有一个只能通过HTTPS访问的Apache。我想从运行在同一台机器上的另一个服务器应用程序为websocket提供服务,但由于客户端不可能在443以外的其他端口连接到我们的服务器,因此这些websocket连接需要通过Apache代理

现在,我已经安装了mod_proxy,并将其配置如下:

SSLProxyEngine on
ProxyPass /ws https://127.0.0.1:9001
然而,这不起作用。我可以连接到https://server/ws 现在在我的浏览器中,apache似乎吞下了websocket头的一部分,因此真正的websocket连接无法工作


如何通过Apache服务器实现websocket连接的隧道传输?

如果您不希望Apache终止SSL连接(并转发未加密的websocket流量),但是,如果在最终目标WebSocket服务器上终止SSL,并且希望在传入Apache的WebSocket流量上使用WSS,那么mod_proxy_connect可能就能够通过原始流量进行连接。不确定。如果这样行的话,我也会感兴趣的

如果上述情况不成立,请参阅以下详细信息:

在任何情况下,使用Apache都会严重限制并发服务的WebSocket连接数量的可伸缩性,因为每个WS-connection都会消耗Apache上的一个进程/线程。

我已经让它工作了

脚本 apachehttpd 我使用的是ApacheHTTPD2.4.9,它提供了现成的mod_proxy_wstunnel。但是,提供的mod_proxy_wstunnel.so在使用wss://方案时不支持SSL。它最终尝试以明文形式连接到后端(Tomcat),这导致SSL握手失败。见小虫。因此,您必须按照bug报告中建议的更正,自己修补mod_proxy_wstunnel.c。这是一个简单的3行改变

Suggested correction,
314a315
>     int is_ssl = 0;
320a322
>         is_ssl = 1;
344c346
<     backend->is_ssl = 0;
---
>     backend->is_ssl = is_ssl;
请注意最后一个开关:
--enable-proxy\u wstunel=shared
起初,我错误地使用了
--enable-proxy wstunel=shared
,这似乎构建得很好,但在使用结果.so文件时最终无法工作。看到区别了吗?您要确保在“代理隧道”中使用下划线,而不是破折号

apachehttpd配置 httpd.conf 雄猫 假设您的HTTP连接器设置正确,那么在tomcat中没有太多可配置的内容。尽管为了帮助调试,我发现创建一个如下所示的
$CATALINA_HOME/bin/setenv.sh
很有用:

setenv.sh 这允许我查看我修改的mod_proxy_wstunnel.so是否适用于wss://。当它不工作时,我的catalina.out日志文件将显示:

javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
http-nio-8443-exec-1, SEND TLSv1 ALERT:  fatal, description = internal_error
http-nio-8443-exec-1, WRITE: TLSv1 Alert, length = 2
http-nio-8443-exec-1, called closeOutbound()
http-nio-8443-exec-1, closeOutboundInternal()
最后的想法
虽然我使用的是ApacheHTTPD2.4.9。希望我上面的笔记可以应用于那些旧版本

谢谢你的回复。但是,我认为mod_proxy_connect在这方面没有帮助,因为它只处理来自浏览器的连接请求。我需要的是透明的反向代理。顺便说一句,只要我不使用SSL,它就可以正常工作。我必须重定向唯一的WebSocket请求,并通过apache虚拟主机本身处理https请求,我正在重定向此WebSocket。对于这一点,我是否也需要
ProxyPass
ProxyPassReverse
For
https
呢?这个问题有什么进展吗?似乎有新的Apache模块可以让这更容易。然而,我已经求助于使用stunnel+HAproxy,stunnel来接受SSL连接,并将未加密的流量传递给HAproxy,然后由HAproxy决定是否存在“Upgrade:WebSocket”头,它应该将其重定向到WebSocket服务器还是通过普通HTTP重定向到Apache。对于HAproxy的1.5版(目前正在开发中),可能不再需要使用stunnel。值得注意的是,mod_proxy_wstunel还可以将非SSL websocket封装在SSL代理之后。@PhilLello,那么我假设如果您通过非SSL websocket连接到WS,您将不需要修改后的mod_proxy_wstunel,但是可以使用“开箱即用”的方式。如果ApacheConnectVisWSS在本地主机上运行,有没有令人信服的理由让它使用ws而不是ws?看起来是个不错的解决方案。@Tom,你认为,从安全角度来看,这是个不错的解决方案吗?我不是WebSocket专家,但我认为,将安全连接重定向到非安全连接不是一件好事(如果我错了,请纠正我),谢谢!实际上,我正试图将一个非ssl websocket封装在ssl代理之后,但似乎无法让它工作。。有什么提示吗?注意:提到的apache错误从2.4.10开始就已经修复了。
Suggested correction,
314a315
>     int is_ssl = 0;
320a322
>         is_ssl = 1;
344c346
<     backend->is_ssl = 0;
---
>     backend->is_ssl = is_ssl;
./configure --prefix=/usr/local/apache --with-included-apr --enable-alias=shared
--enable-authz_host=shared --enable-authz_user=shared 
--enable-deflate=shared --enable-negotiation=shared 
--enable-proxy=shared --enable-ssl=shared --enable-reqtimeout=shared
--enable-status=shared --enable-auth_basic=shared
--enable-dir=shared --enable-authn_file=shared
--enable-autoindex=shared --enable-env=shared --enable-php5=shared
--enable-authz_default=shared --enable-cgi=shared
--enable-setenvif=shared --enable-authz_groupfile=shared
--enable-mime=shared --enable-proxy_http=shared
--enable-proxy_wstunnel=shared
...
LoadModule proxy_module modules/mod_proxy.so
...
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
...
LoadModule ssl_module modules/mod_ssl.so
...
Include conf/extra/httpd-ssl.conf
...
LogLevel debug
ProxyRequests off

# Note, this is the preferred ProxyPass configuration, and *should* be equivalent
# to the same inline version below, but it does NOT WORK!
#<Location /app/ws/>
#        ProxyPass wss://localhost:8443/app/ws
#        ProxyPassReverse wss://localhost:8443/app/ws
#</Location>
#<Location /app/>
#        ProxyPass https://localhost:8443/app/
#        ProxyPassReverse https://localhost:8443/app/
#</Location>

# NOTE: Pay strict attention to the slashes "/" or lack thereof!
# WebSocket url endpoint
ProxyPass /app/ws/ wss://localhost:8443/app/ws
ProxyPassReverse /app/ws/ wss://localhost:8443/app/ws

# Everything else
ProxyPass /app/ https://localhost:8443/app/
ProxyPassReverse /app/ https://localhost:8443/app/
#LoadModule reqtimeout_module modules/mod_reqtimeout.so
CATALINA_OPTS=$CATALINA_OPTS" -Djavax.net.debug=all -Djavax.net.debug=ssl:handshake:verbose"
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
http-nio-8443-exec-1, SEND TLSv1 ALERT:  fatal, description = internal_error
http-nio-8443-exec-1, WRITE: TLSv1 Alert, length = 2
http-nio-8443-exec-1, called closeOutbound()
http-nio-8443-exec-1, closeOutboundInternal()