전송층 보안/보안 소켓층(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 클라이언트 생성은 소켓 클라이언트 생성 과정과 거의 정확히 일치하며 차이점은 클라이언트 보안을 위한 추가적인 선택사항이 존재하는 것이다 그중 가장 중요한 선택 사상은 key
와 cert
, 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')
};
key
와 cert
, 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.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);