//의존모듈들 없는것을 설치
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 터널링 기술을 이용해야한다.
2. 전달받은 클라이언트는 브라우저 내부적으로 인증기관정보 및 도메인 정보를 가지고 신뢰할수 있는 도메인 유무를 확인후 랜덤으로 생성 한 대칭키를 클라이언트에게 전달한다.
3. 클라이언트는 전달받은 대칭키로 데이터및 url 을 암호화 하고 대칭키를 처음에 서버로부터 받은 공개키로 또 암호화를해서 서버로 데이터를 전송한다.
4. 서버는 받은 대칭키를 개인키로 복호화하고 복호화된 대칭키로 데이터를 다시 복호화 한다.
5. 서버에서 데이터 전송시 데이터를 개인키로 암호화후 전송한고 클라이언트는 공개키로 복호화한다.
예를들면 aaa.com 에 적용된 ssl 인증서 정보로 wss://아이피:포트 웹소켓서버에 ssl을 동일 하게 적용해도 인증업체에 도메인 등록이 되어있지 않으면 통신이 불가능 하다. 따라서 인증업체에 도메인 추가를 한후 다시 인증서를 받아서 처리하거나(그다지 추천하는 방식은아님) ssl 터널링 기술을 이용해야한다.
댓글 없음:
댓글 쓰기