2017년 1월 17일 화요일

[nodejs] webSocket ssl 적용.

사실상 소스코드는 복잡하지가 않다.


//의존모듈들 없는것을 설치

var https = require('https');
var fs   = require('fs');
var WebSocketServer = require('websocket').server;

//ca, key, cert 세가지 인자가 필요한데. 각파일의 자세한 기능은 솔직히 잘모르겟음.

var https_options = {
 ca: fs.readFileSync("/디렉토리/xxxx.pem 인증서정보 여겨짐"),
 key: fs.readFileSync("/디렉토리/xxxx.key 공개키정보로 여겨짐"),
 cert: fs.readFileSync("/디렉토리/xxxx.crt" 도메인정보 로 여겨짐)
};

//위에서 생성한 옵션을 넘겨서 https 서버를 생성하한다.
var httpsServer = https.createServer( https_options, function(request, response) {
    console.log((new Date()) + ' Received request for ' + request.url);
    response.writeHead(404);
    response.end();
});

//포트설정
httpsServer.listen(8887);

//ws 모듈이 내부적으로 없을경우 설치
var WebSocketServer = require('ws').Server;

//웹소켓 서버 생성
var wss = new WebSocketServer({
    server: httpsServer,
    // You should not use autoAcceptConnections for production
    // applications, as it defeats all standard cross-origin protection
    // facilities built into the protocol and the browser.  You should
    // *always* verify the connection's origin and decide whether or not
    // to accept it.
    autoAcceptConnections: false
});

function originIsAllowed(origin) {
  // put logic here to detect whether the specified origin is allowed.
  return true;
}



wss.on('connection', function connection(ws) {

        //.수신처리 
ws.on('message', function incoming(message) {
console.log('received: %s', message);
});
        // 발신
        ws.send('something');
});

일반 http 프로토콜 기반 웹소켓 서버를 생성하는것과 그렇게 큰차이는 없다. 



그치만 ssl에 대한 기본 적인 개념이 없다면 아마 막히는 부분이 많을 것이다.

ssl 통신.

클라이언트 측에서 https://aaa.com 요청을 보내면

1. aaa.com 도메인에 연결된 웹서버에서 인증서 정보화 공개키 정보를 담아서 클라이언트에게 전달한다.

2. 전달받은 클라이언트는 브라우저 내부적으로 인증기관정보 및 도메인 정보를 가지고 신뢰할수 있는 도메인 유무를 확인후 랜덤으로 생성 한 대칭키를 클라이언트에게 전달한다.

3. 클라이언트는 전달받은 대칭키로 데이터및 url 을 암호화 하고 대칭키를 처음에 서버로부터 받은 공개키로 또 암호화를해서 서버로 데이터를 전송한다.

4. 서버는 받은 대칭키를 개인키로 복호화하고 복호화된 대칭키로 데이터를 다시 복호화 한다.

5. 서버에서 데이터 전송시 데이터를 개인키로 암호화후 전송한고 클라이언트는 공개키로 복호화한다.


예를들면 aaa.com  에 적용된 ssl 인증서 정보로 wss://아이피:포트 웹소켓서버에 ssl을 동일 하게 적용해도 인증업체에  도메인 등록이 되어있지 않으면 통신이 불가능 하다. 따라서 인증업체에 도메인 추가를 한후 다시 인증서를 받아서 처리하거나(그다지 추천하는 방식은아님) ssl 터널링 기술을 이용해야한다. 










     

댓글 없음:

댓글 쓰기

[lunux]리눅스 폴더별 용량 확인

리눅스 폴더별 용량 확인 조회 하고자 하는 디렉토리 리스트가있는 경로로 이동후 du -h --max-depth=1