Loading...
 
Print

OpenSSL 환경 설정 및 활용


Image
OpenSSL은 C 언어로 작성되었으며, 보안 소켓 레이어 (SSL v2/v3)와 전송 계층 보안 (TLS v1) 프로토콜을 구현하는 매우 강력하면서 범용 암호화 라이브러리를 포함한 모든 기능을 갖춘 오픈 소스이다. 네트워크를 통한 데이터 통신에 TLS 혹은 SSL을 구현하고자 한다면 상용 제품에 결코 뒤지지 않는 OpenSSL을 적극 검토해 볼 필요가 있다.


실제로 TLS, SSL을 사용하는 경우는 매우 많다. gmail을 SMTP Relay로 사용하고자 하는 경우에도 필요로 하며, SSH의 인증 관리, Apache HTTP Server에 대한 SSL 적용, 기타 등등...

이들 모두를 위해 인증키를 발행하기 위해서는 인증키 발행 기관이 필요로 하며, 본 글의 목적이 여기에 있다. 즉, 내가 발행 기관이 되어서 적어도 내부 시스템에서는 모두 하나의 인증기관에서 인증키 관리를 하고자 하는 목적이 있다.

본 문서에서는 CentOS 6.5 (64bit)에 RPM으로 OpenSSL 1.0.1e 버전을 기준으로 구현해 보고자 하며, 현재 최신 버전은 2014년 1월 6일 발표된 OpenSSL 1.0.0l이다. 그렇지만 CentOS에 포팅된 버전은 이보다 최신 버전보다 낮지만 기능상의 큰 차이는 없다.

환경 설정은 CentOS 환경을 고려하여 최대한 수정없이 진행하고자 한다. 따로 환경 화일을 가지고 가지 않겠다는 의미이다.




CA 운영 및 CSR 발행

STEP 1) OpenSSL 관련 RPM 패키지 설치
CentOS 6.5를 설치하면 기본적으로 OpenSSL 관련 패키지들이 설치되지만 OpenSSL Server는 설치되지 않을 수도 있다. 없다면 추가하고 아래의 내용과 같이 최소의 RPM을 확인한다.
openssl098e-0.9.8e-17.el6.centos.2.x86_64
openssl-devel-1.0.1e-16.el6_5.4.x86_64
openssl-1.0.1e-16.el6_5.4.x86_64


참고로 여기에서 'rpm -qa|grep openssl' 스크립트를 수행시 패키지명에 .i386과 .x86_64와 같이 패키지의 bit가 나타나지 않는 경우 (CentOS 4.X, 5.X)가 있다. 이 경우에는 error: "rpm package name" specifies multiple packages 문서를 참고한다.

STEP 2) OpenSSL 기본 환경 설정
CentOS 6.5 기반 위에 OpenSSL를 사용하기 위한 기본 환경은 이미 되어 있다. 그 기본 설정 파일은 /etc/pki/tls/openssl.cnf에서 확인 할 수 있으며, 앞으로 진행하는 대부분의 작업 디렉토리는 /etc/pki/CA에서 진행한다.
특정 파일 및 디렉토리 생성
mkdir -p /etc/pki/CA/certs
mkdir -p /etc/pki/CA/crl
mkdir -p /etc/pki/CA/newcerts
touch /etc/pki/CA/index.txt
echo '01' > /etc/pki/CA/serial
echo '01' > /etc/pki/CA/crlnumber


주의할 점은 openssl.cnf 파일은 반드시 백업을 받고나서 설정 파일을 아래와 같이 수정, 변경한다.

/etc/pki/tls/openssl.cnf
...
 CA_default 

dir             = /etc/pki/CA              # 반드시 절대경로를 지정한다
certs           = $dir/certs            # Where the issued certs are kept
crl_dir         = $dir/crl              # Where the issued crl are kept
database        = $dir/index.txt        # database index file.
new_certs_dir   = $dir/newcerts         # default place for new certs.

certificate     = $dir/certs/ca.crt       # The CA certificate (기본은 cacert.pem)
serial          = $dir/serial           # The current serial number
crlnumber       = $dir/crlnumber        # the current crl number
                                        # must be commented out to leave a V1 CRL
crl             = $dir/crl.pem          # The current CRL
private_key     = $dir/private/ca.key   # The private key (기본은 cakey.pem)
RANDFILE        = $dir/private/.rand    # private random number file
...
...
default_days    = 1825                   # how long to certify for (5년으로 설정. 기본은: 365)
default_crl_days= 30                    # how long before next CRL
default_md      = sha1                  # which md to use.
preserve        = no                    # keep passed DN ordering
...
...
 req_distinguished_name 
countryName                     = Country Name (2 letter code)
countryName_default             = KR
countryName_min                 = 2
countryName_max                 = 2

stateOrProvinceName             = State or Province Name (full name)
stateOrProvinceName_default     = Seoul

localityName                    = Locality Name (eg, city)
localityName_default            = Guro

0.organizationName              = Organization Name (eg, company)
0.organizationName_default      = example

1. we can do this but it is not needed normally 
2.1.organizationName             = Second Organization Name (eg, company)
3.1.organizationName_default     = World Wide Web Pty Ltd

organizationalUnitName          = Organizational Unit Name (eg, section)
organizationalUnitName_default  = Supports

commonName                      = Common Name (eg, your name or your server\'s hostname)
commonName_max                  = 64

emailAddress                    = Email Address
emailAddress_default            = adminsrs@example.com
emailAddress_max                = 64
...


여기에서 필요할 경우 openssl.cnf 설정 파일에 대해서 권한 설정을 변경한다. 즉,
chmod 0600 /etc/pki/tls/openssl.cnf

STEP 3) Creating Certificate Authority (CA)
Certificate Authority 혹은 Certification Authority (CA)는 인증기관이라고도 하는데 전자인증을 관리하며 사용자의 공개키와 정보를 이용하여 인증서를 생성, 검증, 패기하는 객체를 의미한다. CA의 가장 큰 역활은 인증 및 발행에 있다.
  • 인증: 지원자의 수분을 확인하는 절차
  • 발행: 신분이 확인되면 전자인증을 발행

보통의 경우 인증기관이 존재하지만 여기에서는 자체적으로 인증기관을 운영하고자 하며, 이를 위해서 제일먼저 해야 하는 것은 CA를 생성해야 한다. 즉, 일반적인 경우에는 이 과정은 필요가 없다.

CA 생성
cd /etc/pki/CA
openssl req -new -x509 -extensions v3_ca -keyout private/ca.key -out certs/ca.crt -days 1825
Generating a 1024 bit RSA private key
..++++++
............++++++
writing new private key to 'private/ca.key'
Enter PEM pass phrase: XXXXXX 
Verifying - Enter PEM pass phrase: XXXXXX 
--
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.
--
Country Name (2 letter code) KR:
State or Province Name (full name) Seoul:
Locality Name (eg, city) Guro:
Organization Name (eg, company) example:
Organizational Unit Name (eg, section) Supports:
Common Name (eg, your name or your server's hostname) []:test2123.example.com
Email Address adminsrs@example.com:


특별한 메세지 없이 prompt가 떨어지지만 아래의 2곳에 ca.key 및 ca.crt 파일이 생성이 됨을 확인할 수 있다.

root@mfs CA# ls -al /etc/pki/CA/private
total 12
drwx-- 2 root root 4096 Sep 19 18:26 .
drwx-- 6 root root 4096 Sep 19 17:59 ..
-rw-r--r-- 1 root root  963 Sep 19 18:28 ca.key
root@mfs CA# ls -al /etc/pki/CA/certs
total 12
drwxr-xr-x 2 root root 4096 Sep 19 18:28 .
drwx-- 6 root root 4096 Sep 19 17:59 ..
-rw-r--r-- 1 root root 1306 Sep 19 18:28 ca.crt


이제 Private Key 파일인 ca.key 파일을 root 유저만이 읽을 수 있도록 권한을 변경한다.

root@mfs CA# chmod 0400 /etc/pki/CA/private/ca.key
root@mfs CA# ls -al /etc/pki/CA/private
total 12
drwx-- 2 root root 4096 Sep 19 18:26 .
drwx-- 6 root root 4096 Sep 19 17:59 ..
-r---- 1 root root  963 Sep 19 18:28 ca.key


STEP 4) Creating Certificate Request (CSR)
인증 요구서 혹은 CSR (Certification Signing Request)는 인증이 필요로 하는 어플리케이션에서 인증을 받기 위하여 CA에 보내는 메세지이다.

여기에서는 Apache Web Server에 대한 SSL 인증을 위한 CSR 생성을 예로 들어보며, Apache 뿐만 아니라 여러 용도에서 필요로 할 수 있기때문에 여기에서는 각각의 폴더를 만들어서 사용해본다. 이를 위하여 /etc/pki/product/apache 폴더를 생성하고 여기에 Apache Web Server를 위한 CSR를 생성한다.
mkdir -p /etc/pki/product/apache
cd /etc/pki/product/apache
openssl req -new -nodes -keyout apache.key -out apache.csr -days 1825
Generating a 1024 bit RSA private key
....++++++
.............++++++
writing new private key to 'private/test21.key'
--
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.
--
Country Name (2 letter code) KR:
State or Province Name (full name) Seoul:
Locality Name (eg, city) Guro:
Organization Name (eg, company) example:
Organizational Unit Name (eg, section) Supports:
Common Name (eg, your name or your server's hostname) []:test2123.example.com
Email Address adminsrs@example.com:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

root@mfs apache# ls -al
total 16
drwxr-xr-x 2 root root 4096 Sep 19 18:47 .
drwxr-xr-x 7 root root 4096 Sep 19 18:41 ..
-rw-r--r-- 1 root root  777 Sep 19 18:47 apache.csr
-rw-r--r-- 1 root root  887 Sep 19 18:47 apache.key


STEP 5) Signing Create Certificate Request (CSR)
위의 예에서 Apache의 SSL 인증을 위해서 인증 요구서를 생성하였고 이를 실제로 인증기관에 보내어 인증서를 발급받으면 된다. 여기에서는 인증기관이 사설 CA를 사용하므로 위에서 생성한 CA에서 인증서를 발급해보자.
cd /etc/pki/product/apache
root@mfs apache# openssl ca -policy policy_anything -out apache.crt -infiles apache.csr
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/ca.key:XXXXXX      
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Sep 19 11:22:34 2011 GMT
            Not After : Sep 17 11:22:34 2016 GMT
        Subject:
            countryName               = KR
            stateOrProvinceName       = Seoul
            localityName              = Guro
            organizationName          = example
            organizationalUnitName    = Supports
            commonName                = example.com
            emailAddress              = adminsrs@example.com
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                D9:E3:25:10:99:C1:05:84:ED:3A:B8:A0:E2:33:1D:7F:47:7E:CC:65
            X509v3 Authority Key Identifier:
                keyid:F6:76:33:50:87:0D:8B:45:90:A5:20:D1:8E:DB:FD:7C:59:AB:FA:55

Certificate is to be certified until Sep 17 11:22:34 2016 GMT (1825 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


정상적으로 인증서가 발급되었다면 2개의 파일이 새롭게 생성이 된다.

하나는 /etc/pki/product/apache 폴더에 apache.crt가 생성되었고 /etc/pki/CA/newcerts 폴더에 01.pem 파일이 그것이다. 여기에서 01은 Certificated number이다. 01.pem 파일은 apache.key 및 apache.crt 파일 정보를 담고 있는 X.509 파일이다.

root@mfs apache# ls -al /etc/pki/product/apache
total 20
drwxr-xr-x 2 root root 4096 Sep 19 20:22 .
drwxr-xr-x 7 root root 4096 Sep 19 18:41 ..
-rw-r--r-- 1 root root 3293 Sep 19 20:22 apache.crt
-rw-r--r-- 1 root root  777 Sep 19 18:47 apache.csr
-rw-r--r-- 1 root root  887 Sep 19 18:47 apache.key
root@mfs apache# ls -al /etc/pki/CA/newcerts
total 12
drwxr-xr-x 2 root root 4096 Sep 19 20:22 .
drwx-- 6 root root 4096 Sep 19 20:22 ..
-rw-r--r-- 1 root root 3293 Sep 19 20:22 01.pem



Close
noteCertificate Revocation List (CRL)이란...
인증서 폐기 목록 (CRL)은 네트웍 상을 통한 서버 접근 제어에 PKI를 적용할 때 쓰게 되는 일반적인 방식으로 가입자 이름과 인증서의 현재 상태로 구성된 목록을 담고 있다. 또한 인증서 폐기 사유와 발급일, 발급기관 등의 정보도 함께 포함되어져 있다.

STEP 6) Verify Certificate
생성된 인증서에 대해서 그 내용들과 상태에 대해서 확일할 수 있는데 그 예는 다음과 같다. 하나의 인증에 대한 subject 및 issuer를 확인한다.
root@proton2 CA# openssl x509 -subject -issuer -enddate -noout -in certs/test21.crt
subject= /C=KR/ST=Seoul/L=Guro/O=example/OU=Supports/CN=test2123.xxx/emailAddress=xxx
issuer= /C=KR/ST=Seoul/L=Guro/O=example/OU=Supports/CN=test2123.xxx/emailAddress=xxx
notAfter=Aug 14 05:16:34 2016 GMT


하나의 인증서에 대한 모든 컨텐츠를 확인한다.

root@proton2 CA# openssl x509 -in certs/test21.crt -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1 (0x1)
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=KR, ST=Seoul, L=Guro, O=example, OU=Supports, CN=test2123.xxx/emailAddress=xxx
        Validity
            Not Before: Aug 16 05:16:34 2011 GMT
            Not After : Aug 14 05:16:34 2016 GMT
        Subject: C=KR, ST=Seoul, L=Guro, O=example, OU=Supports, CN=test2123.xxx/emailAddress=xxx
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):
                    00:c1:83:57:89:64:aa:e2:58:69:a8:0d:1a:19:c1:
                    95:e9:c7:9e:87:28:9a:4e:8f:89:54:8a:4c:ed:27:
                    3d:49:5f:eb:c6:98:f4:a3:95:b3:40:c1:fe:f2:6a:
                    ...
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                27:5D:5F:4D:06:CB:AC:4D:E1:91:32:23:F9:89:6F:84:6D:04:65:76
            X509v3 Authority Key Identifier:
                keyid:65:B5:CE:92:F9:42:86:DD:95:94:2C:14:03:39:BE:AF:68:50:70:63

    Signature Algorithm: sha1WithRSAEncryption
        23:22:5d:9f:ab:dd:13:d3:56:99:48:24:05:e3:d6:3d:85:62:
        62:11:fc:2c:37:58:82:2b:6c:e2:4b:a3:e2:85:44:38:a7:40:
        52:f8:95:a3:a5:b6:80:96:b3:93:a5:5c:b5:3f:59:ca:fc:05:
        ...


인증서가 서버 인증에 적합하지의 여부를 확인한다.

root@proton2 CA# openssl verify -purpose sslserver -CAfile certs/ca.crt certs/test21.crt
certs/test21.crt: OK





Apache에 SSL 서비스 등록

사설 CA 혹은 공인기관으로부터 발급받은 CSR을 가지고 실제로 Apache Web Server에 등록하는 절차를 언급하고 있다.

STEP 1) Server Certificate 및 Private Key 파일 등록
SSL 환경정보를 설정하는 ssl.conf 파일의 내용중에 Server Certificate 파일인 apache.crt 파일과 Server Private Key 파일인 apache.key 파일을 지정하면 된다. 참고로 Apache 2.x 버전의 홈은 /d1/scms/apache 가정하고 위의 STEP 6)에서 발행된 apache.crt와 apache.key 파일이 /d1/scms/apache/conf에 존재한다고 가정하고 ssl.conf 파일은 다음과 같이 수정을 한다.
/d1/scms/apache/conf/extra/httpd-ssl.conf
...
SSLCertificateFile "/d1/scms/apache/conf/apache.crt"
SSLCertificateKeyFile "/d1/scms/apache/conf/apache.key"
...





Reference

  • OpenSSL Official Homepage
  • Oracle Doc ID 184701.1: How to Convert a Certificate and Private Key to an Oracle Wallet, using ssl2ossl or openssl, for use with Oracle Application Server 10g
  • Oracle Doc ID 1173134.1: "The password is incorrect" Errot When Converting Third Party Wallet (.pfx) To Oracle Wallet (.p12)

Created by jhpark. Last Modification: Friday 28 of March, 2014 18:39:18 KST by jhpark. (Version 18)
[ Execution time: 0.22 secs ]   [ Memory usage: 23.66MB ]   [ Queries: 51 in 0.00 secs ]   [ Server load: 0.16 ]

Shout anything, anybody...

jhpark: 감기가 장난이 아니내요. 모두들 감기 조심하세요...~
jhpark: 세렌즈 홈페이지의 Tiki에 대한 Patch가 이루어졌습니다. 새로운 버전은 Tiki 12.3
jhpark: 말그대로 키오스크이지요. 뭔가 샤우팅하고 싶은 것이 있다면 그것이 무엇이든 샤우티잉...
meng: 이건 뭐지요 ㅋㅋ
jhpark: 이곳 정자동엔 함박눈... 오늘 어케 퇴근하나.
Ji-Su Hong: 출첵? ㅎ~
jhpark: sql_mode=""의 위력은 대단하다. 특히 End User의 입장에서는...
박영훈: testtest
jhpark: 명규야 잘자라, 내일을 위해서... ㅋㅋ
Admin: 아우, 홈페이지 결국은 오픈했당. 어지러워라...