다음 이전 차례

5. Client의 인증

인증을 받기위해서는 DN(Distinguished Name)을 포함하고 있는 인증요구서(CSR)를 생성하여 CA에 송신해야 한다. DN은 개인이나, 기관, 서버등을 구분하기위한 것으로 이름, 부서, 직장, 주소, 나라등의 필드로 이루어져 있고, CN, OU, O, L, ST, C등의 필드로 표현된다. 인증을 받기위한 Client들의 인증요구서(CSR)화일이 각각 다른형태로 생성이 되고, Client들이 인증서를 수령하는 방법이 제각기 다름으로 Client별로 각각의 사용방법을 설명한다.

Client들이 자신의 인증서를 수령할 때나, 다른사람이 사인한 코드를 실행할 때에는 rootCA의 인증서가 미리 설치되어 있어야 한다. 따라서 앞에서 생성한 rootCA의 Certificate를 미리 수신해서 설치해야 한다. Netscape와 MS Explorer는 application/x-x509-ca-cert MIME을 이용해서 서버에서 서비스하는곳에 접속하면 설치할수 있고, JAVA의 SDK인 경우에는 미리 다운로드 한다음 "keytool -import"명령을 이용해서 설치해야 한다. 또한 다음의 Netscape나 MS Interne Explorer에서 인증요구서(Certificate Signing Request:CSR)을 생성할 때에는 개인의 정보가 Network을 이용하여 전송됨으로 반드시 https 프로토콜을 이용하도록 한다.

5.1 Netscape 사용자인증

Netscape에서는 CSR화일을 위해서 SPKAC형태의 자료를 생성한다. CSR화일을 생성하기 위해서는 Web Server에서 KEYGEN TAG를 사용한 Form을 생성하여야 한다. 다음은 KEYGEN TAG를 사용한 FORM의 예이다.


<FORM name="CSR_request" method="post" action="user_cert.cgi"> 
<table border=1>
<tr><td> 성명   </td><td><input name="CN" type=input></td>
<tr><td> E-mail </td><td><input name="Email" type=input></td>
<tr><td> 부서   </td><td><input name="OU" type=input></td>
<tr><td> 회사   </td><td><input name="O" type=input></td>
<tr><td> 시     </td><td><input name="L" type=input></td>
<tr><td> 도     </td><td><input name="ST" type=input></td>
<tr><td> 국가   </td><td><input name="C" type=input></td>
<tr><td> 키생성 </td><td><keygen name="SPKAC" type="RSA"></td>
</table>
</FORM>

KEYGEN TAG의 기본문법은 다음과 같다.

<KEYGEN NAME="name" CHALENGE="challenge string" KEYTYPE="type" PQG="pqg-params" >

NAME항목은 필수이고(cgi에서 처리하여야 함) KEYTYPE은 RSA와 DSA중에 하나를 선택할수 있다. PQG는 DSA에서만 사용한다. keygen tag는 form tag안에서만 유효하며, 특정한 길이의 key크기를 선택할 수 있다. 미국내에서는 512, 768, 1024비트의 키를 사용할 수 있고, 그외 국가에서는 512비트의 키를 사용할 수 있다. Form을 전송하면 512비트의 보안도를 가지는 Key Pair가 생성되면 비밀키는 로컬DB에 암호화 되어서 저장되고 공개키와 challenge스트링은 DER encode되고 비밀키로 sign된다음 base64로 encode되고 서버로 전송된다. 서버측에서는 DN과 SPKAC스트링을 cgi를 이용하여 화일로 만들고 다음과 같은 명령을 이용하여 Sign한다. (이때 SPKAC스트링은 1줄로 되어 있어야 한다.)

openssl ca -spkac 생성한화일 -out 인증서.crt

생성된 인증서는 application/x-x509-user-cert의 MIME형태로 Netscape Browser로 전송하여 import할수 있도록 한다. 이때 Netscape의 로컬DB에 인증서에 해당하는 비밀키가 존재하지 않으면 import할수 없다.

5.2 MS Internet Explorer 사용자인증

MS Internet Explorer는 PKCS#10형태의 인증요구서를 발행하며, PKCS#7형태의 인증서를 수령할수 있다. 따라서 Server측 입장에서 볼때에는 약간 귀찮은 작업을 하나더 해줘야 한다. 그리고 Explorer에서는 Netscape처럼 KEYGEN TAG를 사용하지 않고 Microsoft에서 정의한 CryptoAPI(CAPI)를 이용한다.(좀더 유연하다고 하는데...정말일까요?..^^;) CAPI는 기본적인 암호화 작업을 위한 함수를 제공한다.(키 생성, 자료의 암호화, 문서의 서명, 인증서의 요구등)

CAPI는 다음의 4단계를 이용하여 인증요구서를 발행하고 인증서를 수령한다.

  1. CAPI함수가 당신을 위한 Key Pair를 생성하고 인증서 창고에 저장한다.
  2. DN(Distinguished Name)을 생성한다.(?)
  3. CA로 전송을 하기위한 PKCS#10형태의 자료를 생성한다.
  4. CA에서 인증한 자료를 인증서 창고에 저장한다.
Explorer의 인증서는 "HKEY_CURRENT_USER/Software/Microsoft/Cryptography/"에 저장된다. CAPI함수는 OBJECT TAG를 이용하여 로컬디스크에 있는 DLL을 읽어들인후에 사용 할 수 있다. 다음은 CAPI를 위한 xenroll.dll을 읽어들이는 예이다. (예전에는 certenr3.dll이라는 화일에서 지원했었는데 지금은 사용되지 않고 있고, 사용했을경우에 OpenSSL에서 사인방법이 틀려진다.)


<OBJECT classid="clsid:43F8F289-7A20-11D0-8F06-00C04FC295E1"
           codebase="xenroll.dll"
           id=Enroll>
</OBJECT>

정상적으로 xenroll.dll이 불려졌으면 DN스트링을 만들고 xenroll의 createPKCS10함수를 불러서 PKCS#10형태의 인증 요구서를 만든다. DN스트링의 문자열의 구성과 createPKCS10함수콜은 다음과 같이 한다.

$szStr="CN=SeungSu KUK; C=KR; ST=KyungBook; L=Kyungsan; O=Catholic University of DAEGU; OU=Computer Center";

$result=Enroll.createPKCS10(szStr, "1.3.6.1.4.1.311.2.1.21");

생성된 $result에는 PKCS#10형태의 문자열이 들어 있고 이것을 CA로 전송한다. CA측에서는 이것에 사인하고 PKCS#7의 형태로 인증서를 돌려준다.

OpenSSL에서는 다음과 같은 방법을 이용하여 사인하고 인증서를 생성한다. 먼저 $result에서 들어오는 자료에는 "BEGIN CERTIFICATE REQUEST"라는 문자열이 없는 상태임으로 $result를 이용하여 다음과 같은 형태의 화일을 생성한다.

-----BEGIN CERTIFICATE REQUEST-----

$result에서 ^M을 삭제한 내용

-----END CERTIFICATE REQUEST-----

생성된 화일은 다음과 같이 사인하고 PKCS#7형태의 화일을 생성한다.

openssl ca -in 생성된화일 -out cert결과화일

openssl crl2pkcs7 -certfile cert결과화일 -in /path/to/crl.pem -out pkcs7화일

(crl.pem화일은 미리 생성되어 있어야 하는데 "openssl ca -gencrl"명령을 이용하여 생성한다.) pkcs7화일을 Explorer로 전송할 때에는 "BEGIN PKCS7"와 "END PKCS7"이라는 문자열(첫줄과 끝줄)을 지운상태로 전송해야 한다. (않그러면 에러가 발생한다.) 전송된 PKCS7화일(VBScript나 JavaScript의 변수로 전송)은 AcceptPKCS7함수에 의해서 import되며 다음과 같이 한다.

$szStr="전송된 PKCS7화일의 내용"

$result=Enroll.AcceptPKCS7(szStr);

5.3 JDK2 사용자인증

(여기는 1년전의 내용입니다..-.- 따라서 간단한 개념만 적어보겠습니다. 그리고 빠른시간내에 전제적인 내용을 정리하겠습니다.)

JDK2에서는 applet이나 javascript등을 사인하기 위해서 인증서를 사용한다. 비밀키와 공개키의 생성은 keytool을 통해서 이루어지며 keytool을 통하여 import/export기능을 수행한다. keytool을 이용한 공개키/비밀키의 생성은 다음과 같이 한다.

keytool -genkey -alias 사용자명 -keypass 해당키의비밀번호

keytool에서 "-genkey"를 이용하면 Distinguished-Name을 요구하고 시험용으로 사용하는 Self-Signed Certificate를 생성한다. 이것은 나중에 "import"에의해 CA에서 인증한 키로 대체된다. keytool에서 사용할수 있는 옵션은 다음과 같다.

인증요구서를 만들기 위해서는 "-certreq"를 사용한다. (이때 genkey에서 입력한 비밀번호를 넣어야 한다.)

keytool -certreq -keystore keystore이름 -alias 사용자명 -file CSR화일명

생성된 CSR화일은 CA에서 인증하고 "-import"를 이용해서 keystore에 저장한다.

keytool -import -alias 사용자명 -file CERT화일명 -keystore keystore명

내용을 확인하고 싶으면 keytool -printcert -file CERT화일명이렇게 입력한다.

OpenSSL에서 J2sdk에서 요구한 인증서를 처리할 때에는 다음과 같이하여 인증서를 생성하고 E-mail등을 이용하여 돌려주면 된다.

openssl ca -in certreq화일 -out 결과cert화일


다음 이전 차례