使用apache隧道安全websocket连接
我有一个只能通过HTTPS访问的Apache。我想从运行在同一台机器上的另一个服务器应用程序为websocket提供服务,但由于客户端不可能在443以外的其他端口连接到我们的服务器,因此这些websocket连接需要通过Apache代理 现在,我已经安装了mod_proxy,并将其配置如下:使用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
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可能就能够通过原始流量进行连接。不确定。如果这样行的话,我也会感兴趣的 如果上述情况不成立,请参阅以下详细信息:
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
Forhttps
呢?这个问题有什么进展吗?似乎有新的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()