【问题标题】:Accessing non-SSL socket.io (nodejs) server from SSL Apache request, same host从 SSL Apache 请求访问非 SSL socket.io (nodejs) 服务器,同一主机
【发布时间】:2015-09-15 00:27:05
【问题描述】:

我将这个问题转了几个小时,但找不到任何解决方案。

我有一个在nodejs上运行的socket.io服务器,监听非SSL端口8080,启动如下:

var io = require('socket.io').listen(8080);

我使用代理通过 Apache 连接到 socket.io 服务器:

<VirtualHost *:443>
ServerName www.mysite.com
DocumentRoot /var/www/vhosts/mysite
ErrorLog logs/mysite.log
TransferLog logs/ssl.access.log

SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
SSLCertificateFile /etc/pki/tls/certs/mysite.crt
SSLCertificateKeyFile /etc/pki/tls/private/mysite.key
SSLCertificateChainFile /etc/pki/tls/certs/geotrust.crt

RewriteEngine On
RewriteCond %{REQUEST_URI}  ^/socket.io [NC]
RewriteCond %{QUERY_STRING} transport=websocket [NC]
RewriteRule /(.*) ws://localhost:8080/$1 [P,L]

ProxyRequests Off
ProxyPass /socket.io http://localhost:8080/socket.io
ProxyPassReverse /socket.io http://localhost:8080/socket.io

在客户端,我使用以下代码打开我的 socket.io 连接:

var socket = io.connect('https://'+hostname, {secure:true});

从用户的角度来看,一切正常,除了我的 Apache 日志中有大量错误消息:

[ssl:error] [pid 15080] [remote 127.0.0.1:443] AH01961: SSL Proxy requested for www.mysite.com:443 but not enabled [Hint: SSLProxyEngine]
[proxy:error] [pid 15080] AH00961: HTTPS: failed to enable ssl support for 127.0.0.1:443 (www.mysite.com)

我意识到我没有使用“SSLProxyEngine on”选项,但这是故意的。如果我将其设置为开启,则不再有任何效果。

我只想将通过 SSL 端口 443 向 Apache 发出的请求重定向到端口 8080(同一主机)上的非 SSL socket.io。这个端口 8080 对外部连接是关闭的,如果可能的话,我不想要求在 Apache 和 nodejs 之间使用 SSL,并摆脱所有这些无用的错误消息。

有人可以帮帮我吗? ;)

【问题讨论】:

    标签: node.js apache ssl proxy socket.io


    【解决方案1】:

    在这里找到 Websocket apache proxy issues with ssl

    您必须在

    上编辑 apache site.conf
    SSLUseStapling on
    ProxyRequests Off
    ProxyPreserveHost on
    ProxyPass /socket.io http://localhost:8080/socket.io
    ProxyPassReverse /socket.io http://localhost:8080/socket.io
    
    SSLProxyEngine on 
    SSLProxyVerify none
    SSLProxyCheckPeerCN off
    SSLProxyCheckPeerName off
    SSLProxyCheckPeerExpire off
    RequestHeader set Front-End-Https "On"  
    

    【讨论】:

      【解决方案2】:
      var proxy = require('http-proxy').createProxyServer();
      var fs = require('fs');
      
      express = require('express.io');
      app = express();
      
      
      var SSloptions = {
          key:    fs.readFileSync('/var/www/node/certificados/mig.xxx.key'),
          cert:   fs.readFileSync('/var/www/node/certificados/xxxx.crt'),    
          ca: [
              fs.readFileSync('/var/www/node/certificados/gd_bundle-xxxx.crt')
          ],
          rejectUnauthorized: false,
          requestCert: true,
          agent: false,
          strictSSL: false
      };
      
      
      app.https(SSloptions).io();
      
      
      app.all('*', function(req, res){
          proxy.web(req, res, {
              target: 'https://localhost:4443',
              secure: true
          });    
      });
      
      app.listen(14443);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-11
        • 2018-01-25
        • 2020-02-02
        • 2016-04-19
        相关资源
        最近更新 更多