- CentOS에서 OpenSSL 설치
- OpenSSL 사용자 매뉴얼
- 개인키와 사설 인증서 생성
- 서버 인증서 생성
- Client 인증서 생성
- 용어 및 인증서 관리
- 개인키와 공개키 생성
- 사설인증서 CA 처리
- PHP - OpenLDAP
보안을 위해서 사용되는 OpenSSL을 정리 한다.
홈페이지 : http://www.openssl.org/
다운로드 :
라이선스 : Apache Style License, http://www.openssl.org/source/license.html
플랫폼 :
CentOS에서 OpenSSL 설치
yum install openssl
OpenSSL 사용자 매뉴얼
예전에 CA(Certificate Authority)를 구축할 수 있는 Software를 판매한 적이 있었다. 직접 참여를 하지는 않았지만 관여를 하고 있었기 때문에 보안과 인증서에 대해서 공부를 했었다. 그 때 경험이 향후 보안과 관련된 작업을 할 때 여러모로 도움이 많이 되었다.
오픈소스 중에는 OpenSSL이라는 인증서를 만들고 관리할 수 있는 소프트웨어가 있다. 인증서를 생성할 수 있기 때문에 OpenSSL을 사용하면 사설 CA를 구축할 수도 있다. 사설 CA를 구축하는 것은 좀 큰일이고 인증서가 있으면 SSL, TLS 등 보안과 관련된 기본적인 여러가지 기능을 구현할 수 있다.
여기서는 OpenSSL을 사용하여 사설 인증서와 서버 인증서를 생성하는 방법을 알아 보자.
개인키와 사설 인증서 생성
2048-bits RSA 키(private.key) 생성
-des3 : 삼중 DES 암호화 적용
:{| cellspacing="0" cellpadding="2" border="0" width="100%" align="center"
|-
| bgcolor="#D0FF9D" |
openssl genrsa -des3 -out private.key 2048
#--- 암호 입력 (암호를 반드시 기억하자)
|}
키에서 암호 삭제
:{| cellspacing="0" cellpadding="2" border="0" width="100%" align="center"
|-
| bgcolor="#D0FF9D" |
openssl rsa -in private.key -out private.pem |}서명 정보가 들어 있는 CSR(private.csr) 생성
CSR : Certificate Signing Request
openssl req -new -key private.key -out private.csr
#--- 키 생성시 입력한 암호 입력
Country Name (2 letter code) [AU](AU.md): 국가 (KR)
State or Province Name (full name) [Some-State](Some-State.md): 시/도/군 (Seoul)
Locality Name (eg, city) [](.md): 구/군 (Seoul)
Organization Name (eg, company) [Widgits Pty Ltd](Internet): 회사명 (Jopenbusiness)
Organizational Unit Name (eg, section) [](.md): 서버도메인 (www.jopenbusiness.com)
Common Name (eg, YOUR name) [](.md): 이름 (pnuskgh)
Email Address [](.md): 이메일_주소
엔터
엔터
인증기관에 인증서 신청시 private.csr 파일의 내용을 복사하여 인증기관에 보낸다.
-----BEGIN NEW CERTIFICATE REQUEST-----
중간 내용 포함
-----END NEW CERTIFICATE REQUEST-----
자신이 서명한 인증서 (private.crt) 생성
-days 3560 : 유효기간을 3650일로 설정
openssl x509 -req -days 3560 -in private.csr -signkey private.key -out private.crt
#--- 키 생성시 입력한 암호 입력
서버 인증서 생성
Server 인증서 (server.crt) 생성
openssl genrsa -des3 -out server.key 2048
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 3560 -in server.csr -signkey server.key -out server.crt -CA private.crt -CAkey private.key -CAcreateserial
#--- server.key의 암호 입력
#--- private.key의 암호 입력
#--- 서버 인증서 검증
openssl verify -CAfile private.crt server.crt
Client 인증서 생성
Client 인증서 (client.crt) 생성
openssl genrsa -des3 -out client.key 2048
openssl req -new -key client.key -out client.csr
openssl x509 -req -days 3560 -in client.csr -signkey client.key -out client.crt -CA server.crt -CAkey server.key -CAcreateserial
#--- client.key의 암호 입력
#--- server.key의 암호 입력
#--- Client 인증서 검증
openssl verify -CAfile server.crt client.crt
용어 및 인증서 관리
CRT, DER, PEM 파일간의 변환
pem : base64 encoding 형태의 인증서
der : 바이너리 형태의 인증서
openssl x509 -outform der -in cert.crt -out cert.der
openssl x509 -inform der -in cert.der -out cert.pem
openssl x509 -outform der -in cert.pem -out cert.der
용어 설명
CA(Certificate Authority)
인증서를 사용할 때 Public/Private Key를 분배하는 과정의 문제점을 해결하기 위해 필요하며 Certificate을 인증 해주는 역할을 함
만약 Certificate에 sign을 한 CA를 믿을 수 있다면(Trusted CA) certificate도 믿을 수 있음
개인키와 공개키 생성
OpenSSL을 사용하여 /etc/mail/certs/ 폴더에 인증서를 만들어 봅시다.
개인키와 공개키를 저장하고 관리하기 위한 폴더 생성
cd /etc/mail
mkdir certs
cd /etc/mail/certs
chmod 700 /etc/mail/certs
인증을 위한 키(dsa1024.pem)를 만든다.
openssl dsaparam 1024 -out dsa1024 -out dsa1024.pem
OpenSSL 개인키(mycert.pem, mykey.pem)를 만든다.
openssl req -x509 -nodes -days 3650 -newkey dsa:dsa1024.pem -out /etc/mail/certs/mycert.pem -keyout /etc/mail/certs/mykey.pem
Country Name (2 letter code) [AU](AU.md):KR
State or Province Name (full name) [Some-State](Some-State.md):Seoul
Locality Name (eg, city) [](.md):Seoul
Organization Name (eg, company) [Widgits Pty Ltd](Internet):Jopenbusiness
Organizational Unit Name (eg, section) [](.md):Jopenbusiness
Common Name (eg, YOUR name) [](.md):pnuskgh
Email Address [](.md):메일_주소
ln -s /etc/mail/certs/mycert.pem /etc/mail/certs/CAcert.pem
chmod 600 /etc/mail/certs/*
OpenSSL 공개키를 만든다.
openssl req -x509 -new -days 3650 -key /etc/mail/certs/mykey.pem -out /etc/mail/certs/mycert.pem
Country Name (2 letter code) [GB](GB.md):KR
State or Province Name (full name) [Berkshire](Berkshire.md):Seoul
Locality Name (eg, city) [Newbury](Newbury.md):Seoul
Organization Name (eg, company) [Company Ltd](My):Jopenbusiness
Organizational Unit Name (eg, section) [](.md):Jopenbusiness
Common Name (eg, your name or your server's hostname) [](.md):pnuskgh
Email Address [](.md):메일_주소
chmod 600 /etc/mail/certs/*
사설인증서 CA 처리
PHP - OpenLDAP
vi /etc/openldap/ldap.conf ``` TLS_REQCERT allow BASE dc=ldap,dc=jopenbusiness,dc=com URI ldap://ldap.jopenbusiness.com TLS_CACERTDIR /etc/openldap/certs
/etc/openldap/certs/ 폴더에 CA 인증서를 복사하여 둡니다.
Test Program
vi zztest.php
$ds=ldap_connect("ldap.jopenbusiness.com", 389);
if ($ds) {
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_start_tls($ds);
$sr = @ldap_search($ds, "dc=ldap,dc=jopenbusiness,dc=com", "cn=demo001", array('cn'));
if ($sr !== FALSE) {
$info = @ldap_get_entries($ds, $sr);
$dn = $info[0]['dn']('dn'.md);
}
$ldapbind = @ldap_bind($ds, $dn, "");
}
?>
php -f zztest.php
openssl s_client -connect ldap.jopenbusiness.com:389
openssl s_client -showcerts -connect ldap.jopenbusiness.com:389
## HTTPS 서버 인증서
HTTPS 서비스를 위해서는 인증서 구매가 필요 합니다.
## 참고 문헌
- [OpenSSL로 인증서 생성 및 변환, 2010.9](http://www.innocert.co.kr/community/board.html?bid=info&uid=16&sch=)
- [Working with OpenSSL Certificates, 2010.10](http://linuxnet.ch/groups/linuxnet/wiki/5ee79/Working_with_OpenSSL_Certificates.html)
- [3. 인증서 관련 작업](http://wiki.kldp.org/HOWTO/html/SSL-RedHat-HOWTO/ssl-redhat-howto-3.html)
분류: [보안](분류_보안.md)