Download presentation
Presentation is loading. Please wait.
1
자바 암호 프로그래밍 Java Cryptography Programming 2017. 3.
중부대학교 정보보호학과 이병천 교수
2
차례 1. 강의 개요 2. 암호와 정보보호 3. 자바프로그래밍 기초 4. 자바 네트워크 프로그래밍
5. JCA/JCE 암호 프로그래밍 6. 해쉬함수, MAC, 패스워드 기반 키생성 7. 대칭키 암호, 파일 암호화/복호화 8. 공개키 암호 9. 전자서명 10. 인증서와 공개키기반구조(PKI) 11. 암호 알고리즘/프로토콜 구현
3
10. 인증서와 공개키기반구조
4
1. 공개키인증서 On the Internet, nobody knows you’re a dog
© The New Yorker Collection 1993 Peter Steiner from cartoonlink.com. All rights reserved.
5
+ = 공개키인증서 공개키인증서(Certificate)란? 개인이 사용하는 공개키를 인증기관이 인증해주는 전자문서
개인정보와 공개키가 포함된 전자문서를 인증기관이 전자서명한 문서 인증기관을 신뢰하는 범위 내에서 사용자 인증을 위해 널리 호환 되어 사용 가능 사용자 A의 공개키 사용자 A의 공개키에 대한 인증기관(CA)의 전자서명 사용자 A의 인증서(사용자 A의 공개키와 이것을 증명코자 하는 신뢰(인증)기관의 전자서명 포함) + = 당 공개키는 사용자 A의 공개키 임을 증명함
6
공개키인증서 보기 일반 자세히 인증경로
7
공개키인증서 공개키인증서 표준 인증서의 구성
X.509, The Directory: Authentication Framework, 인증서의 구성
8
공개키인증서의 확장 필드 발급자키식별자(Authority Key Identifier): 이 인증서를 확인할 때 사용할 발급자의 공개키를 독특하게 식별하는 식별자 자체 서명 인증서를 제외한 모든 인증서의 필수 요소 주체키식별자(Subject Key Identifier): 이 인증서에 포함된 공개키 를 독특하게 식별하는 식별자 인증기관 인증서의 경우에는 필수 요소 키용도(Key Usage): 이 인증서에 바인딩되어 있는 공개키의 사용용 도를 한정하기 위해 사용 전자서명, 부인방지, 키 암호화, 데이터 암호화, 키 동의 등 인증기관의 경우 keyCertSign, cRLSign이 설정되어 있어야 함 CRL 분배점(CRL distribution point): 이 인증서의 폐지 여부를 확 인하기 위한 인증서 폐지 목록이 있는 위치 Basic-Constraints: 이 인증서가 인증기관의 인증서임을 나타내기 위해 사용됨
9
공개키인증서 인증서 (기본영역)
10
공개키인증서 인증서 (확장영역)
11
2. 공개키기반구조(PKI) 공개키기반구조(public key infrastructure, PKI) 인증서 표준
공개키 암호 방식을 바탕으로 한 인증서를 활용하는 소프트웨어, 하드웨어, 사용자, 정책 및 제도 등을 총칭하는 용어 공개키암호기술이 안전하게 사용될 수 있는 환경을 제공 인증서 표준 X.509, The Directory: Authentication Framework, 1993. 공개키기반구조 표준 PKIX: Internet X.509 Public Key Certificate Infrastructure.
12
인증기관 인증기관의 계층구조 정책승인기관(PAA, Policy approval authority)
정책인증기관(PCA, policy certification authority) 인증기관(CA, certification authority) 등록기관(RA, registration authority)
13
인증기관 인증기관의 업무 인증서 발급 인증서 관리 인증서 배포 인증서 사용 인증서 저장 인증서 취소
14
PKI 서비스 흐름도
15
3. 공인인증서 공인인증서 공인인증기관이 발행하는 인증서 널리 호환되어 이용 가능
16
공인인증서 공인인증기관
17
RA의 소속기관 지방청, 16개 시·도 내 시·군·구
공인인증체계 기관, 개인, 특별용도 정부인증관리센터 (정부전산정보관리소) 국가정보원, 국방부, 대검찰청, 대통령비서실, 병무청, 교육부. 행정자치부 정보통신부 외 10개 중앙행정기관, 개 시도 Root-CA 가입자 RA LRA CA Root CA 등록기관 (RA) 인증기관 (CA) 디렉 토리 디렉토리 원격등록기관 (LRA) RA의 소속기관 지방청, 16개 시·도 내 시·군·구 기업, 서버, 개인, 특별용도 전자서명인증관리센터 (한국정보보호진흥원) 한국정보인증, 한국증권전산, 금융결제원, 한국전산원, 한국전자인증, 무역정보통신 은행, 증권 기타 기업 및 공공기관 GPKI NPKI 최상위 인증기관
18
전자정부에서의 활용 교육행정정보서비스 (NEIS) 특허넷시스템 전자조달시스템 (G2B) 전자민원 (G4C) 행정 대민
지역교육청 전산실 담당자 RA 이중화 행정업무 중요 정보의 암호화, 전자서명 공인인증 공인인증(교육부용) RA 교육부 CA X 인증센터 구축 사설인증서, 공인인증서 공인인증서 운영인원 필요 RA 운영인원(X) 운용관리(10~20명) 사설 CA시스템 센터 운영 전자출원 적용 입찰업무 전자입찰서 (XML 기반) 전자결재 민원신청서 적용 사설인증, 전자관인 전자관인 , 공인인증 전자관인 특허청 조달청 행정자치부 인증 시스템 인원 운영 인증·보안 적용 인증서 사용
19
공인인증서 발급 절차
20
공인인증기관이 제공하는 서비스 기본 서비스 부가 서비스 인증서 발급 인증서 갱신 인증서 재발급 인증서 폐지 인증서 효력정지
인증서 효력회복 인증서 관리 부가 서비스 실시간 상태조회 서비스 시점확인 서비스
21
공인인증서 공인인증서의 저장 위치 Windows XP Windows 7 이후
C: > Program files > NPKI Windows 7 이후 C: > 사용자 > 사용중인 계정이름 > AppData > LocalLow > NPKI User 폴더 공개키: signCert.der 개인키: signPri.key 개인키는 패스워드 암호화 저장됨
22
공인인증서 정보 보기 서명 해시 알고리즘: sha256 공개키: RSA 2048 bits 키 사용: 전자서명, 부인방지
인증서 정책:
23
실시간 상태조회 서비스(OCSP) OCSP (Online Certificate Status Protocol)
사용자의 실수 또는 고의로 폐지된 공인인증서가 사용되는 것을 방지하기 위해 공인인증서의 유효성을 실시간으로 검증하여 결 과를 제공하는 서비스
24
시점확인 서비스(TSA) TSA (Time Stamping Authority)
전자문서 생성시점의 법률적 증명과 위·변조 방지를 위해 특정 시점에 존재하였으며, 그 이후 변경되지 않았음을 증명해 주는 서비스
25
4. 인증서 폐기 생성한 전자문서를 폐기할 수 있는가? 발급한 인증서를 무효화시킬 수 있는가? 전자문서는 여러 곳에 복사 가능
사생활, 명예훼손 잊혀질 권리 발급한 인증서를 무효화시킬 수 있는가?
26
WANTED! 공개수배전단
27
인증서 폐기 목록 Certificate Revocation List (CRL) RFC 5280으로 표준화
해지되었거나 더 이상 유효하지 않은 인증서의 목록을 인증기관 이 서명한 문서 CRL에 포함된 인증서는 유효하지 않으므로 신뢰해서는 안됨 RFC 5280으로 표준화 Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile
28
인증서 폐기 목록 인증서취소목록(CRL)의 기본 영역 서명 알고리즘 : CRL에 서명한 서명 알고리즘 ID 및 관련 데이터
발급자 : 발급자 CA의 X.509 이름 최근 수정 일자 : 최근 수정 일자(UTC Time) 차후 수정 일자 : 다음 수정 일자(UTC Time) 취소 인증서 목록 : 취소된 인증서 목록들 CRL확장자 : CRL 확장자 유무 및 내용 발급자 서명문 : 발급자의 서명문 CRL의 확장 영역 : 기본 확장자 + 개체 확장자 기본 확장자 CA 키 고유 번호 : CRL에 서명한 키 번호 발급자 대체 이름 : CRL 발급자의 대체 이름( , IP 주소 등) CRL 발급번호 : CRL에 대한 일련 번호 발급 분배점 : CRL 분배점 이름 델타 CRL지시자 : 최근에 취소된 목록만을 저장한 델타 CRL 지시자 개체 확장자 취소 이유 부호 : 인증서가 취소된 이유 명령 부호 : 해당 인증서를 만났을 경우 취해져야 할 명령 무효화 날짜 : 해당 인증서가 무효화된 날짜 인증서 발급자 : 간접 CRL에서의 해당 인증서 발급자
29
인증서 폐기 목록 인증서 폐기 이유 명시 (CRL reason code) unspecified (0)
keyCompromise (1) CACompromise (2) affiliationChanged (3) superseded (4) cessationOfOperation (5) certificateHold (6) removeFromCRL (8) privilegeWithdrawn (9) AACompromise (10)
30
5. 인코딩과 저장형식 Base64 인코딩 8비트 이진 데이터(예를 들어 실행 파일이나, ZIP 파일 등)를 문 자 코드에 영향을 받지 않는 공통 ASCII 영역의 문자들로만 이루 어진 일련의 문자열로 바꾸는 인코딩 방식 64 = 26은 화면에 표시되는 ASCII 문자들을 써서 표현할 수 있는 가장 큰 진법 알파벳 대소문자(A-Z, a-z)와 숫자(0-9) 그리고 두 개의 기호(“+”, “/”)로 이루어져 있으며, 패딩 문자로 “=”를 사용 바이너리 데이터 3바이트를 4개의 Base64 문자로 변환 입력되는 데이터가 3바이트로 나누어 떨어지지 않는 경우에는 “=”를 패딩 문자로 사용 저장, 전송, 화면 표시 등에 편리. 그러나 데이터가 확대되는 단점
31
ASCII 와 Base64 ASCII (8비트) Base64 (6비트)
32
Base64 인코딩 ASCII 데이터 “Man”을 Base64 인코딩하면 “TWFu”로 변 환
33
ASN.1 표현법 Abstract Syntax Notation One (ASN.1) 데이터 구조를 나타내기 위한 표현언어
이기종 시스템간의 데이터 전송을 위한 표준 방식 적용 사례 PKCS group of cryptography standards X.400 electronic mail X.500 Lightweight Directory Access Protocol (LDAP) H.323 (VoIP) Kerberos BACnet simple network management protocol (SNMP) UMTS, LTE, and WiMAX 2
34
X.509 인증서의 ASN.1 표현 X.509 인증서 아래 문서를 인증기관이 서명 인증서 양식
35
인증서 인코딩 DER (Distinguished Encoding Rules)
바이너리 인코딩 (화면 표시가 어려움) 인증서 저장에 사용 CER 또는 CRT 확장자로 사용되기도 함 PEM (Privacy-enhanced Electronic Mail) Base64 인코딩 (화면 출력 가능) X.509v3 에서 사용되는 여러 파일 양식들을 저장하는데 사용 인증서, 개인키, 인증서 발급 요청 양식 등 “—– BEGIN …” 으로 시작됨 openssl x509 -in certificate.der -inform der -text -noout openssl x509 -in cert.pem -text -noout openssl x509 -in cert.cer -text -noout openssl x509 -in cert.crt -text -noout
36
인증서 관련 확장자 .DER .CRT .CER .KEY 인증서 저장에 사용되는 확장자 인증서 저장에 사용 (Unix 방식)
The CRT extension is used for certificates. The certificates may be encoded as binary DER or as ASCII PEM. The CER and CRT extensions are nearly synonymous. .CER 인증서 저장에 사용 (마이크로소프트 방식) alternate form of .crt (Microsoft Convention) .KEY PKCS#8 형식으로 공개키, 개인키 저장에 사용 The keys may be encoded as binary DER or as ASCII PEM
37
6. OpenSSL Secure Sockets Layer (SSL) 이란? OpenSSL이란? 넷스케이프 사에서 최초 개발
서버와 클라이언트 사이의 통신 보안을 제공하는 프로토콜 IETF 에서 TLS (Transport Layer Security) 라는 이름으로 표준화 OpenSSL이란? SSL/TLS 통신보안을 제공하는 오픈소스 툴킷 인증서 생성 및 이용 기능 제공
38
OpenSSL 설치 리눅스 환경 윈도우 환경 Win64 OpenSSL v1.0.2k 다운로드 및 설치 환경변수에 설치 디렉토리 등록, C:\OpenSSL-Win64\bin openssl.cfg 파일을 C:\OpenSSL-Win64 폴더에 복사 참고
39
OpenSSL RSA 키 생성 OpensSSL> genrsa -des3 -out private.pem 2048
개인키 암호화 저장을 위한 패스워드 입력 *.pem 형식으로 개인키 저장 private.pem
40
OpenSSL RSA 공개키 생성 앞에서 생성한 개인키 파일에 공개키 정보도 포함되어 있음
개인키 파일로부터 공개키를 추출하여 파일로 저장 rsa -in private.pem -outform PEM -pubout -out public.pem public.pem
41
OpenSSL 자체서명인증서(Self-signed certificate) 생성 루트 인증기관은 상위에 인증기관이 없음
자신의 개인키로 자신의 공개키를 서명한 자체서명인증서를 생 성하여 사용 개인키 사용을 위한 접근암호 입력 필요 인증서 생성에 필요한 정보 입력 OpenSSL> req -new -x509 -days 365 -key private.pem -out ca.crt
42
OpenSSL 생성된 인증서 보기 ca.crt 파일 클릭
43
OpenSSL로 인증기관 운영하기 작업 순서
1. Demo CA 설정 (환경 설정) - 현재 디렉토리에 demoCA 디렉토리 생성 : mkdir demoCA - demoCA 디렉토리 안에 시리얼 파일 생성 : serial 이란 이름의 text 파일에 00 을 적는다. - index 파일 생성 : index.txt 란 이름으로 빈 파일을 만든다. 2. CA 인증서 생성 (자체서명인증서 생성) - CA 개인키 생성 : openssl genrsa -des3 -out ca.key 1024 - Self-Signed CA 인증서 생성 : openssl req -new -x509 -days 365 -key ca.key -out ca.crt 3. 하위 인증서 생성 (예: cris Web 서버용) - server 개인키 생성 : openssl genrsa -des3 -out server.key 1024 - server 인증서 발급을 위한 요청파일 생성 : openssl req -new -days 365 -key server.key -out server.csr - server 인증서 발급 : openssl ca -in server.csr -out server.crt -keyfile ca.key -cert ca.crt -outdir .
44
OpenSSL로 인증기관 운영하기 F:\workspace\openssl\CAtest>openssl ca -in server.csr -out server.crt -keyfile ca.key -cert ca.crt -outdir . Using configuration from C:\OpenSSL-Win64\bin\openssl.cfg Enter pass phrase for ca.key: Check that the request matches the signature Signature ok Certificate Details: Serial Number: 0 (0x0) Validity Not Before: Apr 29 02:29: GMT Not After : Apr 29 02:29: GMT Subject: countryName = kr stateOrProvinceName = Gyeonggi-do organizationName = Joongbu Univ. organizationalUnitName = Information Security commonName = cris Address = X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 9B:94:8B:22:FF:27:74:3A:50:91:19:77:B6:06:A5:77:19:E2:5C:DC X509v3 Authority Key Identifier: keyid:07:35:2C:60:76:4A:A0:D9:A9:97:59:47:8B:4E:3D:62:50:90:8F:A4 Certificate is to be certified until Apr 29 02:29: GMT (365 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
45
발급된 서버 인증서 Server.crt 생성된 인증서 Server.key 서버의 개인키 Server.csr 인증서 요청 문서
46
인증서 포맷 변경 Crt der 포맷 변경 인증서 내용 보기
openssl x509 -in ca.crt -out ca.der -outform DER openssl x509 -in ca.crt -text (PEM 포맷인 경우) openssl x509 -in ca.der -inform DER -text (DER 포맷인 경우)
47
SSL 인증서 활용 예제 인증서 생성 J2SE SDK 에 포함된 keytool을 이용
임의 폴더에서 실행 가능하도록 Path 환경변수에 자바의 bin 폴 더를 추가
48
SSL 인증서 활용 예제 인증서 생성 keytool -genkey -keystore mySrvKeystore -keyalg RSA F:\workspace\Test\bin>keytool -genkey -keystore mySrvKeystore -keyalg RSA 키 저장소 비밀번호 입력: 새 비밀번호 다시 입력: 이름과 성을 입력하십시오. [Unknown]: Byoungcheon Lee 조직 단위 이름을 입력하십시오. [Unknown]: Information Security 조직 이름을 입력하십시오. [Unknown]: Joongbu Univ. 구/군/시 이름을 입력하십시오? [Unknown]: Goyang-si 시/도 이름을 입력하십시오. [Unknown]: Gyeonggi-do 이 조직의 두 자리 국가 코드를 입력하십시오. [Unknown]: KR CN=Byoungcheon Lee, OU=Information Security, O=Joongbu Univ., L=Goyang-si, ST=Gyeonggi-do, C=KR이(가) 맞습니까? [아니오]: y <mykey>에 대한 키 비밀번호를 입력하십시오. (키 저장소 비밀번호와 동일한 경우 Enter 키를 누름): F:\workspace\Test\bin>
49
SSL 인증서 활용 예제 서버 : EchoServer.java 클라이언트 : EchoClient.java
import javax.net.ssl.SSLServerSocket; import javax.net.ssl.SSLServerSocketFactory; import javax.net.ssl.SSLSocket; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; public class EchoServer { public static void main(String[] arstring) { try { SSLServerSocketFactory sslserversocketfactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); SSLServerSocket sslserversocket = (SSLServerSocket) sslserversocketfactory.createServerSocket(9999); SSLSocket sslsocket = (SSLSocket) sslserversocket.accept(); InputStream inputstream = sslsocket.getInputStream(); InputStreamReader inputstreamreader = new InputStreamReader(inputstream); BufferedReader bufferedreader = new BufferedReader(inputstreamreader); String string = null; while ((string = bufferedreader.readLine()) != null) { System.out.println(string); System.out.flush(); } } catch (Exception exception) { exception.printStackTrace(); import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; import java.io.*; public class EchoClient { public static void main(String[] arstring) { try { SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("localhost", 9999); InputStream inputstream = System.in; InputStreamReader inputstreamreader = new InputStreamReader(inputstream); BufferedReader bufferedreader = new BufferedReader(inputstreamreader); OutputStream outputstream = sslsocket.getOutputStream(); OutputStreamWriter outputstreamwriter = new OutputStreamWriter(outputstream); BufferedWriter bufferedwriter = new BufferedWriter(outputstreamwriter); String string = null; while ((string = bufferedreader.readLine()) != null) { bufferedwriter.write(string + '\n'); bufferedwriter.flush(); } } catch (Exception exception) { exception.printStackTrace();
50
SSL 인증서 활용 예제 서버 실행 클라이언트 실행 디버깅 서버, 클라이언트 실행시 다음 옵션 추가
java -Djavax.net.ssl.keyStore=mySrvKeystore -Djavax.net.ssl.keyStorePassword= EchoServer java -Djavax.net.ssl.trustStore=mySrvKeystore -Djavax.net.ssl.trustStorePassword= EchoClient -Djava.protocol.handler.pkgs=com.sun.net.ssl.internal. -Djavax.net.debug=ssl
51
7. 인증서 프로그래밍 JCA/JCE는 인증서 관련 제공하는 기능이 부족 BouncyCastle 패키지 이용 가능
암호/보안 관련 다양한 기능 제공 X.509 인증서 관련 엔진 org.bouncycastle.x509.X509V3CertificateGenerator 파일을 다운로드하여 프로젝트 폴더에 저장 Add External JARs로 등록하여 사용 Java 소스 내에서 프로바이더 추가 Security.addProvider(new BouncyCastleProvider());
52
인증서 저장 파일 포맷 DER (Distinguished Encoding Rules)
대부분의 브라우저에서 기본 형식이며 ASN.1 DER 형식에 따라 바이너리 형태로 저장됨. ASN.1으로 정의한 인증서 데이터를 바이너리 스트림으로 변환한 것으로 TLV(Type, Length, Value) 형태의 구조를 가짐 파일 확장자: *.crt, *.cer, *.der 를 사용 PEM (Privacy Enhanced Mail) “-----BEGIN CERTIFICATE-----”와 “-----END CERTIFICATE-----” 사이에 Base64로 인코딩된 ASCII 영역의 문자들로만 저장 파일 확장자: *.pem, *.crt, *.cer, *.key -----BEGIN CERTIFICATE----- MIIDOjCCAqOgAwIBAgIQNtMvw8xQuEEQOm0RKtWXsjANBgkqhkiG9w0BAQQFADBM MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg MREbZZxocDgCDBvw0zg1cVxjlQWN5+sZ8TdqfipqTaIHsdlyGXIeeGvVgjdaXdIA 7rERx21tL4inO0pGk9FpRJvnmR4IAwcmNzG4Oi8tOpM7q5HPqVOCh4ADoZ1aPCDz ppyCZR9e2/8IYgVMyVo= -----END CERTIFICATE-----
53
인증서 저장 파일 포맷 PKCS#7 (Cryptographic Message Syntax Standard)
“-----BEGIN PKCS7----” 과 “-----END PKCS7----”사이에 Base64 인코딩된 데이터를 저장 서명 자료구조와 인증서를 저장 파일 확장자: *.p7b, *.p7c PKCS#12 (Personal Information Exchange Syntax Standard) 바이너리 형식으로 저장되며 pkcs#12 포맷의 파일은 인증서, 개 인키 내용을 파일 하나에 모두 담고 있음. 백업 또는 이동용으로 주로 사용됨. 파일 확장자: *.pfx , *.p12
54
공인인증서 읽어오기 기존의 발급된 인증서를 읽어오기 예제 공인인증서 이용시 다음 파일을 프로젝트 폴더에 복사
signCert.der 인증서 signPri.key 개인키 예제: CertViewExample.java
55
예제: CertViewExample.java
import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; public class CertViewExample { public static void main(String[] args) throws Exception { File certFile = new File("signCert.der"); CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); X509Certificate cert = null; InputStream input = new BufferedInputStream(new FileInputStream(certFile)); try { cert = (X509Certificate) certificateFactory.generateCertificate(input); } finally { try { input.close(); } catch(IOException ie) {} } System.out.println(cert); 자신의 공인인증서 signCert.der를 프로젝트 폴더에 복사 후 실행
56
공인인증서 검증하기 인증서를 검증하기 위해서는 인증기관의 인증서가 필요 인증기관의 인증서는 KISA 에서 다운로드
Kisa rootCA 인증서 Yessign 인증서 내 인증서
57
인증경로 내 인증서 yessignCA Class 2 KISA RootCA 4 signCert.der yessign.der
root-rsa-sha2.der 프로젝트 폴더에 3개 파일 저장
58
공인인증서 검증하기 예제: CertValidateExample.java
// 애플리케이션 실행 시 Bouncy Castle Provider를 추가한다. Security.addProvider(new BouncyCastleProvider()); // 인증서 읽어오기 CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); File certFile = new File("signCert.der"); X509Certificate cert = generateCertificate(certificateFactory, certFile); File yessginFile = new File("yessign.der"); X509Certificate yessign = generateCertificate(certificateFactory, yessginFile); File trustFile = new File("root-rsa-sha2.der"); X509Certificate trust = generateCertificate(certificateFactory, trustFile); // 인증서 검증을 위한 인증경로 생성 List<X509Certificate> certificates = new ArrayList<X509Certificate>(); certificates.add(cert); // 공인인증서 추가 certificates.add(yessign); // yessign 인증서 추가 CertPath certPath = certificateFactory.generateCertPath(certificates); TrustAnchor anchor = new TrustAnchor(trust, null); // 루트인증서를 TrustAnchor로 등록 PKIXParameters params = new PKIXParameters(Collections.singleton(anchor)); params.setRevocationEnabled(false); // 폐기 정보 비활성화, CRL 검증은 건너뜀 CertPathValidator cpv = CertPathValidator.getInstance("PKIX", "BC"); PKIXCertPathValidatorResult result; // 검증결과를 저장
59
공인인증서 검증하기 검증 결과
60
인증서 종합 예제 예제: CertificateTest.java 기능 인증서 발급 인증서취소목록 (CRL) 이용하기
루트 인증기관 인증서 중간 인증기관 인증서 사용자 Alice의 인증서 인증서취소목록 (CRL) 이용하기 인증서를 파일로 저장, 파일에서 읽어오기 개인키를 파일로 저장, 파일에서 읽어오기 RSA 암호화, 복호화 RSA 서명 생성, 서명 검증
61
인증기관 인증서 생성 X509V3CertificateGenerator certGen = new X509V3CertificateGenerator(); certGen.setSerialNumber(BigInteger.valueOf(System.currentTimeMillis())); certGen.setIssuerDN(new X500Principal("C=KR,CN=Root")); certGen.setSubjectDN(new X500Principal("C=KR,CN=Root")); GregorianCalendar currentDate = new GregorianCalendar(); GregorianCalendar expiredDate = new GregorianCalendar(currentDate.get(Calendar.YEAR)+1, currentDate.get(Calendar.MONTH), currentDate.get(Calendar.DAY_OF_MONTH)); certGen.setNotBefore(currentDate.getTime()); certGen.setNotAfter(expiredDate.getTime()); certGen.setPublicKey(pubKey); certGen.setSignatureAlgorithm("SHA1withRSAEncryption"); certGen.addExtension(X509Extensions.BasicConstraints, true, new BasicConstraints(0)); certGen.addExtension(X509Extensions.KeyUsage, true, new KeyUsage(KeyUsage.digitalSignature | KeyUsage.keyCertSign | KeyUsage.cRLSign)); X509Certificate rootCert = (X509Certificate)certGen.generate(signatureKey,"BC");
62
일반 사용자 인증서 생성 X509V3CertificateGenerator certGen = new X509V3CertificateGenerator(); … certGen.addExtension(X509Extensions.AuthorityKeyIdentifier, false, new AuthorityKeyIdentifierStructure(caCert)); certGen.addExtension(X509Extensions.SubjectKeyIdentifier, false, new SubjectKeyIdentifierStructure(pubKey)); certGen.addExtension(X509Extensions.KeyUsage, true, new KeyUsage(KeyUsage.digitalSignature | KeyUsage.keyEncipherment)); X509Certificate aliceCert = (X509Certificate)certGen.generate(signatureKey,"BC");
63
인증서 검증 인증서의 서명 확인 인증서의 유효기간 확인 인증서의 사용 용도 확인 인증서의 폐지 여부 확인
void verify(PublicKey key) 문제가 있으면 각종 예외 발생 인증서의 유효기간 확인 void checkValidity() 인증서의 사용 용도 확인 인증서의 폐지 여부 확인
64
인증서 저장 인증서 저장 저장된 인증서 불러오기 java.security.cert.CertificateFactory 엔진 이용
FileOutputStream fos = new FileOutputStream(new File("aliceCert.der")); fos.write(aliceCert.getEncoded()); fos.close(); CertificateFactory cf = CertificateFactory.getInstance("X.509"); FileInputStream fis = new FileInputStream(new File("aliceCert.der")); X509Certificate cert = (X509Certificate)cf.generateCertificate(fis); fis.close();
65
개인키 저장 java.security.KeyStore 엔진 사용 KeyStore는 패스워드를 이용하여 저장할 키를 보호함
개인키를 저장할 경우에는 인증경로를 제공해야 함 인증경로 배열은 계층구조 트리에서 아래부터 위쪽으로 만듬 개인키를 식별하기 위한 정보 Alias 정보 이용 “AlicePrivateKeyAlias” char[] code = {'s','e','c','r','e','t','c','o','d','e'}; KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); ks.load(null,null); X509Certificate[] chain = new X509Certificate[3]; chain[0] = aliceCert; chain[0] = interCert; chain[1] = rootCert; ks.setKeyEntry("AlicePrivateKeyAlias",alicePrivKey,code,chain); FileOutputStream fos = new FileOutputStream(new File("alicePriv.key")); ks.store(fos,code); fos.close();
66
인증서폐지목록 (CRL)
67
인증서폐지목록 (CRL) BouncyCastle
org.bouncycastle.x509.X509V2CRLGenerator 엔진 이용 X509V2CRLGenerator crlGen = new X509V2CRLGenerator(); crlGen.setIssuerDN(caCert.getSubjectX500Principal()); GregorianCalendar currentDate = new GregorianCalendar(); GregorianCalendar nextDate = new GregorianCalendar(currentDate.get(Calendar.YEAR)+1, (currentDate.get(Calendar.MONTH)+1)%12, currentDate.get(Calendar.DAY_OF_MONTH)); crlGen.setThisUpdate(currentDate.getTime()); crlGen.setNextUpdate(nextDate.getTime()); crlGen.setSignatureAlgorithm("SHA1withRSAEncryption"); crlGen.addCRLEntry(revokeCert.getSerialNumber(), currentDate.getTime(), CRLReason.superseded); X509CRL crl = crlGen.generate(signatureKey,"BC");
68
인증서폐지목록 (CRL) 인증서 폐지 사유
69
인증서 폐지 여부 확인 crl이 Bob의 인증서가 폐지될 경우에 이 정보를 유지하는 crl이라 하자. getRevokedCertificate() 메소드를 호출하여 이 값이 null이 면 해당 인증서는 폐지되지 않았다는 것을 의미한다. 폐지된 경우 getCertificateIssuer() 메소드를 통해 폐지된 인증서의 발급자 정보 를 획득할 수 있다. 이 때 이 값이 null이면 CRL 발급자가 인증서의 발급자라는 것을 나타낸다. X509Entry entry = crl.getRevokedCertificate(bobCert.getSerialNumber()); if(entry!=null){ System.out.printf("인증서번호: %d%n", entry.getSerialNumber()); if(entry.getCertificateIssuer()==null) System.out.printf("발급자: %s%n", crl.getIssuerX500Principal()); else System.out.printf("발급자: %s%n", entry.getCertificateIssuer()); }
70
인증서 폐지 목록의 저장 및 활용 CRL 저장 저장된 CRL 불러오기
FileOutputStream fos = new FileOutputStream(new File("normal.crl")); fos.write(crl.getEncoded()); fos.close(); CertificateFactory cf = CertificateFactory.getInstance("X.509"); FileInputStream fis = new FileInputStream(new File(“normal.crl")); X509CRL crl = (X509CRL)cf.generateCRL(fis); fis.close();
71
인증서 디렉토리 java.security.cert.CertStore를 이용하여 생성할 수 있음
List list = new ArrayList(); list.add(rootCert); list.add(interCert); list.add(aliceCert); list.add(bobCert); list.add(rootCRL); list.add(interCRL); CollectionCertStoreParameters params = new CollectionCertStoreParameters(list); CertStore store = CertStore.getInstance("Collection",params);
72
인증 경로 java.security.cert.CertPath를 이용하여 인증경로 생성
java.security.CertPathValidator를 이용하여 인증경로 의 유효성을 검증 CertificateFactory cf = CertificateFactory.getInstance("X.509"); List<Certificate> certChain = new ArrayList(); certChain.add(bobCert); certChain.add(interCert); CertPath certPath = cf.generateCertPath(certChain); Set trust = Collections.singleton(new TrustAnchor(rootCert,null)); CertPathValidator validator = CertPathValidator.getInstance("PKIX","BC"); PKIXParameters param = new PKIXParameters(trust); param.addCertStore(store); param.setDate(new Date()); try{ PKIXCertPathValidatorResult result = (PKIXCertPathValidatorResult)validator.validate(certPath,param); } catch(CertPathValidatorException e){ System.out.println("validation failed "+e.getIndex()+" detail: "+e.getMessage());
Similar presentations