Key Managemnet

79
1 Computer Network Lab. Key Managemnet 소소소소소소소 소소소 소소소 , 소소소 , 소소소

description

Key Managemnet. 소프트웨어공학 실험실 김경태, 전은아, 민병도. 목 차. 소 개 Keys Key Generators 와 Translators Key Agreement The Identity Key Management Paradigm The KeyStore Key Management Paradigm 결 론. 구성. The KeyStore Key Management Paradigm. Keys Key Generators Key Translators - PowerPoint PPT Presentation

Transcript of Key Managemnet

Page 1: Key Managemnet

1Computer Network Lab.

Key Managemnet

소프트웨어공학 실험실

김경태 , 전은아 , 민병도

Page 2: Key Managemnet

2Computer Network Lab.

목 차목 차

소 개소 개 KeysKeys

Key GeneratorsKey Generators 와 와 TranslatorsTranslators

Key Agreement Key Agreement

The Identity Key Management ParadigmThe Identity Key Management Paradigm

The KeyStore Key Management ParadigmThe KeyStore Key Management Paradigm

결 론결 론

Page 3: Key Managemnet

3Computer Network Lab.

소 개소 개 배경배경 :: 개인정보의 보호를 위하여 암호 키 사용하게 되었고 , 따라서 암호 키의 관리 문제가 나타남 .

Sun 은 키 관리를 위한 인터페이스와 클래스를 제공 (JDK).

JDK class 와 interface 가 키를 관리하고 표현하는데 사용

KeysKeysKey GeneratorsKey GeneratorsKey TranslatorsKey TranslatorsKey Agreement Key Agreement

KeysKeysKey GeneratorsKey GeneratorsKey TranslatorsKey TranslatorsKey Agreement Key Agreement

The Identity KeyManagementParadigm

The Identity KeyManagementParadigm

The KeyStore KeyManagementParadigm

The KeyStore KeyManagementParadigm

구성

Page 4: Key Managemnet

4Computer Network Lab.

Keys(1/3)Keys(1/3)

Public String getAlgorithm()Public String getAlgorithm()

Public byte[] getEncoded() Public byte[] getEncoded()

Public String getFormat() Public String getFormat()

java.security.Keyjava.security.Key

인터페이스인터페이스

java.security.PublicKey java.security.PublicKey

java.security.PrivateKey java.security.PrivateKey

java.securityjava.securityjava.securityjava.security

public PublicKey getPublic() public PublicKey getPublic()

public PivateKey getPrivate() public PivateKey getPrivate()

클래스클래스

java.security. KeyPair java.security. KeyPair

javax.crypto.SecretKeyjavax.crypto.SecretKey

javax.cryptojavax.crypto인터페이스인터페이스

Page 5: Key Managemnet

5Computer Network Lab.

Keys(2/3)Keys(2/3)

메소드 public String getAlgorithm()

- 키에서 사용된 암호 알고리즘 리턴 ( 예 :DSA, DSA, MD5, RSA 등 )

public byte[] getEncoded() - 암호화된 값 리턴 ( 암호화는 바이트 배열에 키 값을 적용 ) public String getFormat() - 암호화에 사용된 키 포맷의 이름 리턴 ( 예 :X.509, PKCS#8)

java.security.Key 인터페이스 - 모든 키의 공통적 기능을 정의하는 인터페이스

- 비밀 키에 사용되는 인터페이스 ( 개인 또는 세션 키 )

java.crypto.SecuretKey 인터페이스

Page 6: Key Managemnet

6Computer Network Lab.

Keys(3/3)Keys(3/3)

java.security.PublicKey

- 공개 키에 사용되는 인터페이스 java.security.PrivateKey

- 개인 키에 사용되는 인터페이스

JDK JDK 인터 페이스인터 페이스 (( 타입의 안정성과 키 확인타입의 안정성과 키 확인 ))

JDK JDK 클래스클래스 public KeyPair(PublicKey publicKey, PrivateKey privateKey) - 공개 키와 개인 키로 이루어지는 키 쌍 생성 메소드 : public PublicKey getPublic() - 공개 키 리턴 public PrivateKey getPrivate() - 개인 키 리턴

Page 7: Key Managemnet

7Computer Network Lab.

Key Generator(1/6)

: 암호 키 생성 ( 암호키 : 키 또는 키 쌍 ) 암호 키 생성 단계암호 키 생성 단계

1. 사용하기를 원하는 알고리즘에 대한 키 Generator 객체 획득2. 키 genetator 초기화3. 키 또는 키 쌍의 생성을 key generator 에게 요청

java.securityjava.security클래스클래스

Public abstract void initialize(int strength, SecureRandom random)Public abstract void initialize(int strength, SecureRandom random)

Public void initialize(int strength)Public void initialize(int strength)

Public abstract KeyPair genKeyPair() Public abstract KeyPair genKeyPair()

java.security.KeyPairGeneratorjava.security.KeyPairGenerator

Page 8: Key Managemnet

8Computer Network Lab.

Key Generator(2/6)

javax.cryptojavax.crypto클래스클래스

Public final void init(SecureRandom random)*Public final void init(SecureRandom random)*

Public final void init(int strength) Public final void init(int strength)

Public final void init(int strength, SecureRandom random) Public final void init(int strength, SecureRandom random)

javax.crypto.KeyGeneratorjavax.crypto.KeyGenerator

Public final SecretKey generateKey( ) Public final SecretKey generateKey( )

Page 9: Key Managemnet

9Computer Network Lab.

Key Generator(3/6)Key Generator(3/6)

Generator Generator 초기화 메소드초기화 메소드

public abstract void initialize(int strength, SecureRandom random)

: 보안강도 ( 실제로 키가 차지하는 비트 수 ) 와 난수로 초기화

public void initialize(int strength)

: 보안 강도로 초기화

KeyPairGenerator KeyPairGenerator 클래스클래스: java.security.KeyPairGenerator- 공개 키와 개인 키 쌍을 생성하고

KeyPair 로 리턴 . Generator Generator 객체를 객체를 getInstance() getInstance() 메소드에 알고리즘의 종류를 명시하는 메소드에 알고리즘의 종류를 명시하는

문자열 인수를 적용함으로 생성문자열 인수를 적용함으로 생성 Ex) KeyPairGenerator kpg = KeyPairGenerator.getInstance(“ElGamal”)

- 알고리즘을 발견하지 못할시 NoSuchAlgorithmException 동작

Page 10: Key Managemnet

10Computer Network Lab.

Key Generator(4/6)Key Generator(4/6)

키 생성 메소드키 생성 메소드 Public abstract KeyPair genKeyPair()

: 이전의 initialze() 에서 명시된 강도와 랜덤 비트 소스를 사용하여

key pair 를 생성

Ex)

KeyPairGenerator kpg = KeyPairGenerator.getInstance(“DSA”);

kpg.initialize(1024);

keyPair pair = kpg.genKeyPair();

Page 11: Key Managemnet

11Computer Network Lab.

Key Generator(5/6)Key Generator(5/6)

KeyGenerator KeyGenerator 클래스클래스: 대칭 암호에서의 하나의 키 생성 . 따라서 JCE 는 jvax.crypto.KeyGenerator 라는 랜덤한 하나의 키를 생성하는 클래스 포함

초기화 메소드초기화 메소드Public final void init(SecureRandom random)*

: 난수 사용하여 KeyGenerator 을 초기화Public final void init(int strength)

: 보안 강도 사용Public final void init(int strength, SecureRandom random)

: 보안 강도와 난수 사용

Generator Generator 객체 획득객체 획득 KeyGenerator kg = KeyGenerator.getInstance(“DES”)

Page 12: Key Managemnet

12Computer Network Lab.

Key Generator(6/6)Key Generator(6/6)

Public final SecretKey generateKey() : 새로운 랜덤 SecretKey 를 생성

Ex)

KeyGenerator kg = KeyGenerator.getInstance (“DES”);

Kg.init(new SecureRandom());

SecretKey key = kg.generateKey();

키 생성 메소드

Page 13: Key Managemnet

13Computer Network Lab.

Algorithm-Specific Initialization(1/2)

: Java.security.KeyPairGenerator 와 javax.crypto.KeyGeneratorsms Algorithm-Specific Initialization 의 개념을 지원 - 사용하는 알고리즘에 대한 정해진 파라메터를 사용가능

Java.security.KeyPairGenerator 는 Algorithm-Specific Initialization 을 위한 하나의 메소드 포함

Public void initialize(AlgorithmParameterSpec params) throws

InvalidAlgorithmParameterException : 만일 AlgorithmParameterSpec 객체가 인정되지 않는다면 , 예외처리

Page 14: Key Managemnet

14Computer Network Lab.

javax.crypto.KeyGenerator 는 Algorithm-Specific Initialization 을 위한 두 개의 메소드 포함 Public final void init(AlgorithmParameterSpec params) throws

InvalidAlgorithmParameterException

: 만일 AlgorithmParameterSpec 객체가 인정되지 않는다면 , 예외처리

Public final void init(AlgorithmParameterSpec params,

SecureRandom random) throws

InvalidAlgorithmParameterException

: 만일 AlgorithmParameterSpec 객체가 인정되지 않는다면 , 예외처리

Algorithm-Specific Initialization(2/2)

Page 15: Key Managemnet

15Computer Network Lab.

Key Translator(1/8)Key Translator(1/8)

Problem) 디스크에서의 키 저장 , 네트워크에서의 키 전송 Solution) 바이트 열 단위로 키 저장 또는 전송 바이트 열과 vice versa 로 Key 객체 변환 클래스를 사용하여 객체 변환

ClassClass

java.crypto.SecretKeyFactoryjava.crypto.SecretKeyFactory

javax.crypto.spec.SecretKeySpecjavax.crypto.spec.SecretKeySpec

javax.security.KeyFactoryjavax.security.KeyFactory

Page 16: Key Managemnet

16Computer Network Lab.

SecretKeySpec

: javax.crypto.spec.SecretKeySpec 클래스는 비밀 키의 바이트 열을

변환하는 가장 간단한 방법 . 두 개의 생성자를 가지고 있슴 . pubic SecretKeySpec(byte[] key, String algorithm) : 제공된 바이트 열을을 사용하여 SecretKeySpec 을 생성 . Key 에 알고리즘 제공 . pubic SecretKeySpec(byte[] key, int offset, int len, String algorithm) : 제공된 바이트 배열의 Offset 에서 시작하는 len 바이트들을 사용하여 SecretKeySpec 을 생성 . 제공된 알고리즘 가짐 .

예제 ) SecureRandom sr = new SecureRandom(); Byte[] keyByte = new byte[20]; Sr.nextBytes(keyBytes); SecretKey key = new SecretKeySpec (keyBytes, “HmacSHA1”);

Key Translator(2/8)Key Translator(2/8)

Page 17: Key Managemnet

17Computer Network Lab.

SecretKeyFactory SecretKeyFactory 클래스클래스 : java.crypto.SecretKeyFactory 클래스는 getInstance() 함수를 이용하여

SecretKeyFactory 를 생성 . 두 개의 생성자 가짐 . pubic static final SecretKeyFactory getInstance(String algorithm) throws NoSuchAlgorithmException : 주어진 알고리즘을 사용하여 새로운 SecretKeyFactory 생성 알고리즘 이름 ( 예 :DES) 이 대칭 암호 알고리즘 이름과 일치해야함 pubic static final SecretKeyFactory getInstance(String algorithm, String

provider) throws NoSuchAlgorithmException, NoSuchProviderException : 알고리즘과 제공자를 사용하여 , 새로운 SecretKeyFactory 생성

Key Translator(3/8)Key Translator(3/8)

-SecretKeyFactory 를 가지고 있다면 , KeySpec 와 SecretKey 사에서의 key translate 가 자유롭다

Page 18: Key Managemnet

18Computer Network Lab.

Key Translator(4/8)Key Translator(4/8)

From things to keysFrom things to keys: SecretKey 에서 KeySpec 로의 translate 는 SecretFactory 의

generatorSecret() 함수를 사용한다 pubic final SecretKey generateSecret(KeySpec keySpec) throws

InvalidKeySepcException :keySpec 의 정보를 사용하여 , SecretKey 생성 . 만일 KeySpec 이

인정되지 않는다면 , 예외처리 Ex) DES 키 생성 pubic SecretKey makeDESKey(byte[] input, int offset) throws

NoSuchAlgorithmException, InvalidKeySepcException, InvalidKeySpecException {

SecretKeyFactory desFactory = SecretKeyFactory.getInstance(“DES”);

KeySpec spec = new DESKeySpec(input, offset);

Return desFactory.generateSecret (spec);

}

Page 19: Key Managemnet

19Computer Network Lab.

Key Translator(5/8)Key Translator(5/8)

makeDESKey() 함수의 단계

예외사항 getInstance() 함수 -NoSuchAlgorithmException generatorSecret() 함수 -InvalidKeyException ( 정확하지 않은 키 길이 전달 )generatorSecret() 함수 -InvalidKeySpecException(KeySpec 에서 불인정 )

1.DES 키를 위한 키 요소의 획득 . SecretKey.getInstance() 를 사용2.KeySpec 은 제공된 바이트 열로부터 DES 키 데이터 표시 생성3.KeySpec 로부터의 SecretKey 생성 . generateSecret() 를 사용

Page 20: Key Managemnet

20Computer Network Lab.

Key Translator(6/8)Key Translator(6/8)

From keys to thingsFrom keys to things : SecretFactory 는 SecretKey 로부터 KeySpec 생성하는 방법 소유 Public final KeySpec getKeySpec(SecretKey key, Class keySpec)

throws

InvalidKeySpecException

: 주어진 SecretKey 로 부터 KeySpec 생성 . keySpec 파라메터는 리턴되는 객체의 형태 결정

Ex)

public byte[] makeBytesFromDESKey(SecretKey key) throws NoSuchAlgorithmException, InvalidKeySepcException {

SecretKeyFactory desFactory = SecretKeyFactory.getInstance(“DES”);

KeySpecSpec spec = (DESKeySpec) desFactory.getKey(key, DESKeySpec.class);

return spec.getKey();}

Page 21: Key Managemnet

21Computer Network Lab.

Key Translator(7/8)Key Translator(7/8)

KeyFactory KeyFactory 클래스클래스: Java.security.KeyFactory 클래스는 SecretKeyFactory 와 유사 .

공개키와 개인키에 적용Public static final KeyFactory getInstance(String algorithm) throws

NoSuchAlgrithmException

: 주어진 알고리즘을 사용하여 새로운 KeyFactory 생성에 사용

: 알고리즘 이름은 비대칭 알고리즘 이름이거나

서명알고리즘 ( 예 :DSA) 으로 해야함Public static final KeyFactory getInstance(String algorithm, String provider)

throws NoSuchAlgrithmException, NoSuchProviderException

: 제공된 제공자의 이름을 구현에 사용하여 , 새로운 KeyFactory 생성

Page 22: Key Managemnet

22Computer Network Lab.

Key Translator(8/8)Key Translator(8/8) PublicKey 또는 Privatekey 는 KeySpec 으로 부터의 변환에

generatePublic() 와 generatePrivate() 메소드 사용 Public final PublicKey generatePublic(KeySpec keySpec) throws

InvalidKeySpecException

: 지정된 KeySpec 을 PublicKey 생성에 사용 : 만일 KeySpec 이 KeyFactory 에 인정되지 않으면 , 예외처리 Public final PrivateKey generatePrivate(KeySpec keySpec) throws

InvalidKeySpecException

: 지정된 KeySpec 을 개인키 생성에 사용 KeyFactory 는 공개키와 개인키를 동시에 조정하는 getKeySpec()

을 갖는다 Public final KeySpec getKeySpec(Key key, Class keySpec) throws

InvalidKeySpecException

: 지정된 키로 부터 KeySpec 생성

Page 23: Key Managemnet

23Computer Network Lab.

Key Agreement(1/7)Key Agreement(1/7)

: 두 개 이상의부분에 동일한 secret 값을 소유하게 하는 프로토콜 세션 키에서도 사용

특징 : 비안전 채널 사용 ( 예 : 인터넷 ) 인증에는 사용하지 못함 직접적인 키 전송을 하지 않는다 사용자가 n 일시 , n-1 데이타 교환 필요

Diffie-Hellman - 가장 널리 사용 됨 - 1976 년경 발표

Notation- p : prime number - g: primitive mod p- xm, x r : random number - ym, y r : public key

- y = g x mod pxr x m

x r

- k = g mod p= y mod p = y mod p

m

rx m

m

Page 24: Key Managemnet

24Computer Network Lab.

Key Agreement(2/7)Key Agreement(2/7)

1. p 와 g 선택 . 가입자에게 배포

Marian

Robin

2. x 선택 . y 계산

3. y 로빈에게 전송

2. x 선택 . y 계산3. y 마리안에게 전송

m

rr

r

mm

x r

k = g mod p= y mod p = y mod p

m

rx m

xr x m4. 동일한 소유

m

Page 25: Key Managemnet

25Computer Network Lab.

Key Agreement(3/7)Key Agreement(3/7)

Javax.crypto.KeyAgreement :Javax.crypto.KeyAgreement 는 키 agreement 프로토콜을 캡슐화 :SunJCE 는 Diffie-Hellman 이 기반이되된 KeyAgreemnet 제공 KeyAgreement 객체 획득을 위하여 , getInstance() 메소드 사용 Public static final KeyAgreement getInstance(String algorithm) throws NosuchAlgorithmException : 주어진 알고리즘을 사용하여 새로운 KeyAgreement 생성 Public static final KeyAgreement getInstance(String algorithm, String

provider) throws NosuchAlgorithmException, NoSuchProviderException : 주어진 제공자의 이름으로 , 새로운 KeyAgreement 생성

Page 26: Key Managemnet

26Computer Network Lab.

Key Agreement(4/7)Key Agreement(4/7)

KeyAgreement KeyAgreement 초기화 메소드초기화 메소드Public final void init (Key key) throws InvalidKeyException : 제공된 키를 사용하여 KeyAgreement 초기화 : 올바른 키 형태가 아니라면 예외처리 발생Public final void init (Key key, SecureRandom random) throws InvalidKeyException : 제공된 키와 난수로 KeyAgreement 초기화Public final void init (Key key, AlgorithmParameterSpec params) throws InvalidKeyException, InvalidAlgorithmParameterException : 제공된 키와 AlgorithmParameterSpec 으로 KeyAgreement 초기화Public final void init (Key key, AlgorithmParameterSpec params,

SecureRandom random) throws

InvalidKeyException, InvalidAlgorithmParameterException

: 제공된 키 , AlgorithmParameterSpec, SecureRandom 로 KeyAgreement 초기화

Page 27: Key Managemnet

27Computer Network Lab.

Key Agreement(5/7)Key Agreement(5/7) Public final Key doPhase (Key key, boolean lastPhase) throws

InvalidKeyException, IllegalStateException

: 공개 키 값 리턴 . lastPhase 는 키 agreement 가 수행되기 시작한 마지막 단계 지시

Public final byte[] generateSecret() throws IllegalStateException :secret 값 리턴 . KeyAgreement 의 모든 단계 미실행시 , 예외처리 Public final init generateSecret(byte[] sharedSecret, int offset) throws

IllegalStateException, ShortBufferException :offset 에서 시작한 배열에 secret 값 write. 배열 길이 불충분시

예외처리 Public final init generateSecret(String algorithm) throws

InvalidKeyException, IllegalStateException, NoSuchAlgorithmException

: 주어진 알고리즘으로 SecretKey 에 대한 secret 값 리턴

Secret 값 추출

Page 28: Key Managemnet

28Computer Network Lab.

Key Agreement(6/7)Key Agreement(6/7)SKIP SKIP (Simple Key Internet Protocol)

Diffie-Hellman 사용세션 키 사용로컬 네트워크와 VPN(Virtual Private Key) 에서 사용키 크기에 따른 세가지 다른 베이스와 모듈 제공

SKIP 베이스와 모듈 값을 위한 클래스를 정의 클래스 { String // 16 진법으로 모듈 값을 표시하기 위하여 스트링 정의 모듈 // BigInteger 을 이용하여 모듈 값 생성 베이스 // 베이스 값 생성 저장 // DHParamterSpec 에 모듈과 베이스 값 저장 }

Page 29: Key Managemnet

29Computer Network Lab.

Key Agreement(7/7)Key Agreement(7/7)

1. Key Pair 생성

2. 네트워크 연결 wait

3. 공개 키 수신

4. KeyFactory 를 이용 키 재구성

5. 자신의 공개키 전송

6. Secret 값 계산

1.Key Pair 생성2. 명령 라인에 host IP 와 포트 입력하여 네트워크 연결 .

공개 키 전송

3. 공개키 수신

4. KeyFactory 를 이용 키 재구성

5. Secret 값 계산

7. Secret 값 출력 6. Secret 값 출력

서 버 클라이언트

Page 30: Key Managemnet

30Computer Network Lab.

1. Identity Key Management 의 정의2. Key Holders

- Principal

- Identity

- Signer

- IdentityScope

4. KeyManager 구현

목 차

Page 31: Key Managemnet

31Computer Network Lab.

• Identity Key Management 란 ?– JDK 1.1 에서 java.security.Identity 클래스를 사용한

키관리* JDK 1.2 에서는 Keystore-based Key Management 로 바뀜

– 구성• Identity

; 공개키와 관련정보들을 포함• Signer

; 공개키와 개인키 , 그리고 관련정보들을 포함• IdentityScope

; Identity 의 그룹을 표시하며 Identity 객체를 가짐

The Identity Key Management Paradigm

Page 32: Key Managemnet

32Computer Network Lab.

The Identity Key Management Paradigm

Identity Scope (Marian’s computer)Identity Scope (Marian’s computer)

Identity Scope (Merry Men)Identity Scope (Merry Men)

Signer (Marian)공개키개인키

기타 정보들

Signer (Marian)공개키개인키

기타 정보들

Identity (Sheriff)공개키

기타 정보들

Identity (Sheriff)공개키

기타 정보들

Identity (Will)공개키

기타 정보들

Identity (Will)공개키

기타 정보들

Identity (Tuck)공개키

기타 정보들

Identity (Tuck)공개키

기타 정보들

Identity (Robin)공개키

기타 정보들

Identity (Robin)공개키

기타 정보들

Figure : Identity-based key management

Page 33: Key Managemnet

33Computer Network Lab.

Java.security For the Identity Key Management

InterfaceInterface

ClassClass

Principal

Signer

Identity

IdentityScope

Method getName()Method getName()

Constructor identity() identity(String name) identity(String name, IdentityScope scope)Method getPublicKey() setPulicKey(Publickey key) addCertificate(Certificate certificate) removeCertificate(Certificate certificate) Certificate[] getCertificates()

Constructor identity() identity(String name) identity(String name, IdentityScope scope)Method getPublicKey() setPulicKey(Publickey key) addCertificate(Certificate certificate) removeCertificate(Certificate certificate) Certificate[] getCertificates()

Constructor Signer() Signer(String name) Signer(String name, IdentityScope scope)Method getPrivateKey() setKeyPair(KeyPair pari)

Constructor Signer() Signer(String name) Signer(String name, IdentityScope scope)Method getPrivateKey() setKeyPair(KeyPair pari)

Constructor identityScope() identityScope(String name) identityScope(String name, IdentityScope scope)Method addIdentity(Identity identity) removeIdentity(Identity identity) getIdentity(String name) getIdentity(PublicKey key) getIdentity(Principal principal) size() identites()

Constructor identityScope() identityScope(String name) identityScope(String name, IdentityScope scope)Method addIdentity(Identity identity) removeIdentity(Identity identity) getIdentity(String name) getIdentity(PublicKey key) getIdentity(Principal principal) size() identites()

Page 34: Key Managemnet

34Computer Network Lab.

• Principal 인터페이스– Identity 는 java.security.principal 인터페이스로

구현– Principal 은 단순히 이름을 가져온다

– Method• public abstract String getName();

Key Holder

Page 35: Key Managemnet

35Computer Network Lab.

• Identity 클래스– 실제 세계의 실체들 ( 사람이나 조직같은 ) 을 표현– 키의 소유자 확인– 이름 , 공개키 , 공개키를 증명하는 증명서 포함

– Constructor• public Identity (String name);

• public Identity (String name, IdentityScope scope)

throws KeyManagementException;

Key Holder

Page 36: Key Managemnet

36Computer Network Lab.

– Method( 공개키 관리 )

• public PublicKey getPublicKey ();

• public void setPublicKey (PublicKey key)throws KeyManagementException;

( 증명서 관리 )

• public void addCertificate (Certificate certificate)throws KeyManagementException;

• public void removeCertificate (Certificate certificate)throws KeyManagementException;

• public Certificate[] getCertificates ();

Key Holder

Page 37: Key Managemnet

37Computer Network Lab.

• Signer 클래스– 개인키 관리를 위해 추가로 제공되는 서브클래스– Method

• public PrivateKey getPrivateKey ();

• public final void setKeyPair (KeyPair pair)throws InvalidParameterException KeyException;

Key Holder

Page 38: Key Managemnet

38Computer Network Lab.

• IdentityScope– Identity 의 그룹을 표시– Identity 의 객체 저장– Identity 의 Scope 라는 개념을 제시– IdentityScope 자체가 Identity 로 다른 Scope 에

속할수 있다– 공개키 , 인증서를 가질수 있다– Identity 로 부터 상속 받은 클래스이므로 Signer

일수 없다

Key Holder

Page 39: Key Managemnet

39Computer Network Lab.

– Method( Identity 관리 )

• public abstract void addIdentity (Identity identity)throws

KeyManagementException;

• public abstract void removeIdentity (Identity identity)throws

KeyManagementException;

• public abstract int size ();

• public abstract Enumeration identites ();

• public abstract Identity getIdentity (String name);

• public abstract Identity getIdentity (PublicKey key);

• public Identity getIdentity (Principal principal);

Key Holder

Page 40: Key Managemnet

40Computer Network Lab.

• Key 와 Identity 관리 클래스의 구현– java KeyManager -c keyfile signer algorithm strength

– java KeyManager -e keyfile idname outfile

– java KeyManager -i keyfile infile

– java KeyManager -r keyfile idname

– java KeyManager -l keyfile

KeyManager

Page 41: Key Managemnet

41Computer Network Lab.

• 구현된 함수들– Constructor

protected KeyManager(String name, KeyPair pair) {

super(name);

try { setPublicKey(pair.getPublic()); }

catch (KeyManagementException kme) {}

mPrivateKey = pair.getPrivate();

mIdentities = new Hashtable();

}

KeyManager

Page 42: Key Managemnet

42Computer Network Lab.

– Name 의 Identity 획득public synchronized Identity getIdentity(String name) {

Enumeration e = mIdentities.elements();

while (e.hasMoreElements()) {

Identity i = (Identity)e.nextElement();

if (i.getName().equals(name))

return i;

}

return null;

}

public Identity getIdentity(PublicKey key) {

return (Identity)mIdentities.get(key); }

KeyManager

Page 43: Key Managemnet

43Computer Network Lab.

– Identity 추가public synchronized void addIdentity(Identity identity)

throws KeyManagementException {

if(mIdentities.contains(identity))

throw new KeyManagementException("This

KeyManager already contains " + identity.getName() + ".");

if(mIdentities.containsKey(identity.getPublicKey()))throw new

KeyManagementException("This

KeyManager already contains "+ identity.getName() + "'s key.");

mIdentities.put(identity.getPublicKey(), identity);

}

KeyManager

Page 44: Key Managemnet

44Computer Network Lab.

– Identity 삭제

public synchronized void removeIdentity(Identity identity)

throws KeyManagementException {

PublicKey key = identity.getPublicKey();

if(mIdentities.containsKey(key))

mIdentities.remove(key);

else

throw new KeyManagementException("This KeyManager

does not contain "+ identity.getName() + ".");

}

KeyManager

Page 45: Key Managemnet

45Computer Network Lab.

– 키 획득public synchronized PublicKey getPublicKey(String name) {

if(name.equals(getName()))

return getPublicKey();

return getIdentity(name).getPublicKey();

}

public PrivateKey getPrivateKey() { return mPrivateKey; }

KeyManager

Page 46: Key Managemnet

46Computer Network Lab.

– Identity 추가public void addIdentity(String name, PublicKey key)

throws KeyManagementException {

Identity i = new KeyManagerIdentity(name);

i.setPublicKey(key);

addIdentity(i);

}

KeyManager

Page 47: Key Managemnet

47Computer Network Lab.

– 인스턴스 획득public static KeyManager getInstance(String file)

throws IOException, ClassNotFoundException {

ObjectInputStream in = new ObjectInputStream(new

FileInputStream(file));

KeyManager km = (KeyManager)in.readObject();

in.close();

km.mKeyFile = file;

return km;

}

KeyManager

Page 48: Key Managemnet

48Computer Network Lab.

– KeyManager 생성

public static KeyManager create(String file, String name, KeyPair pair) {

KeyManager km = new KeyManager(name, pair);

km.mKeyFile = file;

return km;

}

KeyManager

Page 49: Key Managemnet

49Computer Network Lab.

– 저장public synchronized void save() {

try {

ObjectOutputStream out = new ObjectOutputStream(new

FileOutputStream(mKeyFile));

out.writeObject(this);

out.close();

}

catch (Exception e) {

System.out.println("KeyManager.save: " + e.toString());

}

}

KeyManager

Page 50: Key Managemnet

50Computer Network Lab.

– KeyMangerIdentityprivate static class KeyManagerIdentity

extends Identity {

public KeyManagerIdentity(String name) { super(name); }

}

KeyManager

Page 51: Key Managemnet

51Computer Network Lab.

• Main 함수java KeyManager -c keyfile signer algorithm strength

if (option.indexOf("c") != -1) {

if (args.length < 5) { usage(); return; }

String signer = args[2]; String algorithm = args[3];

int strength = NumberFormat.getInstance().parse(args[4]).intValue();

System.out.println("Initializing the KeyPairGeneratro...");

KeyPairGenerator kpg = KeyPairGenerator.getInstance(algorithm);

kpg.initialize(strength);

System.out.println("Generating the key pair...");

KeyPair pair = kpg.genKeyPair();

KeyManager km = create(keyfile, signer, pair);

km.save(); System.out.println("Done."); }

KeyManager

Page 52: Key Managemnet

52Computer Network Lab.

java KeyManager -e keyfile idname outfile

else if (option.indexOf("e") != -1) {

if(args.length < 4) {usage(); return; }

String idname = args[2];

String outfile = args[3];

KeyManager km = getInstance(keyfile);

ObjectOutputStream out = new ObjectOutputStream(new

FileOutputStream(outfile));

PublicKey key = km.getPublicKey(idname);

out.writeObject(idname);

out.writeObject(key);

out.close();

System.out.println("done."); }

KeyManager

Page 53: Key Managemnet

53Computer Network Lab.

java KeyManager -i keyfile infile

else if (option.indexOf("i") != -1) {if (args.length < 3) { usage(); return; }String infile = args[2];KeyManager km = getInstance(keyfile);ObjectInputStream in = new ObjectInputStream(new

FileInputStream(infile));String idname = (String)in.readObject();PublicKey key = (PublicKey)in.readObject();in.close();km.addIdentity(idname, key);km.save();System.out.println("Done.");

}

KeyManager

Page 54: Key Managemnet

54Computer Network Lab.

java KeyManager -r keyfile idname

else if (option.indexOf("r") != -1) {

if (args.length < 3) { usage(); return; }

String idname = args[2];

KeyManager km = getInstance(keyfile);

Identity i = km.getIdentity(idname);

km.removeIdentity(i);

km.save();

System.out.println("done.");

}

KeyManager

Page 55: Key Managemnet

55Computer Network Lab.

java KeyManager -l keyfile

else if (option.indexOf("1") != -1) {

if (args.length < 2) { usage(); return; }

KeyManager km = getInstance(keyfile);

System.out.println("KeyManager contents of " + keyfile + ":");

System.out.println(" public and private key for " +

km.getName());

Enumeration e = km.identities();

while (e.hasMoreElements()) {

Identity i = (Identity)e.nextElement();

System.out.println(" public key for " + i.getName());

}

KeyManager

Page 56: Key Managemnet

56Computer Network Lab.

목 차

1. 일반 사항 2. KeyStore 개요

2.1 KeyStore 구성2.2 KeyStore 기능들2.3 KeyStore 메소드 설명

3. keytool 개요3.1 Keytool 기능들3.2 Keytool 기능 설명

4. 요 약

Page 57: Key Managemnet

57Computer Network Lab.

1. 일반 사항

JDK1.2 API 1.1 에서 제공하던 고급기능과 Public-key Encryption 을 더욱 확장 ,

보안기능 제공 JDK1.1 의 키 관 리 는 identity-based 이 며 , 1.2 는

java.security.KeyStore 기반으로 새로운 메소드를 제공 KeyStore : Private Key 와 Public Key, Certificates 를 보유하는

handy box 로 한 사람을 증명하기 위하여 요구되는 모든 정보를 포함 . 당신을 다른 이들에게 증명할 필요가 있다 . --> 서명데이터 개인키

사용 , 공개키와 인증서 제공 사람들이 합법적임을 확신하도록 만들 필요가 있다 .

키관리 요구사항 하나의 개인 / 공개키 쌍보다 더 많이 소유할 수 있으므로 관리가

요구됨

Page 58: Key Managemnet

58Computer Network Lab.

2. KeyStore 개요

두개의 엔트리 형태를 포함개인키 엔트리 (Private key entry)

공개키와 매핑되어 일치하는 인증서와 연계된 개인키를 포함 .

--> 다른 데이터를 서명하고 암호 분배하는데 유용

신용 증명 엔트리 (trusted certificate entry) 당신이 사실임 ( 신용 ) 을 증명하는 것을 포함한다 . 이는 보안 정책 유틸리티 , Policytool, 신용 코드 서명자에 대한 보안 정책 정의와 연계되어 사용될 수 있다 .

별칭들 (aliases) 또는 짧은 이름으로 조직엔트리들은 alias, Hashtable 또는 Properties 객체 작업과

유사한 메소드를 사용하여 저장되거나 검출 .

Page 59: Key Managemnet

59Computer Network Lab.

2.1 KeyStore 구성 두개의 키쌍 엔트리 : 애플릿 서명과 email 메시지들을 서명 세개의 서로 다른 인증체인 : Will 과 Tuck 그리고 Robin 에게

일치하는 인증 체인 (Marian 을 아는 사람들이 , 그들의 공개키와 조합하여 사용 )

각 엔트리의 식별 : alias 인 “ CodeKeys” 또는 “ WillScarlet” 에

의하여 식별한다 .

EmailKeys

PublicKeyPrivateKeyCertificates

RobinHood

Certificate

WillScarlet

Certificate

FriarTuck

Certificate

KeyStore(Marian’s computer)

CodeKeys

PublicKeyPrivateKeyCertificates

세개의 서로 다른 인증체인

두개의 키쌍 엔트리

( 그림 5-2) KeyStore 기반 키관리

Page 60: Key Managemnet

60Computer Network Lab.

2.2 KeyStore 기능들

Getting( 획득 ) Loading and saving( 로딩과 저장 ) Adding private key entries ( 개인키 엔트리 추가 ) Adding trusted certificate entry( 신용 인증 엔트리

추가 ) Retrieving entries( 엔트리 검출 )

Page 61: Key Managemnet

61Computer Network Lab.

키관리 및 인증서 발급 / 증명 Flow

인증기관공개키 및 인증서 등록관리

공개키사용자 ,

인증서 사용자 ...

개인 / 공개키생성자 ,

인증서 작성자 ...

Identity-basedSinger,

Identity...

KeyStore-based...

키관리 패러다임

공개키기반 데이터 전송

공개키 분배

공개키 등록 , CSR/ 인증서 요구 등록

공개키 및 인증서 요구

CodeKeys,EmailKeys,Certificate...

Page 62: Key Managemnet

62Computer Network Lab.

2.3 KeyStore 메소드 설명 (1)

GettingKeyStore 는 abstract class 로 getInstance(); 를

사용하여 실제적인 subclass 얻는다 . Public static final KeyStore getInstance() throws KeyStoreException

• 이 메소드는 KeyStore 인스턴스를 리턴KeyStore 의 getInstance() 메 소 드 는 KeyStore 의

subclass 를 어떻게 생성할 것인가를 결정하는데 java.security 소유 파일의 라인으로 사용한다 .

만일 라인이 손실된다면 , getInstance() 로 기본 KeyStore 구 현 , sun.security.tools.JavaKeyStore 을 사용한다 .

Page 63: Key Managemnet

63Computer Network Lab.

2.3 KeyStore 메소드 설명 (2) Loading 과 saving

loading 과 saving 을 지원 , passphrase(password) 를 통하여 데이터의 무결성 검사 수행 후 저장

public abstract void store(OutputStream stream, String password) throws IOException, NoSuchAlgotithmException, CertificateException

무결성 검사는 적절하게 구현되었는지 , 키 저장 데이터에 속여진 것이 없다면 일부 보장을 제공하지만 중요하다 . 가장 단순한 경우는 키 저장에 따르는 KeyStore 의 메시지 다이제스트를 저장한다 .

로딩하였을 때 KeyStore’s 데이터를 기반한 메시지 다이제스트를 최근에 계산된 저장 메시지 다이제스트와 비교할 수 있다 . 결과 다이제스트 값을 KeyStore 에 저장된다 .

로딩될 때 동일한 비밀번호가 동일한 다이제스트 값을 생성하기 위하여 필요하다 . 만일 두 다이제스트 값이 일치하지 않는다면 , 비밀번호를 다르게 사용하였거나 KeyStore 데이터가 변경된 것이다 .

Page 64: Key Managemnet

64Computer Network Lab.

2.3 KeyStore 메소드 설명 (3)

Adding private key entries ( 개인키 엔트리 추가 ) 당신이 가진 키쌍을 KeyStore 로 추가하기를 원하는 것이다 . 공개키와 대응되는 개인키와 인증체인을 추가 공개키에 포함된 본인서명 인증을 가지고 있다면 인증체인을

추가

Public abstract void setKeyEntry(String alias, PrivateKey key, String passphrase, Certificate[] chain) throws KeyStoreException

String passphrase(subclass 구현에 따르며 , 적절히 지정 ) Brain-dead protection : 단순스킴 , KeyStore 저장시 평문에 passphase 와

개인키를 저장 , ㅔ passphrase 로 키복구 가능 Weak encryption : passphrase 와 개인키가 결함 , 스크램블링에 의해 개인키

암호화 . 캐주얼 스누피와 아마추어 해커 방지

Page 65: Key Managemnet

65Computer Network Lab.

2.3 KeyStore 메소드 설명 (4)

Strong encryption : 가장 좋은 해결책으로 passphrase 기반 암호화에 사용됨 .( 제 7 장 참조 ) 이 스킴에서 passphrase 는 세션키를 생성하기 위해 사용되고 , 세션키는 대칭 암호에 사용되며 , 이는 KeyStore 로 저장되기 전에 초기 개인키를 암호화하기 위해 사용된다 . 암호화 알고리즘에 따라서 이는 개인키를 숨기기에 가장 효과적일 수 있다 .

일찍이 보아 왔던 것 store() 와 load() 에 대한 passphrase의 사용과는 다름 . 여기서 passphrase 메소드는 전체 키 저장 데이터의 무결성을 보장한다 .

Page 66: Key Managemnet

66Computer Network Lab.

2.3 KeyStore 메소드 설명 (5)

Adding trused certificate entry( 신용 인증 엔트리 추가 ) setCertificateEntry() 를 사용하여 KeyStore 로 인증을 추가

Public abstract setCertificateEntry(String alias certificate Exception)• 이 메소드는 주어진 인증서와 함께 alias 가 추가된다 .• 만일 alias 가 이미 존재한다면 최근의 인증서는 새로운

것으로 대체된다 .

당신은 모든 인증 체인에 추가할 수 없다 . 만일 당신이 누군가의 공개키와 일치하는 인증 체인을 수신한다면 , 당신은 신용 인증 엔트리로 체인에 각 인증서를 추가할 수 있다 .

Page 67: Key Managemnet

67Computer Network Lab.

2.3 KeyStore 메소드 설명 (6)

Retrieving entries( 엔트리 검출 )다른 사람들의 공개키에 포함하는 인증서들을 보유함 .Get 메소드로 검출

Public abstract PrivateKey getPrivateKey(String alias, String passphrase) throws NoSuchAlgorithmException, UnrecoverableKeyException

당신은 alias 와 관련된 개인키를 검출하기 위하여 이 메소드를 사용할 수 있다 . 주어진 passphrase 는 개인키를 적용하여 보호 (protection) 하는 것을 취소 (undo) 하기 위해 사용된다 .

Page 68: Key Managemnet

68Computer Network Lab.

3. keytool 개요 Keytool 은 java.security.KeyStore 클래스에 대한 명령라인

인터페이스이다 . KeyStore 개념

개인키 , 공개키와 인증에 대한 단순 database 이며 , 엔트리는 alias 으로 식별 및 참조한다 .

기본적으로 KeyStores 는 hard disk 에 파일로 저장 , 하나의 파일이 KeyStore 로 적합

keytool 활용 ( 기본 구현으로 변화될 것임 ) KeyStore 는 파일 다수개를 관리하는데 사용될 수 있다 . 만약 당신이 keytool 을 사용할 때 KeyStore 파일을 명시하지

않았다면 사전 설정된 파일이 사용 , 이는 .keyStore 파일로 불리게 되며 HOMEDRIVE 와 HOMEPATH

환경변수에 의해 결정된 디렉토리에 놓여진다 . 또는 .keyStore 는 JDK 설치디렉토리에 위치한다 .

Page 69: Key Managemnet

69Computer Network Lab.

3.1 keytool 기능들

Creating a key pair( 키쌍 생성 )

Ubiquitous options and defaults ( 어디서나 있는 옵션과 기본설정 )

Inspecting the KeyStore ( 키 저장 면밀검사 )

Generating a CSR(Certificate Signing Request 생성 )

Importing certificates ( 인증서 불러오기 )

Other options ( 다른 옵션들 )

Changing the default KeyStore class ( 기본설정 키 저장 클래스 변경 )

Page 70: Key Managemnet

70Computer Network Lab.

3.2 Keytool 기능설명 (1)

Creating a key pair( 키쌍 생성 )당신은 – genkey 명령 옵션을 사용하여 키쌍을 생성C:\keytool –genkey –alias Jonathan –keyalg DSA –keysize 1024 –dname

“CN=Jonathan Knudsen, OU=Technical Publications, O=O’Reilly & Associates, C=US” –keypass buendia –storepass buendia

C:\

- dname 이 엔트리는 뚜렷한 이름 (DN:distinguished name)* 을 명시 ( 선택적으로 사용가능 )

CN( 공용 이름 ) : 당신의 이름 OU( 조직 단위 ) 당신이 속하는 당신 조직의 부서 O( 조직 ) : 당신의 조직 L( 위치 ) : 통상 , 시 S( 정부 ) : 정부 또는 주 C( 나라 ) : 나라

Page 71: Key Managemnet

71Computer Network Lab.

3.2 Keytool 기능설명 (2)

- keypass이 단계는 새로운 키쌍의 개인키를 보호하기 위해 사용된다 . 주 ) 누구든지 당신의 어깨 넘어로 비밀번호를 볼 수 있을 것이다 . 추가적으로 KeyStore 구현에 적용될 실질적인 보호를 당신은 사용하여야 한다 .

- storepass이 passphrase 는 전체 키 저장의 무결성을 보장한다 . 때문에 새로운 키 저장을 생성하기 위하여 – genkey 옵션을 사용하며 , 이 옵션으로 KeyStore 의 passphrase 를 설정한다 . 이후에 KeyStore 에 따른 동작은 동일한 passphrase 타이프를 요구한다 .

Page 72: Key Managemnet

72Computer Network Lab.

3.2 Keytool 기능설명 (3)

Ubiquitous options and defaults ( 어디서나 있는 옵션과 기본설정 )keytool 의 다양한 옵션들은 어느 명령어와 함께 사용할 수 있다 . 이것들은 –

keystore, -storepass, 그리고 – v가 있다 .keytool 은 당신이 필요로 하는 것 여러 경우에 있어서 , 옵션을 잃어버리더라도 기본설정이 있어서 관대하다 . 만일 없다면 , keytool 은 당신이 잃어버린 정보를 즉시 알려 줄 것이다 .

<표 5-1> keytool 옵션들의 기본설정 값

옵션 기본 설정값-alias mykey-keyalg DSA-keysize 1024-sigalg DSA/SHA-1-validity 90-KeyStore 기본설정 .KeyStore 파일-file 표준 입력 또는 출력

Page 73: Key Managemnet

73Computer Network Lab.

3.2 Keytool 기능설명 (4)

Inspecting the KeyStore ( 키 저장 면밀검사 ) KeyStore 의 내용을 보기 위하여 – list 명령을 사용한다 .

C:\keytool –list –storepass buendia

Your KeyStore contains 1 entry:

jonathan, Mon Jan 12 16:16:59 EST 1998, KeyEntry,

Certificate MD5 Fingerprint: 56:E0:FD:24:13:6c:51:C0:D9:57:B4:33:7F:79:A8:a4

C:\

–v 옵션을 – list 와 함께 사용한다면 , 당신은 더 많은 상세 정보를 출력 궁극적으로 하나의 KeyStore 엔트리를 보기 위하여 – alias 옵션을 사용 .

C:\ keytool –list –alias Jonathan –storepass buendia

Page 74: Key Managemnet

74Computer Network Lab.

3.2 Keytool 기능설명 (5) Generating a CSR( 인증 서명 요구서 생성 )

실제적인 인증서를 얻기 위하여 , 당신은 CSR 생성을 요구하면 , 인증 기관 (CA) 에 의해 서명된다 .(signed)

CSR 은 당신에 관한 공개키와 정보를 포함하는 특별한 파일임 이는 당신의 개인키로 서명된다 . 당신이 CSR 을 CA 로 송부할때 , CA 는 당신의 신원 (identity) 를

검사하고 CSR 의 권한 부여를 증명 (Authenticity) 하기 위하여 노력할 것이다 .

그리고 당신의 인증함을 알리고 , CA 의 Private key 로 서명하여 , 당신의 공개키를 확인 (verifies) 한다 .

CSR 을 생성하기 위하여 -csr 명령을 선택적으로 사용한 예제C:\ keytool -csr -alias Jonathan -file Jonathan -file Jonathan.csr -keypass buendia -storepass buendia -vCertification request stored in file <Jonathan.csr>.Submit this to your certificate authority.

C:\

C:\ type Jonathan.csr (base64data 출력결과 page 88 참조 )

Page 75: Key Managemnet

75Computer Network Lab.

3.2 Keytool 기능설명 (6)

Importing certificates ( 인증서 불러오기 ) KeyStore 로 인증서를 불러오는 두 가지 이유가 존재한다 .

첫번째 경우 , 당신은 CSR 에 대한 응답으로 CA 로부터 인증서를 수신할 수 있다 . 이 경우에 당신의 CSR 을 생성하기 위하여 사용한 개인키 엔트리로 인증관계를 요구할 것이다 .

두번째 경우 , 그 밖의 다른 사람의 trusted certificate entry 를 만들기

위하여 인증서를 불러온다 .

다른 경우 keytool 의 – import 명령 옵션 사용 keytool 은 RFC1421 에서 기술된 것과 같이 “ printable encoding” 에

대해 , 어떻게 X.509 인증서를 Import 하는지를 안다 . 이 포맷은 header line 과 footer line 이 있으며 , body 는 base64data 이다 .(base64에 관한 좀더 상세한 정보는 제 1 장과 부록 B 를 참조한다 .) --> (base64data 출력결과 page 88 참조 )

Page 76: Key Managemnet

76Computer Network Lab.

3.2 Keytool 기능설명 (7) Other options ( 다른 옵션들 )

-selfcert : 개인키 엔트리에 대한 자신의 서명 인증을 keytool 로 재생성 , 개인키 엔트리를 별도의 이름 (Distinguished Name) 으로 변경 , 옵션은 <표 5-2> 의 – genkey 와 같이 대부분의 동일한 옵션들을 허용

-export : 파일에 인증서를 보관 (save) 하기 위해 내보낸다 . 엔트리를 명시하기 위하여 – alias 옵션을 사용 , 출력 파일을 명시하기 위하여 –file 옵션을 사용한다 .

-printcert : 파일에 포함된 인증서에 관한 정보를 출력한다 . 단순하게 파일 이름을 명시하는 것은 – file 을 사용한다 . 이 명령은 KeyStore 데이터를 사용하거나 변경하지 않는다 .

-keyclone : 개인키 키저장 엔트리를 복사한다 . -alias, -dest, -keypass, -new 옵션들을 허용한다 .

Page 77: Key Managemnet

77Computer Network Lab.

3.2 Keytool 기능설명 (8)

-storepasswd : 키 저장에 대한 비밀번호를 변경한다 . 모든 다른 명령들과 같이 초기 키저장 비밀번호를 – storepass 를 사용하여 새로 명시한다 . 새로운 키저장 비밀번호는 – new 옵션을 사용하여 명시한다 .

-keypasswd : 키 저장에서 개인키 엔트리에 대한 비밀번호를 변경한다 . 이는 <표 5-4> 에서 나열한 옵션들을 사용한다 .

-delete : 키 저장으로부터 엔트리 제거 (remove). 엔트리를 명시하기 위해 – alias 옵션을 사용한다 .

-help : 이 명령 옵션은 모든 keytool 의 옵션들의 리스트를 출력한다 .

Page 78: Key Managemnet

78Computer Network Lab.

3.2 Keytool 기능설명 (9)

Changing the default KeyStore class ( 기본설정 키 저장 클래스 변경 ) 기본설정 keytool 은 sun.security.tools.JavaKeyStore 을 사용하여

작성한다 . 만일 당신이 자신만의 KeyStore 구현을 write 한다면 , 당신은 당신의 키와 인증서들을 관리하기 위하여 keytool 을 사용할 수 있다 . 당신은 JDK 설치 디렉토리 밑의 lib/security 를 찾고 , java.security 파일의 한 라인을 변경이 필요하다 .

KeyStore=sun.security.tools.JavaKeyStore

만일 당신의 KeyStore oreilly.jonathan.security.SuperDuperKeyStore 로 구현한다면 , 예제와 같이 변경이 요구된다 .

KeyStore=oreilly.jonathan.security.SuperDuperKeyStore

Page 79: Key Managemnet

79Computer Network Lab.

4. 요 약

본 5 장을 통하여 , Key 관리에 기본개념을 분석함

키생성 , 분배 , 동의 , identity-based, KeyStore-based 의 각 단계의 개념과 프로그램을 파악

키관리 및 인증서 발급 / 증명 Flow 참조 (7 쪽 )