웹어플리케이션보안 인증서 활용 2017. 9. 중부대학교 정보보호학과 이병천 교수.

Slides:



Advertisements
Similar presentations
1. 브라우저에서 로 관리창으로 접속해서, 서버 인증서를 설치 할 서버를 선택하고 Manage 버튼을 클릭합니다. 2. Security 탭을 선택한 후, 인증서 Trust.
Advertisements

을지대학교 무선 네트워크 사용 방법 2010 년 06 월 01 일. 을지대학교 무선 네트워크 사용 방법 1. PC 무선랜 카드 활성화 및 체크 1 단계 : 시작 -> 설정 -> 네트워크 설정 2 단계 : 무선 네트워크 설정 선택 -> 마우스 버튼 오른쪽 클릭 -> 사용.
임직원 APP 설치 가이드 경영전략처 정보기획 TF 팀. 임직원 App- 운영체제 구분  안드로이드 갤럭시, 갤럭시노트, 갤럭시 S4 [ 삼성전자 ] 옵티머스 [LG 전자 ] 베가 [ 팬텍 모토로이 [ 모토롤라 ]  ios 아이폰 [ 애플.
HTTPS Packet Capture Tutorial

목차 Contents 무선인터넷용 비밀번호 설정방법 Windows 7 Windows 8 Windows XP MAC OS.
기초C언어 제1주 실습 강의 소개, C언어 개요, Cygwin/Eclipse 사용 컴퓨터시뮬레이션학과 2016년 봄학기
웹 어플리케이션 보안 2016년 2학기 12. Cryptography.
MEAN Stack Front to Back (MEANAuthApp)
코크파트너 설치 가이드 Window 7.
4강. Servlet 맛보기 Servlet 문서 작성 하기 web.xml에 서블릿 맵핑 어노테이션을 이용한 서블릿 맵핑
5강. Servlet 본격적으로 살펴보기-I 프로젝트 만들기 doGet() doPost()
ERP 전용 브라우저 설치 매뉴얼 (Windows 7)
HeartBleed.
PHP입문 Izayoi 김조흔.
암호학 응용 Applied cryptography
9. Deploying mean applications
나민영 서경대학교 컴퓨터공학과 CGVR Lab 같이만들어보자 5주차 OpenCV 설정 및 기초.
SSL (Secure Sockets Layers Protocol)
4-1장. MySQL 제13장.
1. C++ 시작하기.
소프트웨어 분석과 설계 Struts2 & JBOSS 설치하기
01. DHCP의 개념 조직의 네트워크에 연결되어 있는 워크스테이션의 TCP/IP 설정을 자동화하기 위한 표준 프로토콜
웹어플리케이션보안 forge – 자바스크립트 암호 라이브러리
제 01 장 인터넷 프로그래밍 개요 학기 인터넷비즈니스과 강 환수 교수.
26강. 포워딩(Forwarding) RequestDispatcher 클래스 HttpServletResponse 클래스
2장 JSP 개발 환경 설정 이장에서 배울 내용 : JSP 페이지를 작성하기 위한 개발환경을 설정하고, 웹 어플리케이션 개발을 위해 반드시 이해하여야 할 웹 어플리케이션 폴더 구조에 대해 학습한다. 또한 요청된 JSP 페이지가 어떠한 처리과정을 거쳐 응답이 이루어지는가에.
웹 어플리케이션 보안 2016년 2학기 3. Mongo db.
3강. JSP 맛보기 JSP 문서 작성 하기 JSP 아키텍처 Lecturer Kim Myoung-Ho Nickname 블스
웹 어플리케이션 보안 2016년 2학기 5. Node Authentication.
웹 어플리케이션 보안 2016년 2학기 10. Workflow tools.
인터넷응용프로그래밍 JavaScript(Intro).
암호학 응용 Applied cryptography
웹어플리케이션보안 암호프로그래밍, crypto-js
IPython Notebook + Spark + TensorFlow on MacOS
영상처리 실습 인공지능연구실.
명지대학교 통합모바일앱 E-Book 이용안내
MEAN Stack Front to Back (MEANAuthApp)
HTTP 프로토콜의 요청과 응답 동작을 이해한다. 서블릿 및 JSP 를 알아보고 역할을 이해한다.
ERP 전용 브라우저 설치 매뉴얼 (Windows 7)
MEAN Stack Front to Back (MEANAuthApp)
Nessus 4 설치 정보보호응용 조용준.
8장 쿠키와 세션 한빛미디어(주).
ASP.NET AJAX / AJAX Control Toolkit 응용 2008 컴퓨터공학실험( I )
웹디자인
CGI란 무엇인가? CGI(Common Gateway Interface)의 정의
12장 쿠키와 세션 이장에서 배울 내용 : 쿠키와 세션은 웹 페이지 간에 정보를 유지할 때 사용된다. 쿠키와 세션은 사용되는 형태가 비슷하나, 쿠키는 웹 브라우저(클라이언트) 쪽에 저장되고, 세션은 웹 서버 쪽에 저장된다. 이 번장에서는 이들에 대해 학습한다.
01. DHCP의 개념 조직의 네트워크에 연결되어 있는 워크스테이션의 TCP/IP 설정을 자동화하기 위한 표준 프로토콜
STS 에서 웹 서버 설치 방법.
암호학 응용 Applied cryptography
웹 어플리케이션 보안 2016년 2학기 11. Enhancing Security.
WZC 무선 연결 방법 (Windows 7 Ver.).
1. 신규 연세메일(Gmail)에 로그인 합니다. ( yonsei. ac. kr )
암호학 응용 Applied cryptography
3장 JSP프로그래밍의 개요 이장에서 배울 내용 : JSP페이지의 기본적인 개요설명과 JSP페이지의 처리과정 그리고 웹 어플리케이션의 구조에 대해서 학습한다.
01. 분산 파일 시스템의 개요 네트워크에 분산된 파일을 사용자가 쉽게 접근하고 관리할 수 있게 해준다.
JSP Programming with a Workbook
기초C언어 제2주 실습 프로그래밍의 개념, 프로그램 작성 과정 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원
시스템 인터페이스 Lab1 X-window 및 명령어 사용.
무선랜 사용자 설명서 (Windows Vista 사용자).
웹어플리케이션보안 난수화 토큰인증 중부대학교 정보보호학과 이병천 교수.
웹에서의 상태 - 변수 발표자 : 지왕태.
(c) Byoungcheon Lee, Joongbu Univ.
채팅 및 파일전송 프로그램 권 경 곤 김 창 년.
접근제어 솔루션 계정등록 및 클라이언트 설치.
숙제 작성 및 제출 과정 김진하 2008/03/14.
Exporting User Certificate from Internet Explorer
6 객체.
JAVA 프로그래밍 16장 JNLP.
20 XMLHttpRequest.
Presentation transcript:

웹어플리케이션보안 인증서 활용 2017. 9. 중부대학교 정보보호학과 이병천 교수

차례 1. 웹서버보안(https) 적용 2. 인증서 발급 3. 인증서를 이용한 간편 로그인 4. 서비스 빌드 웹서버 보안을 위한 https 보안프로토콜 적용 2. 인증서 발급 로그인된 사용자에게 서버가 사설인증서 발급 사용자는 로컬스토리지에 인증서 및 개인키 저장하여 활용 3. 인증서를 이용한 간편 로그인 패스워드를 입력하지 않고 개인키로 서명하여 로그인 요청 서버는 사용자의 인증서로 서명 검증 4. 서비스 빌드

1. 웹서버보안(https) 적용 SSL/TLS HTTPS란? 인증서를 활용한 전송계층 보안 프로토콜 HTTP over SSL/TLS

자바스크립트 암호 라이브러리 forge Forge TLS, PKI와 여러 도구들을 포함한 자바스크립트 암호 라이브러리 https://www.npmjs.com/package/node-forge

Forge 설치 서버측 패키지 클라이언트측 패키지 프로젝트 루트폴더로 이동 > npm install node-forge node_modules 폴더에 설치됨 서버측 프로그램에서 다음과 같이 불러서 사용 const forge = require('node-forge'); 클라이언트측 패키지 > cd angular-src Angular4 소스에서 다음과 같이 불러서 사용 import * as forge from 'node-forge';

서버의 자체서명인증서 생성 caCert.js 1. 프로젝트 루트폴더에 ca.Cert.js 생성 2. caCert.js 실행 var forge = require('node-forge'); var fs = require('fs'); var pki = forge.pki; // 1. CA 인증서 생성 // generate a keypair and create an X.509v3 certificate var caKeys = pki.rsa.generateKeyPair(2048); var caCert = pki.createCertificate(); // CA 개인키 파일 저장 console.log(pki.privateKeyToPem(caKeys.privateKey)); fs.writeFileSync("caPrivateKey.pem", pki.privateKeyToPem(caKeys.privateKey)); console.log('CA개인키 저장 - caPrivateKey.pem \n'); caCert.publicKey = caKeys.publicKey; caCert.serialNumber = '01'; caCert.validity.notBefore = new Date(); caCert.validity.notAfter = new Date(); caCert.validity.notAfter.setFullYear(caCert.validity.notBefore.getFullYear() + 1); var caAttrs = [{ //name: 'commonName', // CN shortName: 'CN', value: 'Byoungcheon Lee' }, { //name: 'countryName', // C shortName: 'C', value: 'KR' //name: 'stateOrProvinceName', // ST shortName: 'ST', value: 'Gyeonggi-do' //name: 'localityName', // L shortName: 'L', value: 'Goyang-si' //name: 'organizationName', // O shortName: 'O', value: 'Joongbu Univ.' //name: 'organizationalUnitName', shortName: 'OU', value: 'Dept. of Information Security' }]; caCert.setSubject(caAttrs); caCert.setIssuer(caAttrs); caCert.js caCert.setExtensions([{ name: 'basicConstraints', cA: true }, { name: 'keyUsage', keyCertSign: true, digitalSignature: true, nonRepudiation: true, keyEncipherment: true, dataEncipherment: true name: 'extKeyUsage', serverAuth: true, clientAuth: true, codeSigning: true, emailProtection: true, timeStamping: true name: 'nsCertType', client: true, server: true, email: true, objsign: true, sslCA: true, emailCA: true, objCA: true name: 'subjectAltName', altNames: [{ type: 6, // URI value: 'http://example.org/' type: 7, // IP ip: '127.0.0.1' }] name: 'subjectKeyIdentifier' }]); // self-sign certificate caCert.sign(caKeys.privateKey); console.log('CA 자체서명인증서 생성'); console.log(pki.certificateToPem(caCert)); var verified = caCert.verify(caCert); console.log('CA인증서 생성 후 검증: '+verified); console.log(); // CA 인증서 저장 fs.writeFileSync("caCert.pem", pki.certificateToPem(caCert)); console.log('CA인증서 저장 - caCert.pem'); 1. 프로젝트 루트폴더에 ca.Cert.js 생성 2. caCert.js 실행 > node caCert.js 3. 개인키와 인증서가 다음 파일로 저장됨 - 개인키: caPrivateKey.pem - 인증서: caCert.pem 위 두개의 파일이 프로젝트 루트폴더에 저장됨을 확인

서버측 App.js 수정 Http 서버 삭제 Https 서버 생성 - 개인키 파일 읽기 - 인증서 파일 읽기 const https = require('https'); const fs = require('fs'); 중략 /* http.createServer(app).listen(port, function(){ console.log('Http server started on port '+port);}); */ https.createServer({ key: fs.readFileSync('caPrivateKey.pem'), cert: fs.readFileSync('caCert.pem') }, app).listen(port, function(){ console.log('Https server started on port '+port); }); Http 서버 삭제 Https 서버 생성 - 개인키 파일 읽기 - 인증서 파일 읽기

클라이언트측 auth.service.ts 수정 보안웹서버 접속을 위해 Http를 https로 수정 서비스 빌드 > ng build prepEndpoint(ep){ //return 'https://isweb.joongbu.ac.kr:3000/'+ep; // Server return 'https://localhost:3000/'+ep; // local }

브라우저로 https 접속

ng serve 상태에서의 접속 http://localhost:4200 으로 접속

2. 인증서 발급 로그인된 사용자가 인증서 발급 요청 서버는 사용자 확인하고 사설인증서 발급 키쌍 생성 개인키는 로컬스토리지에 저장 - privateKey.pem 공개키를 서버로 전송하고 인증서 발급 요청 서버는 사용자 확인하고 사설인증서 발급 발급한 인증서 전송 – cert.pem 서버 인증서도 함께 전송 – caCert.pem 클라이언트는 인증서를 로컬스토리지에 저장

Cert 컴포넌트 생성 인증서 발급 페이지를 위한 cert 컴포넌트 생성 App.module.ts에 등록 확인 Components 폴더로 이동 > cd angular-src/src/app/components > ng g component cert import { CertComponent } from './components/cert/cert.component'; 중략 const appRoutes: Routes = [ {path:'cert', component: CertComponent, canActivate:[AuthGuard]} @NgModule({ declarations: [ CertComponent

메뉴에 등록 Navbar.component.html 수정 인증서발급 인증서삭제

인증서 발급 UI 작성 Cert.component.html 각 필드들에 대한 사용자 입력 ngModel 을 이용한 2-way binding 인증서 발급 요청시 onCertRequest() 함수 실행

인증서 발급 Cert.component.ts 사용자 입력값을 JSON 객체로 변환 forge 객체 생성 certRequest 함수 호출 서버의 응답을 처리 컴포넌트에서 사용되는 사용자 입력 변수 선언 인증서를 저장 사용되는 서비스 선언

인증서 발급 Auth.service.ts 수정 키쌍 생성 Pem 형식으로 변환 로컬스토리지에 저장된 user 객체의 username을 읽어옴 - 인증서 발급 요청의 common값과 같아야만 인증서 발급 신청 진행 로컬스토리지에 개인키를 저장 Auth.service.ts 수정 사용자 입력 정보에 공개키 정보를 추가하여 req 생성 users/cert에 post 형식으로 req를 전송하고 인증서 발급 요청 - 서버의 응답을 받아옴 서버가 보내온 인증서를 로컬스토리지에 저장 - cert: 사용자 인증서 - caCert: 서버 인증서

서버측 routes/users.js 수정 routes/users.js fs 객체 생성: 파일에서 읽어오기 forge 객체 생성: node-forge 이용 서버의 인증서와 개인키를 파일에서 PEM 형식으로 읽어옴 인증서와 개인키 객체 생성

서버측 routes/users.js 수정 인증서 객체 cert 생성 공개키 정보 설정 일련번호, 유효기간 설정 사용자 정보 입력하여 userAttrs 객체 생성 사용자 정보 설정

서버측 routes/users.js 수정 발급자 정보 입력 - 서버인증서 caCert의 정보들을 읽어와서 설정 발급자 정보 설정

서버측 routes/users.js 수정 서버 개인키로 서명하여 인증서 생성 사용자 인증서, 서버인증서를 cert.setExtensions([{ name: 'basicConstraints', cA: true }, { name: 'keyUsage', keyCertSign: true, digitalSignature: true, nonRepudiation: true, keyEncipherment: true, dataEncipherment: true name: 'extKeyUsage', serverAuth: true, clientAuth: true, codeSigning: true, emailProtection: true, timeStamping: true name: 'nsCertType', client: true, server: true, email: true, objsign: true, sslCA: true, emailCA: true, objCA: true name: 'subjectAltName', altNames: [{ type: 6, // URI value: 'http://example.org/' type: 7, // IP ip: '127.0.0.1' }] name: 'subjectKeyIdentifier' }]); 서버 개인키로 서명하여 인증서 생성 사용자 인증서, 서버인증서를 JSON 형식으로 리턴 확장정보 설정

클라이언트에서 인증서 저장 cert.component.ts routes/users.js 인증서를 저장하고 dashboard로 리다이렉트 auth.service.ts

Dashboard에서 인증서 정보 보여주기 Dashboard.component.html에 인증서 관련 UI 작성 dashboard.component.html 사용자 인증서 서버 인증서 사용자 인증서 유효성 검증

Dashboard에서 인증서 정보 보여주기 forge 객체 생성 인증서 관련 변수 생성 - certPem: 사용자 인증서 - caCertPem: 서버 인증서 - verify: 인증서 유효성 검증 로컬스토리지에서 인증서 정보 읽어오기 인증서 유효성 검증 this.verify = caCert.verify(cert);

Dashboard에서 인증서 정보 보여주기 사용자 인증서 서버 인증서 사용자 인증서 유효성 검증

3. 인증서를 이용한 간편 로그인 패스워드 입력 필요 없음 전자서명 생성하여 서버에 제시

로그인 폼 작성 Login.component.html 왼쪽 ID/Pass 로그인 오른쪽 전자서명 간편 로그인 onLoginSubmit() 함수 실행 username, password 변수 이용 왼쪽 ID/Pass 로그인 오른쪽 전자서명 간편 로그인 onSigLoginSubmit() 함수 실행 username1 변수 이용

로그인 논리 수정 username1 변수 추가 Login.component.ts authenticateSigUser 함수 추가

Auth.service.ts 수정 로컬스토리지에서 개인키, 인증서를 Pem 형식으로 읽어옴 개인키 객체 생성 username, currentTime 정보를 개인키로 서명 서명값을 Hex로 인코딩 (화면표시, 전송) 인증요청을 위한 request 정보 생성 - Username - 현재시간 - 서명값 - 인증서 request를 post로 전송하고 인증 요청 서버측에 users/authenticateSig API 생성 필요

서버측 routes/users.js 수정 DB에서 username 정보 읽어옴 클라이언트의 요청정보를 읽어옴 인증서 객체 생성 전자서명값 생성 인증서에서 공개키 추출 인증서의 subject에서 common 값 추출 시간차이 계산 4가지 검증 - 전자서명이 유효? - 사용자 인증서가 유효? - 시간차이 확인 - 요청자가 인증서 소유자인지?

서버측 routes/users.js 수정 4가지 검증이 모두 유효하면 공개토큰 생성 비밀토큰 생성 success, ptoken, stoken, user 정보를 JSON으로 리턴

로그인 성공하면 Login.component.ts 로그인 성공하면 공개토큰, 비밀토큰, 사용자정보를 저장 dashboard로 리다이렉트

로그인 성공! Username 입력하고 로그인 버튼 클릭 전자서명으로 로그인 성공 공개토큰, 비밀토큰이 생성됨

인증서 삭제 기능 추가 인증서를 삭제할 수 있는 기능이 필요 메뉴에 인증서 삭제 버튼 추가 navbar.component.html <li *ngIf="authService.loggedIn()"><a (click)="onLogoutClick()" href="#">로그아웃</a></li> <li *ngIf="authService.loggedIn()"><a (click)="onDeleteCertClick()" href="#">인증서삭제</a></li> navbar.component.ts auth.service.ts 로컬스토리지에서 다음 정보 삭제 - 사용자 인증서 - 서버 인증서 - 사용자 개인키

4. 서비스 빌드 서비스 빌드 Express 웹서비스로 전체 서비스 접속 가능 공용서버에서 서비스 > cd angular-src > ng build 개발된 angular-src 폴더의 내용이 컴파일되어 public 폴더로 이 전됨 Express 웹서비스로 전체 서비스 접속 가능 공용서버에서 서비스 Auth.service.ts에서 지정된 prepEndpoint(ep)의 리턴주소를 수정 폴더 전체를 서버에 업로드 서버 실행

전체 서비스 완성 Https로 접속 로그인시 토큰 발급 인증서 발급