Apache和NodeJS over SSL

时间:2015-12-04 09:14:05

标签: node.js apache ssl-certificate

我需要从HTTP切换到HTTPS才能使用getUsermedia进行webrtc实现。我已在我的Apache 2.2.22版本上安装了证书并使其正常运行。

在网站中,我使用了主机NodeJS。也许不是理想的设置,但是当客户端上的socket.io想要与NodeJS服务器通信时,我遇到了问题。

在控制台中显示以下消息:

GET https://mydomain.nl:1900/socket.io/?EIO=3&transport=polling&t=1449219985177-166 net::ERR_CONNECTION_CLOSED 

对我来说很明显,NodeJS服务器应用程序无法通过HTTPS处理请求,因为它是一个HTTP服务器。

我想改变该服务器,以便能够使用已在apache网络服务器上安装的SSL来提供HTTPS请求。

这有可能吗?

3 个答案:

答案 0 :(得分:14)

我建议看看apache的mod_proxy。这将允许您通过apache SSL管道运行外部请求。 node.js只能在没有ssl支持的localhost接口上运行,因为它是apache的代理服务器。我你配置一个vhost,它看起来像这样:

<VirtualHost *:443>
  ServerName www.yourserver.com
  DocumentRoot /var/www/vhosts/www.yourserver.com/public_html

  CustomLog <LOG-PATH> combined
  ErrorLog <ERROR-LOG-PATH>

  # Example SSL configuration
  SSLEngine on
  SSLProtocol all -SSLv2
  SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
  SSLCertificateFile "<CERT-PATH>/server.crt"
  SSLCertificateKeyFile "<CERT-PATH>/server.key"

  ProxyPass /<PATH>/ http://localhost:1900/
  ProxyPassReverse /<PATH>/ http://myserver:1900/
</VirtualHost>

您的请求将如下所示:

GET https://mydomain.nl/<PATH>/?.... 

<PATH>的值与vhost config的<ProxyPass>指令中的值相同。

答案 1 :(得分:2)

通过创建一个单独的Vhost作为Node js的代理来解决它。将其命名为socket.mydomain.nl,一切正常

答案 2 :(得分:1)

代理nodejs

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/xxx.crt'),    
    ca: [
        fs.readFileSync('/var/www/node/certificados/gd_bundle-xx.crt')
    ],
    rejectUnauthorized: false,
    requestCert: true,
    agent: false,
    strictSSL: false
};


app.https(SSloptions).io();


app.all('*', function(req, res){
    proxy.web(req, res, {

        target: 'http://localhost:4443',
    });    
});



app.listen(14443);