2017-01-05 93 views
1

我在Heroku部署一個簡單的NodeJS服務器與SSL有效證書Heroku的連接關閉代碼= H13

var https = require('https'); 
var express = require('express'); 
var bodyParser = require('body-parser'); 
var fs = require('fs'); 

var app = express(); 
var cors = require('cors'); 

var credentials = { 
    key: fs.readFileSync('./cert/key.key'), 
    cert: fs.readFileSync('./cert/cert.crt'), 
    ca: fs.readFileSync('./cert/bundle.crt'), 
    requestCert: true, 
    rejectUnauthorized: false 
}; 

var server = https.createServer(credentials, app); 

var io = require('socket.io')(server); 

app.use(cors()); 
app.use(bodyParser.json({limit: '12mb'})); 
app.use(bodyParser.urlencoded({limit: '12mb', extended: true })); 

io.on('connection', function(socket){ 
    console.log(socket); 
    socket.on('authenticate', function(data){ 

     console.log(data); 
    }); 
}); 

var port = process.env.PORT || 8080; 

server.listen(port, function() { 
    console.log("server listen on", this.address()); 
}); 

server.on('clientError', function(err) { 
    console.log('ERROR', err); 
}); 

問題是,當我啓動應用程序我接收到該錯誤

ERROR { Error: socket hang up 
at TLSSocket.<anonymous> (_tls_wrap.js:820:25) 
at emitOne (events.js:101:20) 
at TLSSocket.emit (events.js:188:7) 
at Socket._handle.close (net.js:492:12) 
at Socket.g (events.js:286:16) 
at emitOne (events.js:96:13) 
at Socket.emit (events.js:188:7) 
at TCP._handle.close [as _onclose] (net.js:492:12) code: 'ECONNRESET' } 

當我試圖通過Chrome瀏覽器連接到我的服務器我在服務器端收到此錯誤

2017-01-05T15:03:43.465542+00:00 heroku[router]: at=error code=H13 desc="Connection closed without response" method=GET path="/socket.io/?EIO=3&transport=polling&t=LblA3JZ" host=www.myapp.com request_id=51982ce9-99e3-4677-acb4-a0f14eb88999 fwd="95.251.90.218" dyno=web.1 connect=1ms service=2ms status=503 bytes=0 
2017-01-05T15:03:43.460178+00:00 app[web.1]: ERROR Error: 140414443095936:error:1407609C:SSL routines:SSL23_GET_CLIENT_HELLO:http request:../deps/openssl/openssl/ssl/s23_srvr.c:394: 

這個錯誤在客戶端

XMLHttpRequest cannot load https://www.myapp.com/socket.io/?EIO=3&transport=polling&t=LblDK25. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://192.168.0.8:8100' is therefore not allowed access. The response had HTTP status code 503. 

在第一時刻,我認爲這是socket.io但問題也仍然存在與正常休息的操作。 現在我認爲我是一個SSL問題。我與godaddy提供商創建了一個有效的證書,然後將其上傳到heroku併成功。事實上,如果我嘗試通過https連接連接到我的應用程序,證書是有效的。也許問題是當我嘗試上傳這些證書到我的nodejs app.someone可以幫助我嗎?在此先感謝

回答

2

您應該使用HTTP服務器,而不是HTTPS。 Heroku的負載平衡器發生SSL終止;他們會將您的應用發送純文本(非SSL)流量,因此您的應用應該創建一個非HTTPS服務器。

HTTPS + SSL on Heroku - Node + Express

+0

謝謝。這行得通!但我有些疑惑。我不使用heroku ssl端點(20美元的插件),但是從愛好計劃開始包含新的Heroku SSL服務。現在在我的服務器代碼中,我只使用一個http服務器,但在客戶端,我連接到'https:// '。我會理解連接是否安全 –

+0

您的應用程序和Heroku之間的連接是安全的,但Heroku會將未加密的數據從其負載平衡器發送到您的應用程序。也許你應該嘗試使用像express-sslify這樣的包來強制https傳入請求,但我不認爲這是最好的解決方案,因爲你的敏感數據在被重定向到https之前發送到http。我無法找到關於SSL如何在Heroku中工作的任何特定文檔。我想我們只需要信任Heroku:S也許你很冷,試着問Heroku支持更多的信息。 –

+0

好的,無論如何非常感謝。但是,這一點非常重要 –