OpenSSL

오픈소스 비즈니스 컨설팅
둘러보기로 가기 검색하러 가기

보안을 위해서 사용되는 OpenSSL을 정리 한다.

CentOS에서 OpenSSL 설치

yum install openssl

OpenSSL 사용자 매뉴얼

예전에 CA(Certificate Authority)를 구축할 수 있는 Software를 판매한 적이 있었다. 직접 참여를 하지는 않았지만 관여를 하고 있었기 때문에 보안과 인증서에 대해서 공부를 했었다. 그 때 경험이 향후 보안과 관련된 작업을 할 때 여러모로 도움이 많이 되었다.

오픈소스 중에는 OpenSSL이라는 인증서를 만들고 관리할 수 있는 소프트웨어가 있다. 인증서를 생성할 수 있기 때문에 OpenSSL을 사용하면 사설 CA를 구축할 수도 있다. 사설 CA를 구축하는 것은 좀 큰일이고 인증서가 있으면 SSL, TLS 등 보안과 관련된 기본적인 여러가지 기능을 구현할 수 있다.

여기서는 OpenSSL을 사용하여 사설 인증서와 서버 인증서를 생성하는 방법을 알아 보자.

개인키와 사설 인증서 생성

  • 2048-bits RSA 키(private.key) 생성
  • -des3 : 삼중 DES 암호화 적용

openssl genrsa -des3 -out private.key 2048

#--- 암호 입력 (암호를 반드시 기억하자)
  • 키에서 암호 삭제

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]: 국가 (KR)
   State or Province Name (full name) [Some-State]: 시/도/군 (Seoul)
   Locality Name (eg, city) []: 구/군 (Seoul)
   Organization Name (eg, company) [Internet Widgits Pty Ltd]: 회사명 (Jopenbusiness)
   Organizational Unit Name (eg, section) []: 서버도메인 (www.jopenbusiness.com)
   Common Name (eg, YOUR name) []: 이름 (pnuskgh)
   Email Address []: 이메일_주소
   엔터
   엔터
  • 인증기관에 인증서 신청시 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]:KR
    State or Province Name (full name) [Some-State]:Seoul
    Locality Name (eg, city) []:Seoul
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:Jopenbusiness
    Organizational Unit Name (eg, section) []:Jopenbusiness
    Common Name (eg, YOUR name) []:pnuskgh
    Email Address []:메일_주소
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]:KR
    State or Province Name (full name) [Berkshire]:Seoul
    Locality Name (eg, city) [Newbury]:Seoul
    Organization Name (eg, company) [My Company Ltd]:Jopenbusiness
    Organizational Unit Name (eg, section) []:Jopenbusiness
    Common Name (eg, your name or your server's hostname) []:pnuskgh
    Email Address []:메일_주소
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
    <?php
    ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);

    $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'];
        }
        $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 서비스를 위해서는 인증서 구매가 필요 합니다.

참고 문헌