글 싣는 순서
1. CTL Client 개요 및 설치
2. CTL Client 설정하기
3. 전화기를 보안모드로 설정하기
4. 외부 CA 서버에서 CUCM 인증서 받기
5. 외부 CA 서버에서 IP Phone 인증서 받기
6. 외부 CA 서버에서 CUBE 인증서 받기
7. CUCM과 CUBE간 TLS 연동
이 번 글에서는 CUBE에 인증서를 주입하는 과정을 설명드리고, 다음 장에서 CUCM과 CUBE간에 SRTP를 사용할 수 있도록 하겠습니다. "Cisco Secure IP Telephony 길라잡이" 연재를 정독해 오신 분들은 5장 "외부 CA서버에서 IP Phone 인증서 받기"이 빠진 것을 아실 것입니다. 우선은 CUBE를 먼저 정리하겠습니다.
이글은 IOS기반의 라우터 및 CUBE를 다루다보니 기술적인 내용이 많습니다. 내용의 이해를 위해 "Cisco Secure IP Telephony의 이해 - (4) PKI의 이해"를 먼저 참조하시고 이글을 따라하길 권합니다. CUCM이나 전화기 부분은 PKI를 몰라도 웹기반이라 따라하기로도 충분하지만, CUBE는 기본 지식이 없으면 명령어를 이해하는 데 좀 무리가 있을 것으로 판단됩니다.
TLS및 SRTP를 위한 CUBE 라이센스
CUBE에서 TLS 및 SRTP를 사용하기 위한 Technology Package는 Security와 UC 입니다. 쉽게 범하는 오류가 Securiry Technology Package를 구매하지 않는 경우입니다.
아래는 Show Version으로 본 라이센스 정보입니다.
Technology Package License Information for Module:'c2900'
-----------------------------------------------------------------
Technology Technology-package Technology-package
Current Type Next reboot
------------------------------------------------------------------
ipbase ipbasek9 Permanent ipbasek9
security securityk9 RightToUse securityk9
uc uck9 Permanent uck9
data None None None
외부 인증서 주입 순서
외부 CA 서버를 통한 인증서를 주입하기 위해서는 키를 생성한 후에 CSR을 생성하여 CA에 전송합니다. CA로부터 인증서 및 인증서 체인을 수령하여 장비 또는 기기에 주입합니다. 이러한 일반적인 과정외에 IOS 기반의 라우터는 트러스트포인트(Trustpoint)를 생성하는 과정이 추가됩니다. 일련의 과정을 이해해야지만 전체 흐름을 이해할 수 있을 것입니다.
키생성
트러스트포인트(Trustpoint) 생성
- 생성된 키를 연동
- subject-name 설정 및 세부 항목 결정
- CSR 생성
외부 CA로 CSR 전송 및 인증서와 인증서 체인 (Certificate Chain)획득
RootCA를 위한 트러스트포인트 추가 생성하여 RootCA 인증서 주입
처음 생성한 트러스트포인트에 SubCA 인증서 주입
처음 생성한 트러스트포인트에 CUBE의 인증서 주입
지금까지는 CUCM은 웹기반으로 되어 있지만, CUBE나 일반 라우터는 CLI로 관리합니다. CLI는 익숙해지면 편리하지만, 익숙하지 않으면 불편하다는 단점이 있습니다. 인증서 주입 및 삭제는 CCP라는 웹기반의 라우터 관리 프로그램을 이용할 수 있지만, 여기에서는 CLI로 설명합니다.
키생성
인증서를 CA로 부터 수신하기 위해서는 라우터에서 키를 먼저 생성해야 합니다.
호스트 네임과 도메인 네임 설정
키를 생성 시에 포함되는 정보는 호스트 네임과 도메인 네임입니다. CUBE에서 CSR을 추출하기 전에 먼저 설정해야 합니다.
router(config)#hostname VG_yohur
VG_yohur(config)#ip domain-name cisco.com
- 시간 설정
다음으로 모든 인증서는 유효기간이 명시되어 있습니다. 기기 인증서는 주로 3년 또는 5년단위로 사용하므로 CA 서버와 장비들이 시간을 맞추는 것을 권고합니다. 시간을 직접 세팅하거나 NTP를 사용할 수 있습니다. - 키 생성
지금부터 CUBE를 위한 키를 생성하도록 하겠습니다. 이과정을 통해 CUBE를 위한키를 생성합니다.
VG_yohur(config)#crypto key generate rsa modulus 1024 label sip-trunk-key exportable
The name for the keys will be: sip-trunk-key
% The key modulus size is 1024 bits
% Generating 1024 bit RSA keys, keys will be exportable...
[OK] (elapsed time was 1 seconds)
상대적으로 매우 짧은 시간에 키가 생성됩니다. crypto key generate rsa 명령어에 포함되어있는 몇 가지 옵션에 대해 살펴보겠습니다.
- exportable / non-exportable : 생성된 키쌍을 라우터 내에만 둘지 외부로 추출할지를 결정합니다. 일반적으로 백업 용도로 추출하기도 하지만, 보안의 위험성을 증가시킵니다.
- label : 생성된 키쌍의 이름을 설정합니다. 즉, 다양한 목적으로 여러개의 키를 동시에 생성할 수 있습니다.
- modulus : 키의 길이를 결정합니다. 일반적으로 1024 또는 2048 bits를 사용합니다. (최대 4096bits)
CUBE에서 키를 생성했습니다. CUBE의 RSA Keypair (키쌍)은 생성하지 않고 외부에서 생성하여 추가할 수 있습니다만, 여기에서는 자체적으로 생성했습니다. 필자는 PKCS#10이 가장 안전하다고 생각힙니다.
Trustpoint(트러스트포인트) 생성
시스코 IOS는 Trustpoint라는 개념을 사용합니다. Trustpoint는 CA, 인증서, CRL 등과 같은 모든 암호화 관련 정보를 가집니다. 하나의 라우터에 다수의 CA가 연계되어 있다면, 다수의 Trustpoint가 생성되어야 합니다.
트러스트포인트를 생성하기 위해서는 crypto pki trustpoint 명령어를 사용하며, sip-trunk-cert는 일반적으로 CA 서버의 이름을 사용합니다.
VG_yohur(config)#crypto pki trustpoint sip-trunk-cert
VG_yohur(ca-trustpoint)#enrollment terminal
VG_yohur(ca-trustpoint)#serial-number none
VG_yohur(ca-trustpoint)#fqdn none
VG_yohur(ca-trustpoint)#ip-address none
VG_yohur(ca-trustpoint)#revocation-check none
VG_yohur(ca-trustpoint)#rsakeypair sip-trunk-key
VG_yohur(ca-trustpoint)#subject-name cn=VG_yohur,ou=test,o=cisco,l=seoul,st=seoul,c=kr
VG_yohur(ca-trustpoint)#exit
위에서 Crypto pki trustpoint에 사용된 명령어의 의미에 대해 간단하게 살펴보겠습니다.
- Enrollment
CSR 및 인증서를 교환하기 위한 방법을 선택합니다.
- terminal (offline) : CLI를 이용하여 PEM으로 엔코딩된 CSR과 인증서를 Copy and Paste로 함
- url (online) : SCEP 프로토콜을 이용하여 등록함
- selfsigned(no CA) : 별도의 CA가 없을 경우에도 PKI를 이용할 경우
- 인증서 생성에 불필요한 값을 제거
- serial-number none : Serial-number를 추가하지 않음
- fqdn none : 도메인 네임을 추가하지 않음
- ip-address none : 장비의 IP 주소를 추가하지 않음
- revocation-check none : 인증서의 유효성 검증을 하지 않음
- Subject-name 생성
Subject-name은 기기의 상세 내역입니다. 세부 항목은 아래와 같으며, 모든 항목을 사용할 필요는 없지만, CN은 반드시 사용해야 합니다.
- CN (Common name) : 기기의 호스트네임이나 사용자 이름
- OU (Organizational unit) : 부서 또는 조직명
- O (Orranization) : 회사명
- L (locality) : 도시명
- ST (State) : 주 또는 도명
- C (Country) : 국가명
- RSA 키 연동
만일 rsakeypair 명령으로 키를 연동하지 않으면, 이때에 자동으로 키를 새롭게 생성하므로 위에 생성한 키를 사용할 수 없습니다.
여기서 언급된 SCEP 프로토콜은 Simple Certificate Enrollment Protocol의 약자로써, 기기 인증서를 자동으로 송수신하기 위한 프로토콜입니다. CUCM은 4.x 버전은 지원하였으나, CUCM 5.x 이후 버전은 지원하지 않습니다만, 시스코의 IOS에서는 지원하는 기능입니다.
Revocation-check는 향후에 다시 다루겠지만, CRL을 이용한 방법과 OCSP를 이용한 방법 두가지가 있습니다. OCSP는 On-line Certificate Status Protocol로 유효성을 검증하는 프로토콜입니다. 시스코의 CUCM 및 모든 IOS 기반의 제품들이 지원합니다.
CSR 추출
CSR은 Certificate Signing Request를 의미하며, 외부 CA로 부터 인증을 받기 위한 것입니다.
- CSR 템플릿 만들기
라우터는 CSR을 PEM 포맷으로 생성하지만, PEM 포맷의 시작과 마지막 문자열을 생성하지 않으므로 직접 만들어야 합니다. 노트패드(Notepad)를 열고, 아래의 내용을 복사합니다.
-----BEGIN CERTIFICATE REQUEST-----
-----END CERTIFICATE REQUEST----- - CSR 생성
이제 아래 명령어를 이용하여 트러스트포인트에 연동된 RSA 키에 대한 CSR을 터미널로 표시합니다.
VG_yohur(config)#crypto pki enroll sip-trunk-cert
% Start certificate enrollment ..
% The subject name in the certificate will include: cn=VG_yohur.cisco.com,ou=test,o=cisco,l=seoul,st=seoul,c=kr
% The fully-qualified domain name will not be included in the certificate
Display Certificate Request to terminal? [yes/no]: yes
Certificate Request follows:
MIIByjCCATMCAQAwaTELMAkGA1UEBhMCa3IxDjAMBgNVBAgTBXNlb3VsMQ4wDAYD
VQQHEwVzZW91bDEOMAwGA1UEChMFY2lzY28xDTALBgNVBAsTBHRlc3QxGzAZBgNV
BAMMElZHX3lvaHVyLmNpc2NvLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
gYEAqY81eFQ3yAZuhLi0bMFCp0W1m7+i4P7euXk7+i1b+4zMib3Y3t4LSjaCBNux
n8vb2WdtBZ+u5pg4tNVCgX0NbRmK77PoLCeQzM1vZwbDaIJvkuT89auwJZJ6BlY7
mRYgDn8CFypFLEBx9GYNkh3iowrkZar+W4RmxJlV7HqLpIECAwEAAaAhMB8GCSqG
SIb3DQEJDjESMBAwDgYDVR0PAQH/BAQDAgWgMA0GCSqGSIb3DQEBBQUAA4GBABrY
e+woq0WcrdNeVdObn88PZxI5wGNrlMSX6/DHXiYgd2dFSoHb8LS8om2t8PAABVIJ
xNQS9rUGASg8GEDgyBNHqo7GIdjnqJ8xSebM58zgc3pkELW4kN61ATjnxTW3LUKh
A5QUFG+Fe9WfTkvG5nYmiBXwe1JpmDvjUAOFthU2
---End - This line not part of the certificate request---
Redisplay enrollment request? [yes/no]: no - CSR 템플릿으로 복사
위에서 Certificate Request follows: 이하의 난수열을 카피하여 노트패드(notepad)로 만든 CSR 템플릿에 복사합니다. 복사할때는 스페이스(빈 공간)가 들어가지 않도록 조심합니다. CSR이 터미날에 표시되는 것은 트러스터포인트를 생성할 때 Enrollment(등록) 방식을 터미날로 결정하였기 때문입니다. 아래 그림은 실제 Copy-and-paste로 만든 CSR입니다.
저장할때는 .CSR이라는 확장자를 반드시 붙여주어야 합니다. 위의 그림에서 .txt로 되어 있는 것은 텍스트파일로 보기위해 확장자를 잠깐 변경한 것입니다.
외부 CA로 부터 인증서 받은 후 포맷 변경
CSR을 생성하여 CA로 보내 Certificate(인증서)와 인증서 체인을 수령합니다. 인증서 체인과 인증서가 DER 포맷일 경우 IOS 라우터는 PEM 포맷을 받아들이므로 변경해야 합니다. 저는 Mac Book 터미널을 이용하여 변경하였습니다.
포맷 변경을 위한 명령어는 다음과 같으며, 변경하고자 하는 파일은 rootcert.der 입니다.
"openssl x509 -in rootcert.der -inform DER -out rootcert.pem -outform PEM"
아래 그림은 DER 포맷 파일을 PEM 포맷으로 변경한 파일로 TXT 확장자를 붙인것은 Notepad에서 읽어들이기 위해서 입니다.
만일 openssl x509 명령어가 동작하지 않는다면, CUCM의 OS Admin 페이지에서 직접 PEM 파일을 다운로드 받는 것도 방법입니다. 일반적으로 한 기업의 PKI 시스템은 동일한 CA 서버를 사용하기 때문입니다. 파일을 다운로드 받는 방법은 다음장에서 설명될 예정입니다.
루트 CA를 위한 트러스트포인트 생성 및 인증서 주입
RootCA를 위한 rootca-01이라는 트러스트포인트를 생성하고, RootCA 인증서를 주입합니다.
- 트러스트포인트 생성
RootCA를 위해 rootca-01이라는 트러스트포인트를 생성합니다.
VG_yohur(config)#crypto pki trustpoint rootca-01
VG_yohur(ca-trustpoint)#enrollment terminal
VG_yohur(ca-trustpoint)#revocation-check none
VG_yohur(ca-trustpoint)#exit - 루트 인증서를 rootca-01 트러스트포인트에 주입
다음으로 rootca-01에 루트인증서를 주입또는 인증하겠습니다. CSR 추출시에는 PEM 파일의 처음과 마지막 문자열이 없었지만, 주입할 때는 파일의 전체 내용을 복사합니다.
VG_yohur(config)#crypto pki authenticate rootca-01
Enter the base 64 encoded CA certificate.
End with a blank line or the word "quit" on a line by itself
-----BEGIN CERTIFICATE-----
MIIDfTCCAmWgAwIBAgIBATANBgkqhkiG9w0BAQsFADBoMQswCQYDVQQGEwJLUjEN
MAsGA1UECgwES0lTQTEuMCwGA1UECwwlS29yZWEgQ2VydGlmaWNhdGlvbiBBdXRo
(인증서의 보안성을 감안하여 이하 중략)
HetPRTGwbQAdAnAYSd8z7ezPlS10GuAaM16winA8QWceReIjF5Yvml8M0fLFzbO7
dGw9CgA0joQhDYgF5U9JO9AarMYA0AQa1AyjGO2cioEB
-----END CERTIFICATE-----
Certificate has the following attributes:
Fingerprint MD5: FD5DC497 B6E22789 10389221 B9B0850C
Fingerprint SHA1: 0CC740C7 39242BAC 69279670 04CC0C4D F4852F77
% Do you accept this certificate? [yes/no]: yes
Trustpoint CA certificate accepted.
% Certificate successfully imported
VG_yohur(config)#
여기서 "Do you accept this certificate?" 라는 것을 물어 보는 이유는 RootCA 인증서이기때문입니다. 다음에 주입할 SubCA 인증서는 RootCA가 인증하므로 이런 질문을 하지 않습니다.
본격적으로 SubCA최초의 트러스트포인트는 이미 생성하였던 sip-trunk-cert입니다. 여기에 SubCA인증서와 CUBE의 인증서를 주입합니다.
- SubCA 인증서 주입
sip-trunk-cert 트러스트포인트에 SubCA 인증서 주입
VG_yohur(config)#crypto pki authenticate sip-trunk-cert
Enter the base 64 encoded CA certificate.
End with a blank line or the word "quit" on a line by itself
-----BEGIN CERTIFICATE-----
MIIEuzCCA6OgAwIBAgICJxEwDQYJKoZIhvcNAQELBQAwaDELMAkGA1UEBhMCS1Ix
DTALBgNVBAoMBEtJU0ExLjAsBgNVBAsMJUtvcmVhIENlcnRpZmljYXRpb24gQXV0
(인증서의 보안성을 감안하여 이하 중략)
6ZbrJiU+mkVz28cFp1iJJp+Ye7OyF9egEjmZ4hWbapmtFDnUiDm8a7Usu6nxMNv1
0y08VkcibZeIAPIptdEu
-----END CERTIFICATE-----
Certificate has the following attributes:
Fingerprint MD5: C95E7F9E 8B58BAC8 77675475 CAFD9097
Fingerprint SHA1: 5AFE4BAF E1B97D46 D6F23E3C E9DED1AF E719E73C
Certificate validated - Signed by existing trustpoint CA certificate.
Trustpoint CA certificate accepted.
% Certificate successfully imported
- CUBE 인증서 주입
SubCA 인증서를 주입한 후에 이제 CUBE가 직접 이용하는 CUBE의 인증서를 주입하도록 하겠습니다.
VG_yohur(config)#crypto pki import sip-trunk-cert certificate
% The fully-qualified domain name will not be included in the certificate
Enter the base 64 encoded certificate.
End with a blank line or the word "quit" on a line by itself
-----BEGIN CERTIFICATE-----
MIIEeDCCA2CgAwIBAgIDAJTsMA0GCSqGSIb3DQEBCwUAMFUxCzAJBgNVBAYTAktS
MQ0wCwYDVQQKDARLSUNBMRUwEwYDVQQLDAxBY2NyZWRpdGVkQ0ExIDAeBgNVBAMM
F1NpZ25HQVRFIERldmljZSBDQS0wMTAxMB4XDTEyMTEyMzA0MjEyOFoXDTEzMTEy
MzE0NTk1OVowXTELMAkGA1UEBhMCS1IxDTALBgNVBAoMBEtJQ0ExEzARBgNVBAsM
CmxpY2Vuc2VkQ0ExDTALBgNVBAsMBFRFU1QxGzAZBgNVBAMMElZHX3lvaHVyLmNp
c2NvLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAqY81eFQ3yAZuhLi0
bMFCp0W1m7+i4P7euXk7+i1b+4zMib3Y3t4LSjaCBNuxn8vb2WdtBZ+u5pg4tNVC
gX0NbRmK77PoLCeQzM1vZwbDaIJvkuT89auwJZJ6BlY7mRYgDn8CFypFLEBx9GYN
kh3iowrkZar+W4RmxJlV7HqLpIECAwEAAaOCAcswggHHMIGTBgNVHSMEgYswgYiA
FKmhq/QLZUBfXE83Q9Wn+tW3HdOboWykajBoMQswCQYDVQQGEwJLUjENMAsGA1UE
CgwES0lTQTEuMCwGA1UECwwlS29yZWEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
Q2VudHJhbDEaMBgGA1UEAwwRS0lTQSBSb290Q0EgRGV2IDGCAicRMAsGA1UdDwQE
AwIFoDAYBgNVHSAEETAPMA0GCyqDGoyaRAUCZQEBMB0GA1UdJQQWMBQGCCsGAQUF
BwMBBggrBgEFBQcDAjBhBgNVHR8EWjBYMFagVKBShlBodHRwOi8vZGNhLnNpZ25n
YXRlLmNvbS9UMDEwMy9vdT1kcDJwMTMsb3U9Y3JsZHAsb3U9QWNjcmVkaXRlZENB
LG89S0lDQSxjPUtSLmNybDCBhQYIKwYBBQUHAQEEeTB3MHUGCCsGAQUFBzAChmlo
dHRwOi8vZGNhLnNpZ25nYXRlLmNvbS9UMDEwMy9jbj1TaWduR0FURSBEZXZpY2Ug
Q0EtMDEwMSxvdT1BY2NyZWRpdGVkQ0Esbz1LSUNBLGM9S1I/Y0FDZXJ0aWZpY2F0
ZTtiaW5hcnkwDQYJKoZIhvcNAQELBQADggEBANyK3WxWULdA5AD21AE9gR0KUwTI
YLv1l7MC/QkmXQPccflpZg47VWmUcmHKUDvNDmCUq/8+RnC8lotyXkw7Be/vhD7L
3Ty6vXrTIkwIVmnQioZHx8WygjZtCBTWoQm9eu+nCZb7S5TdQrMl55eyCJtAkFVD
OFbIct0jZKudbGVYFzQE0et0SsoHhA+XylmwEjT+X9bkBacnT4M3s/zyVxjvPBXD
/tV4q90GuAIOjUNc43jz2xgSzmLuYBydS6yS/228q5BvwhoSuFZBKC1GW543scv+
BZihVgcs/a4AUHahQDXLLKA0QCUxmPFTKifAS1qxZO+uu/zIVNfJshjvKWo=
-----END CERTIFICATE-----
% Router Certificate successfully imported
VG_yohur(config)#
CUBE에서 각각 설정한 명령어들을 Show run 으로 살펴보았습니다.
CUBE에 PEM파일 인증서 주입이 잘되지 않을 경우 아래 명령어로 포맷 변경을 시도한 후에 다시 시도해 보시기 바랍니다. 경우에 따라 잘 않되는 경우가 간혹 있습니다.
----------------- --------------------------------------------------------
라인하트 (CCIEV #18487)
ucwana@gmail.com (라인하트의 구글 이메일)
http://twitter.com/ucwana (라인하트의 트위터 )
http://twitter.com/nexpertnet (넥스퍼트 블로그의 트위터, 최신 업데이트 정보 및 공지 사항)
http://groups.google.com/group/cciev (시스코 UC를 공부하는 사람들이 모인 구글 구룹스)
http://groups.google.com/group/ucforum (벤더에 상관없이 UC를 공부하는 사람들이 모인 구글 구룹스)
정리하고 보니 나도 디지털 네이티브 _____________________________________________________