'keytool'에 해당되는 글 2건

  1. 2008.08.14 openssl 기본
  2. 2008.08.11 OpenSSL
posted by 동건이 2008. 8. 14. 10:19

openssl 기본

OPENSSL에서 등장하는 다양한 용어의 설명

1. PEM 파일
개인키, 공개키, 인증서 정보를 포함할 수 있다.
인증서를 PEM  형식으로 변환하려면 DER로 인코딩 한 후 Base64로 인코딩 하면 된다.
인코딩된 데이터 "-----BEGIN CERTIFICATE-----" 와 "-----END CERTIFICATE-----"
사이에 포함된다.

2. DER파일
개인키, 공개키,인증서를 포함할 수 있다.
KeySotre에 인증서(x.509)를 추가하려면 DER형식으로 변환해야 한다.

3. PKCS
Public Key Cryptography Standard 는 RSA사에서 주관하는 공개키 암호화를 위한 표준으로
PKCS#1 부터 PKCS#15까지 있다.


4. 인증서
인증서는 사용자의 공개키가 특정의 사용자에게 결합되어 있음을 증명하기 위하여 인증 기관이 발행하는
디지털 정보이다.
 - 사용자의 공개키, 인증기관(CA: Cerificate Authrity)의 서명
 - 인증서는 CA에 의해 발급된다.
 
5. KeyStore
개인키와 공개키로 사용되는 인증서(Certificate, X.509)가 저장된 데이터 베이스
 형식은 다음과 같다.
 - JKS(Java Key Store) : Keytool 을 상요하여 개인키와 공개키를 생성
 - PKCS#13
 포함 내요은 다음과 같다
 - 개인키와 공개키
 - Trust Certificate Entries
    .Public Key(Certificate)만 포함
    .인증서에 포함된 인증서 소유자(Subject)를 인증하기 위해서
       인증서를 발급한 기관의 인증서를 Trust Cerficate Entries 에 포함한다.

6. Keytool
Private Key와 Public Key(Self-signed Certificate)로 사용되는 인증서가 저장된 KeyStore를 관리하는 툴
 - keytool을 이용해 Private key를 생성할 수는 있으나, Keystore 에 저장(import) 또는 추출(Export)할 수 없다.
 - keytool은 der로 인코딩된 인증서(x.509)와 PKCS#7 형식의 파일만 저장(import)할 수 있다.
   

'개발 > 외부 참조 글' 카테고리의 다른 글

OPENSSL 사용  (0) 2008.08.14
Keytoo, openssl을 이용한 인증서 생성  (0) 2008.08.14
openssl 기본  (0) 2008.08.14
SSL 기초  (0) 2008.08.14
tomcat keystore 파일 설정 및 기타  (0) 2008.08.12
OpenSSL 설치  (0) 2008.08.11

댓글을 달아 주세요

posted by 동건이 2008. 8. 11. 16:25

OpenSSL

1.     OpenSSL 설치 설정

인증서와 키를 생성하고 관리하는 명령이 각각 openssl , keytool로 서로 다르기 때문에 OpenSSL JDK 를 함께 한 머신에 설치하면 쓰기 편하다.

참고로, 이 예제는 윈도우에서 작업하였으나 리눅스도 동일한 명령으로 작업할 수 있을 것으로 생각한다. 윈도우용 OpenSSL 바이너리 배포판은 많은 곳에서 구할 수 있다. 예제에서 사용한 OpenSSL 바이너리 배포판은 http://www.slproweb.com/products/Win32OpenSSL.html 에서 구했다.) 설치 후에 작업공간을 설정하기 위해 openssl.cnf 파일을 수정할 필요가 있다. 예제에서는 다음과 같이 변경했다.

dir          = ./demoCA          # Where everything is kept

. . .

#new_certs_dir = $dir/newcerts   # default place for new certs.

new_certs_dir = $dir                    # jihoon modified

. . .

#private_key = $dir/private/cakey.pem   # The private key

private_key  = ./private/cakey.pem      # jihoon modified

 

2.     작업 공간 설정

1) 작업 디렉토리를 정하고, 그 디렉토리 아래에다가 openssl.cnf 파일에 지정된 대로 demoCA 디렉토리와 private 디렉토리를 만든다.

2) demoCA 디렉토리 아래에는 index.txt 라는 이름의 빈 파일을 만든다.

3) 역시 마찬가지로 demoCA 디렉토리 아래에 serial 이라는 이름의 파일을 만든다. 이 파일에는 01 을 써둔다. (따옴표는 안 쓴다. ^^;;) 새로 인증서를 추가할 때마다 serial 파일에 번호가 증가하는 것을 볼 수 있다.

 

3.     Root CA (인증기관) 인증서 생성하기

가장 중요한 인증기관 인증서 만드는 부분이다.

 

C:\Programs\OpenSSL\bin\CA.pl –newcert

혹은

C:\Programs\OpenSSL\bin\openssl req -new -x509 -keyout private/cakey.pem -out demoCA/cacert.pem -days 3650

비번을 기억하라.

자체 서명 인증서가 만들어진다. 인증서는 cacert.pem 파일에 저장되고 개인키는 cakey.pem 에 저장된다. 인증기간을 10년 정도로 늘려잡기 위해 CA.pl 명령보다 openssl 명령을 쓰는 것이 더 낫다.

인증기관 인증서를 만들 때 잡다한 것을 입력해야 한다. 이 때, 입력하는 비밀번호는 인증기관 인증서로 새로운 하위 인증서들을 서명할 때마다 물어보기 때문에 반드시 기억해두어야 한다.

 

4.     자바 서버를 위한 KeyStore 만들기

 

서버를 위한 키저장소를 만든다.

C:\Programs\jdk\bin\keytool -genkey -alias server -keystore server.keystore

키 저장소 만들 때 비밀번호를 요구한다. 키저장소에 접근할 때마다 비밀번호를 요구하고 소스 코드에 들어가는 비밀번호 이므로 잘 기억해 둔다.

 

 

앞서 만든 CA (인증기관) 인증서를 키저장소에 넣는다.

C:\Programs\jdk\bin\keytool -import -alias ca -keystore server.keystore -file demoCA\cacert.pem

 

CSR 파일을 만든다. 이 과정은 잘 모르겠다. 어쨌든 이 과정들은 서버 키를 생성하고 인증기관 인증서로 서버 키를 서명하는 과정이다.

C:\Programs\jdk\bin\keytool -certreq -alias server -keystore server.keystore -file server.csr

 

C:\Programs\openssl\bin\openssl ca -in server.csr -out server.pem -keyfile private/cakey.pem -days 3650

Using configuration from C:\Programs\OpenSSL\bin\openssl.cnf

Loading 'screen' into random state - done

Enter pass phrase for private/cakey.pem:

Check that the request matches the signature

Signature ok

Certificate Details:

        Serial Number: 1 (0x1)

        Validity

            Not Before: Feb  7 05:28:33 2007 GMT

            Not After : Feb  4 05:28:33 2017 GMT

        Subject:

            countryName               = KR

            stateOrProvinceName       = Taejeon

            organizationName          = ETRI

            organizationalUnitName    = SOD Team

            commonName                = SOD

        X509v3 extensions:

            X509v3 Basic Constraints:

                CA:FALSE

            Netscape Comment:

                OpenSSL Generated Certificate

            X509v3 Subject Key Identifier:

                61:65:24:F8:F4:72:6A:F4:60:51:74:CC:9A:B6:7C:A5:1C:2C:5F:12

            X509v3 Authority Key Identifier:

                keyid:EC:34:A0:F6:48:F6:F2:73:E3:D9:42:83:6E:22:1B:3E:14:EE:FC:32

 

Certificate is to be certified until Feb  4 05:28:33 2017 GMT (3650 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

 

DER 파일을 만드는지 모르겠다. 어쨌든 서버 키를 서버 키 저장소에 넣기 위해 적절한 포맷으로 변환하는 과정인 것 같다. 서버 키를 키 저장소에 넣는다.

C:\Programs\openssl\bin\openssl x509 -in server.pem -out server.der -outform DER

C:\Programs\jdk\bin\keytool -import -alias echoer -keystore server.keystore -file server.der

 

5.     Client 요청 인증서 생성 서명

 

클라이언트를 위한 요청 인증서를 만드는 과정이다. Common Name IP 주소나 도메인 이름을 넣는 것에 주의하라. 일반적으로 웹사이트에서 사용할 인증서라면 해당 웹사이트의 도메인주소를 쓰고, 이메일에 사용할 인증서라면 이메일주소를 넣는다. 인증기간을 10년 정도로 늘려잡기 위해 CA.pl 명령보다 openssl 명령을 쓰는 것이 더 낫다. 

 

c:\programs\openssl\bin\openssl req -new -keyout newkey.pem -out newreq.pem -days 3650

Loading 'screen' into random state - done

Generating a 1024 bit RSA private key

...................++++++

..........++++++

writing new private key to 'newkey.pem'

Enter PEM pass phrase: # 비밀번호는 클라이언트 C 소스에서 쓴다.

Verifying - Enter PEM pass phrase:

-----

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [AU]:KR

State or Province Name (full name) [Some-State]:Taejeon

Locality Name (eg, city) []:Taejeon

Organization Name (eg, company) [Internet Widgits Pty Ltd]:ETRI

Organizational Unit Name (eg, section) []:SOD Team

Common Name (eg, YOUR name) []:SOD

Email Address []:

 

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:   #뭔지 몰라 그냥 넘어감

An optional company name []:

Request is in newreq.pem, private key is in newkey.pem

 

이렇게 하면 인증요청서 newreq.pem 파일과 개인키 newkey.pem 파일이 생성된다.

 

아래와 같이 인증요청서 newreq.pem 파일을 서명한다.

c:\programs\openssl\bin\openssl ca -policy policy_anything -out newcert.pem -infiles newreq.pem

 

6.     인증서 배포

client.pem 이라는 이름의 빈 텍스트 파일을 만든다.

newkey.pem PRIVATE KEY- 부분을 복사하여 client.pem 파일에 붙인다. 그 아래에

newcert.pem CERTIFICATE 부분을 복사하여 client.pem 파일에 붙인다.

client.pem 은 대략 아래와 같은 형태이다.

-----BEGIN RSA PRIVATE KEY-----

Proc-Type: 4,ENCRYPTED

DEK-Info: DES-EDE3-CBC,7F9D0116F7845BB6

 

MxUNQl3xyTsXS+NxiA51NAZtSENRT5y6A9mQcCrJQFspZSfBH3rquCHdWTxC7ch4

Ow3dCD4hvWSFh6/rtMPgQqK98/DcRg+nm4FKHveGymd7bH/qGiL0JQOy7c9I6Wdv

. . .

2Cp4xwwh8XWZMV6biO1P03T5dGj7aEMy1JqhNVe0XYPIch3SXDZFaAtpqyFDEOie

9jx/aDN284kOocBO8UoHB4fMVtg7crKDXxg7yrI8FhMp3aK7VhIULg==

-----END RSA PRIVATE KEY-----

-----BEGIN CERTIFICATE-----

MIICvzCCAiigAwIBAgIBCDANBgkqhkiG9w0BAQUFADBtMQswCQYDVQQGEwJLUjEQ

MA4GA1UECBMHVGFlamVvbjEQMA4GA1UEBxMHVGFlamVvbjENMAsGA1UEChMERVRS

. . .

jYSNWqxCWIZl6AkJOF/kRGZJaRkvcfVjbixxZ95MDZhCEtj6CiQQP5TIYuX5mmI0

4Z/xyt5S7n/Eda0MHqt1om47IhwZZNTORSVsFBTIstOtNFM=

-----END CERTIFICATE-----

 

 

앞서 만든 client.pem 파일과 인증기관 인증서 (demoCA/cacert.pem)를 클라이언트에 복사하여 사용한다.

서버에는 키저장소 파일(server.keystore)만 있으면 된다.

 

 

 

7.     참고 사이트

http://wiki.kldp.org/wiki.php/DocbookSgml/SSL-Certificates-HOWTO

http://www.yorku.ca/dkha/docs/jsse_cert/jsse_cert.htm

http://www.linuxjournal.com/article/4822 

'개발 > 외부 참조 글' 카테고리의 다른 글

JNI  (0) 2008.08.11
자바 리플렉션  (1) 2008.08.11
OpenSSL  (0) 2008.08.11
GC 튜닝에 대한 의견들  (0) 2008.02.20
JVM 메모리 관리  (0) 2008.02.20
JVM GC와 메모리 설정  (0) 2008.02.20

댓글을 달아 주세요