Node.js & MongoDB

TLS 서버와 TLS 클라이언트를 구현

전송층 보안/보안 소켓층(TLS/SSL)은 인터넷에서 안전하게 통신할 수 있게 고안된 암호화 프로토콜이다. TLS는 두가지 방식으로 보안을 유지한다. 첫번째로, 장기간 사용하는 공개 키와 개인 키를 사용해 송/수신 데이터 암호화를 위해 단기간 사용하는 세션 키를 교환한다.

TLS를 사용하기 전에 클라이언트와 서버 둘 다에서 개인키와 공개 인증서를 생성해야 한다. 가장 간단한 방법 중 하나는 플랫폼에 맞는 OpenSSL 라이브러리를 사용하는 것이다.

개인 키를 생성하려면 다음 OpenSSL 명령을 사용한다.

openssl genrsa -out server.pem 2048

다음 명령을 사용해 인증 서명된 요청 파일을 생성한다.

openssl req -new -key server.pem -out server.csr

특정 목적이나 테스트를 위해 자신이 서명한 인증서를 생성하려면 다음 명령을 사용한다.

openssl x509 -req -days 365 -in server.csr -signkey server.pem -out server.crt

TLS 소켓 클라이언트 생성

TLS 클라이언트 생성은 소켓 클라이언트 생성 과정과 거의 정확히 일치하며 차이점은 클라이언트 보안을 위한 추가적인 선택사항이 존재하는 것이다 그중 가장 중요한 선택 사상은 keycert, ca

key 선택 사항은 SSL의 개인 키를 지정한다. cert 값은 사용할 x509 공개 키를 지정한다. 자기가 서명한 인증서를 사용하려면 서버 인증서에 있는 ca 속성을 확인해야 한다.

var options = {
    key: fs.readFileSync('test/keys/client.pem'),
    cert: fs.readFileSync('test/keys/client.crt'),
    ca: fs.readFileSync('test/keys/server.crt')
};

keycert, ca 설정을 한 후 `tls.connect(options, [responseCallback])를 호출할 수 있다.

var options = {
    hostname: 'encrypted.mysite.com',
    port: 8108,
    path: '/',
    method: 'GET',
    key: fs.readFileSync('test/keys/client.pem'),
    cert: fs.readFileSync('test/keys/client.crt'),
    ca: fs.readFileSync('test/keys/server.crt')
};
var req = tls.connect(options, function(res){
    ...
});

TLS 소켓 서버 생성

TLS 소켓 서버 생성은 소켓 서버 생성과 정확히 일치한다. 유일한 차이점은 tls.createServer()에 반드시 전달해야 하는 추가 선택사항이 있다.

다음은 TLS 소켓 서버를 생성하는 예제다.

var options = {
    key: fs.readFileSync('test/keys/server.pem'),
    cert: fs.readFileSync('test/keys/server.crt'),
    ca: fs.readFileSync('test/keys/client.crt')
};
tls.createServer(options, function(client){
    client.write("Hello Secure World\r\n");
    client.end();
}).listen(8108);