2016-07-11 11 views
1

Ich versuche ein Paket von einem Server zu einem anderen zu senden, aber ich muss sicher sein, dass der Absender der "echte" ist und das Paket nicht abgefangen werden kann. Wie kann ich das mit SSL mit NodeJS oder auf andere Weise tun?Verwenden von SSL über TCP zum Herstellen einer sicheren Verbindung zwischen zwei Servern mit NodeJS

Dies ist, was ich getan habe:

Code Server:

server = tls.createServer(function(c) { 
console.log('server connected', 

c.authorized ? 'authorized' : 'unauthorized'); 
}); 

Client-Code:

var tls = require('tls'); 
var fs = require('fs'); 

var options = { 
key : fs.readFileSync('server.key'), 
cert : fs.readFileSync('server.crt') 
}; 

var client = tls.connect(9838, options, function() { 

console.log(client.authorized ? 'Authorized' : 'Not authorized'); 

}); 

und diese Fehler aus:

Error: 101057795:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv handshake failure:openssl\ssl\s23_clnt.c:769: 
+0

Ja, Sie können dies mit SSL, ordnungsgemäß implementiert, mit dem ich die Peer-Identität nach dem Handshake und keine Fudges überprüfen. – EJP

Antwort

1

Um sicherzustellen, dass der Absender (der Kunde) ist die "echte", Sie könnten versuchen, TLS Client Auth (oder gegenseitige Authentifizierung) zu verwenden. Dies bedeutet, dass Sie ein Clientzertifikat (und einen Schlüssel), ein Serverzertifikat (und einen Schlüssel), das Zertifizierungsstellenzertifikat, das das Serverzertifikat ausgestellt/signiert hat, und das Zertifizierungsstellenzertifikat, das das Clientzertifikat ausgestellt/signiert hat, benötigen.

Zuerst muss Ihr TLS-Server sein Zertifikat für alle verbundenen TLS-Clients bereitstellen. Dies bedeutet, dass Sie configure its certificate and key benötigen. Sie wollen auch der TLS-Server anzufordern, dass der Kunde sein Zertifikat an den Server gesendet werden, als Teil des Handshake:

var tlsOptions = { 
    cert: fs.readFileSync('server-cert.pem'), 
    key: fs.readFileSync('server-key.pem'), 
    ca: [ fs.readFileSync('client-ca-cert.pem'), 
    requestCert: true, 
    rejectUnauthorized: true 
}; 

var server = tls.createServer(tlsOptions, function() { 

Dann für die Kunden, Sie configure it with its certificate and key und das CA-Zertifikat, das ausgegeben/signed das Server-Zertifikat (so dass der Kunde überprüfen kann, dass der Empfänger die „echten“ ist ein):

var tlsOptions = { 
    host: 'server.example.com', 
    port: 9838, 
    cert: fs.readFileSync('client-cert.pem'), 
    key: fs.readFileSync('client-key.pem'), 
    ca: [ fs.readFileSync('server-ca-cert.pem') 
}; 

var client = tls.connect(tlsOptions, function() { 

hoffte, das hilft!

+0

Wie sende ich JSON über TLS, wenn dies funktioniert? –

+0

@kritianzivkovic zum Senden/Empfangen von JSON über diese Sockets, könnten Sie etwas wie ['node-json-socket'] (https://github.com/sebastianseilund/node-json-socket) verwenden, das den TCP-Layer behandelt Puffern/Parsen von Nutzdaten. Die Tatsache, dass Ihre Sockets mit 'tls', nicht mit' net' erzeugt werden, sollte für 'node-json-socket' keine Rolle spielen. – Castaglia