首页 文章

从SSL Apache请求访问非SSL socket.io(nodejs)服务器,同一主机

提问于
浏览
0

我几个小时都在扭转这个问题,找不到任何解决办法 .

我有一个在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”选项,但它是故意的 . 如果我将其设置为开启,则无处可用 .

我只想在端口8080(同一主机)上执行 redirect requests made to Apache via SSL port 443, to my non-SSL socket.io . 这个端口8080对外部连接是封闭的,我不希望在Apache和nodejs之间使用SSL,如果可能的话,并且去除所有这些无用的错误消息 .

有谁可以帮助我吗? ;)

2 回答

  • 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"
    
  • 1
    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);
    

相关问题