[클러스터] OpenSSL(SSLeay) Simple CA Usage
OpenSSL(SSLeay) Simple CA Usage
작성자: 김상완(sangwan@kisti.re.kr)
날짜: 2002-04-09
이 문서는 OpenSSL (또는 SSLeay) 패키지에 들어 있는 인증서 발급 및 관리 기능을
사용하는 방법을 설명한다.
목차
1. 최초의 CA를 만들기
2. CA인증서를 globus 인증서 디렉토리에 추가하기
3. 인증요청서에 서명하기
OpenSSL은 Eric Young 이라는 사람이 만든 SSLeay 라이브러리를 공개소스화 한
것으로써, 그 기능이나 구성에서 SSLeay와 거의 차이점이 없다.
2002년 4월 현재 OpenSSL 최신버젼은 0.9.6이다.
OpenSSL(SSLeay)은 SSL(Secure Socket Layer)을 사용하는데 필요한 기능을
구현해 놓은 라이브러리이면서 동시에 그 라이브러리의 기능을 이용할 수 있는
컴맨드라인 명령어를 제공한다. OpenSSL의 컴맨드라인 명령어의 이름은 openssl이고,
SSLeay의 경우는 ssleay이다. 이 문서에서는 편의상 OpenSSL 로 통일하여
사용하도록 한다.
OpenSSL을 일반적인 소스 컴파일 과정에 의해 설치하면, 설치 디렉토리아래에
CA.sh 라는 스크립트가 존재하는데, 이것은 가장 간단한 CA(Certificate Authority)
의 기능을 수행할 수 있도록 해 주는 간단한 쉘 스크립트이다.
스크립트 내에서 openssl의 여러 가지 기능이 호출되어 사용된다.
따라서, openssl이 현재 쉘의 PATH 환경변수에 등록이 되어 있어야 한다.
1. 최초의 CA를 만들기 [[목차]]
CA 기능을 사용하기 위해서는 최상위 CA를 만들어야 한다.
임의의 작업 디렉토리로 이동한다.
# cd /path/to/any_temporatory_directory
또는 홈디렉토리에 CA라는 디렉토리를 만들어 사용한다.
# cd ~ ; mkdir CA ; cd CA
설치 디렉토리의 openssl.cnf 화일이 환경 설정을 위한 목적으로 사용된다.
인증서 Subject 의 DN(Distinguished Name)을 정의 하는 부분도 포함되어 있다.
# vi /usr/local/openssl/lib/openssl.cnf
새로운 CA를 만들려면 CA.sh 스크립트를 -newca 옵션을 주어 실행한다.
# sh /usr/local/ssl/bin/CA.sh -newca
CA certificate filename (or enter to create)
;(Press Enter to use default value)
Making CA certificate …
; openssl is called here as follow from CA.sh
; openssl req -new -x509 -keyout ./demoCA/private/./cakey.pem \\
; -out ./demoCA/./cacert.pem -days 365
Using configuration from /usr/local/ssl/lib/ssleay.cnf
Generating a 1024 bit RSA private key
……..++++++
………………….++++++
writing new private key to ‘./demoCA/private/./cakey.pem’
Enter PEM pass phrase: ; CA 비밀번호
Verifying password – Enter PEM pass phrase: ; CA 비밀번호
—–
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.
—– ; CA’s Information
Country Name (2 letter code) [AU]:KR
State or Province Name (full name) [Some-State]:STATE ;(null in Globus, enter ‘.’)
Locality Name (eg, city) []:LOC_NAME ;(null in Globus, enter ‘.’)
Organization Name (eg, company) [Internet Widgits Pty Ltd]:ORG_NAME ;(Globus)
Organizational Unit Name (eg, section) []:OU ;(null in Globus, enter ‘.’)
Common Name (eg, YOUR name) []:CA_NAME ;(enter the CA’s name)
Email Address []:WHO@WHERE ;(null in Globus, enter ‘.’)
#
openssl.cnf 화일에서 [req_distinguished_name] 부분에
DN을 구성할 정보들에 대한 설정을 할 수 있다. 프롬프트, 기본값, 최소, 최대값등으
설정할 수 있다. 자세한 것은 openssl.cnf 화일을 참조하기 바람.
이상 실행결과 CA의 키와 인증서가 생성된다.
현재 디렉토리에 demoCA라는 디렉토리가 만들어지고, 이 디렉토리 아래에
화일이 생성되어 있을 것이다.
CA의 키화일은 demoCA/private/cakey.pem이고, CA의 인증서 화일은
demoCA/cacert.pem 이다. CA의 키 화일은 다른 사람이 볼 수 없도록
위 과정에서 입력한 비밀번호로 암호화 되어 있는데, cakey.pem 화일에서
—–BEGIN RSA PRIVATE KEY—–
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,0F72CE690870F16D
부분이 키를 암호화 하는데 사용된 암호화 알고리즘에 대한 정보를 나타낸다.
CA.sh -newca 명령은 내부적으로 다음과 같은 openssl 명령이 호출되어 수행되는데,
# openssl req -new -x509 -keyout ./demoCA/private/cakey.pem \\
-out ./demoCA/cacert.pem -days 365
openssl은 컴맨드라인 명령어이고, ‘req’는 X.509 형식의 인증
요청서(Certificate Signing Request)를 관리하기 위한 openssl의 내부 명령어이다.
CA 인증서는 CA 자기 자신의 인증요청서에 자신이 스스로 서명한 것이다.
CA 인증서의 내용을 확인하려면, openssl x509 명령을 이용한다.
-in 옵션 다음에 인증서화일의 화일명을 써 주면 된다.
다음에서 확인할 수 있듯이 Issuer와 Subject가 동일함을 알 수 있다.
# ssleay x509 -in demoCA/cacert.pem -text
Certificate:
Data:
Version: 1 (0x0)
Serial Number: 0 (0x0)
Signature Algorithm: md5WithRSAEncryption
Issuer: C=KR, ST=STATE, L=LOC_NAME, O=ORG_NAME, OU=OU, CN=CA_NAME/Email=
WHO@WHERE
Validity
Not Before: Feb 1 09:51:55 2002 GMT
Not After : Feb 1 09:51:55 2003 GMT
Subject: C=KR, ST=STATE, L=LOC_NAME, O=ORG_NAME, OU=OU, CN=CA_NAME/Email
=WHO@WHERE
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:d4:6d:06:e6:c8:35:04:45:b1:97:c3:23:98:21:
…
28:5c:b2:e6:27:89:5b:11:a3
Exponent: 65537 (0x10001)
Signature Algorithm: md5WithRSAEncryption
70:d4:29:d8:45:e2:7c:ac:61:46:2c:37:41:08:a1:64:ab:96:
…
—–BEGIN CERTIFICATE—–
…
—–END CERTIFICATE—–
#
2. CA인증서를 globus 인증서 디렉토리에 추가하기 [[목차]]
CA인증서를 globus에 추가시키는 방법은 globus.org 의 다음 링크에
설명이 자세히 나와있으니 참조하기 바람.
http://www.globus.org/Security/v1.1/adding_trusted_ca.html
CA의 인증서는 CA의 공개키에 대한 정보를 포함하고 있으며, 아무에게나
공개될 수 있는 정보이다. demoCA 디렉토리아래의 cacert.pem 화일이
CA의 인증서 화일이다. 만일 자체적으로 CA를 운영한다면 이 화일을
여러 사람이 볼 수 있는 공개된 장소에 두어야 한다. 자체적으로 CA를 운영하지는
않지만, 다른 CA를 globus에 설치하려고 하는 경우는 CA로 부터 CA자신의 인증서를
얻어 와야 한다. 이렇게 얻어온 CA의 인증서를 cacert.pem 이라는 화일로 저장하자.
먼저 cacert.pem 화일의 해쉬(hash)값을 얻는다.
# ssleay x509 -in demoCA/cacert.pem -hash -noout
4305cfde ; 이것이 해쉬 값이다.
cacert.pem 화일을 /etc/globus/share/certificates/hash_value.0 화일로 복사한다.
/opt/globus 는 globus deploy 경로이다.
# cp cacert.pem /opt/globus/share/certificates/(hash_value).0
다음 ca-signing-policy.conf 화일을 편집한다.
# vi /opt/globus/share/certificates/ca-signing-policy.conf
#————————————————————————
# token type | def.authority | value
#————–|—————|—————————————–
# EACL entry #1|
access_id_CA X509 ‘/C=US/O=Globus/CN=Globus Certification Authority’
pos_rights globus CA:sign
cond_subjects globus ‘”/C=US/O=Globus/*” “/O=Grid/O=Globus/*”‘
# EACL entry #2|
access_id_CA X509 ‘/C=KR/O=Globus/CN=KISTI Supercomputing Center CA’
pos_rights globus CA:sign
cond_subjects globus ‘”/C=KR/O=Globus/*” “/O=Grid/O=Globus/*”‘
# end of EACL
위에서 새로 추가된 부분이 강조되어 표시되었다. 그리고 밑줄친 부분은
방금 가져온 CA인증서의 Subject에 해당된다. 인증서의 Subject 명을 확인하려면
다음 명령을 사용한다.
# openssl x509 -in hash_value.0 -text -noout
위의 강조된 부분에서 세번째 cond_subjects 로 시작하는 줄은 이 CA가 서명
할 수 있는 Subject들을 나타낸다. ‘/C=KR/O=Globus/’ 또는 ‘/O=Grid/O=Globus/’로
시작되는 모든(*, 와일드 카드 문자) Subject에 대해서 ‘/C=KR/O=Globus/CN=KISTI
Supercomputing Center CA’ 라는 CA가 서명할 수 있음을 나타낸다. 만일 이 조건을
만족하지 않는 Subject를 가진 인증서에 이 CA가 발행(또는 서명)한 것으로 표시되어
있다면, 위의 규칙을 위반한 것이므로, 정상적인 인증서로 취급되지 않는다.
3. 인증요청서에 서명하기 [[목차]]
단계 1에서 demoCA 디렉토리가 있는 곳으로 이동한다.
# cd /path/to/any_temporatory_directory
인증 요청서 부분을 newreq.pem 이라는 화일로 저장한다.
# more newreq.pem
—–BEGIN CERTIFICATE REQUEST—–
MIIBhzCB8QIBADBIMQ0wCwYDVQQKEwRHcmlkMQ8wDQYDVQQKEwZHbG9idXMxFTAT
BgNVBAsTDGhwY25ldC5uZS5rcjEPMA0GA1UEAxMGTXlVc2VyMIGfMA0GCSqGSIb3
…(중략)…
OXwjpooNitFPcg2o1TG7PHaJpy0fMmVe4m5gWhmH+fXIaBa2F2sqo5Drlw7voL/5
hLYPAWps6pwek9E=
—–END CERTIFICATE REQUEST—–
CA.sh 에 -sign 옵션을 주어 실행한다.
# sh /usr/local/ssl/bin/CA.sh -sign
Using configuration from /usr/local/ssl/lib/ssleay.cnf
Enter PEM pass phrase:
Check that the request matches the signature
Signature ok
The Subjects Distinguished Name is as follows
organizationName :PRINTABLE:’Grid’
organizationName :PRINTABLE:’Globus’
commonName :PRINTABLE:’cluster.hpcnet.ne.kr’
Certificate is to be certified until Sep 24 11:09:03 2002 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
issuer :/C=KR/O=Globus/CN=My Certificate Authority
subject:/O=Grid/O=Globus/CN=cluster.hpcnet.ne.kr
…
—–BEGIN CERTIFICATE—–
MIICXzCCAcigAwIBAgIBATANBgkqhkiG9w0BAQQFADBBMQswCQYDVQQGEwJLUjEP
…
ziZoNMbnBCl78hEo4Ph3VNoLPXosYIa9a6dv6+6ihgs9YYc=
—–END CERTIFICATE—–
위에서 출력되는 것은 다음과 같다.
환경설정으로 이용되는 화일이 어떤 것인지 출력된다.
서명할 인증 요청서의 Subject 내용이 표시된다.
CA를 생설할 때 입력하였던 암호를 입력하고 서명하겠느냐고 물어보는 질문에
yes를 해주면, 인증요청서에 대한 인증서가 만들어 진다. 만들어진 인증서는
현재 디렉토리의 newcert.pem이라는 화일로 저장된다. 만일 newcert.pem 이라는
화일이 이미 존재 한다면 내용을 덮어쓰게 된다.
자체적으로 CA를 운영하는 경우에는 이 인증서를 인증을 요청한 사람에게
전달하여 주면 된다.