[OpenSSL]개인 SSL 인증서 발급

지금부터 설명하는 내용은 공인된 SSL인증 발급기관의 인증서를 구매하여 사용하는게 아닌 개인이 OpenSSL을 이용하여 직접 SSL인증서를 만들어 사용하는 방법을 설명한다.

하기의 웹페이지들을 참고하여 내용을 작성하였다.
https://www.lesstif.com/pages/viewpage.action?pageId=6979614
https://opentutorials.org/course/228/4894
http://mygeni.tistory.com/9

위 글들 대부분이 리눅스 환경에서의 방법을 설명하고 있는데 윈도우용 OpenSSL도 있고 충분히 리눅스에서 처럼 활용할수 있게 되어있기에 이글에서는 윈도우 환경에서의 SSL인증서 발급 절차를 설명한다.

원래는 OpenSSL 공식사이트를 통해서 내려받아 OpenSSL을 설치해서 사용할수있으면 좋겠지만… 소스코드를 제공하는 형식이기에 빌드를 따로해줘야 하는등 다소 번거로움이 존재한다.

OpenSSL 공식홈페이지 – https://www.openssl.org

소스코드를 내려받아 직접 빌드해서 사용할수도 있겠지만 이것저것 윈도우에 맞게 고쳐줘야 하는등의 수고스러움이 있을것으로 예상되기에 이글에서는 윈도우용으로 빌드되어 바이너리로 제공되어지는 패키지를 받아 설치해서 사용하는걸로 한다.

두곳에서 윈도우용 바이너리를 제공하고 있다. 원하는곳에서 받아서 설치해서 쓰면된다.
설치용, 압축파일 둘다 제공하는 곳 https://www.npcglib.org/~stathis/blog/precompiled-openssl/
설치용만 제공하는 곳 http://slproweb.com/products/Win32OpenSSL.html

원래 프로그램 자체가 GUI를 제공하지 않기때문에 윈도우에서는 예전의 TUI를 10분 활용할수있는 명령프롬프트로 OpenSSL을 사용해야 하기에 가급적 명령프롬프트와 친밀할수록 사용법을 익히기 쉬울것이다.

OpenSSL이 설치된 폴더안의 bin 폴더안에 들어가면 openssl.exe 파일이 있는데 명령프롬프트로 이 파일을 열어서 텍스트 명령으로 프로그램을 이용할것이다.


cd 이동할 경로
ex)cd C:\OpenSSL-Win64\bin

cd 명령으로 openssl.exe 파일이 있는 폴더에 커서를 맞췄다고 가정하고 설명한다.

먼저 Root CA를 생성해야 하는데 만약에 유료 혹은 CA 인증기관에서 받은 인증서가 있다면 이과정을 생략하고 SSL 인증서 생성 과정만을 거치면 된다.

CA 개인키 생성
bin 폴더안에 pblab이라는 폴더를 만들어서 그안에 키 및 인증서 파일들을 생성한다고 가정한다.


openssl genrsa -aes256 -out pblab\rootca.key 2048

맨끝에 숫자가 높을수록 암호수준이 높다고 한다.(그냥 단순히 높을수록 좋다.)


※키 파일 생성시에 사용할 암호를 입력받는데 절대 잊어버리면 안된다! csr 생성 crt(인증서)등등에서 계속해서 사용되므로 반드시 잊어버리지 않도록 한다. 만일 잃어버렸다면 key생성부터 다시 시작하는것말고는 방법이 없다...

윈도우에서는 파일 접근 권한 설정인 chmod 같은걸 지원하지 않는다. 그러므로 키 권한 설정 같은 부분은 무시하고 넘어가도 무관하다.

CSR생성을 위한 Config 파일 작성


[ req ]
default_bits			= 2048
default_md			= sha1
default_keyfile			= rootca.key
distinguished_name		= req_distinguished_name
extensions			= v3_ca
req_extensions			= v3_ca

[ v3_ca ]
basicConstraints		= critical, CA:TRUE, pathlen:0
subjectKeyIdentifier		= hash
##authorityKeyIdentifier	= keyid:always, issuer:always
keyUsage			= keyCertSign, cRLSign
nsCertType			= sslCA, emailCA, objCA

[ req_distinguished_name ]
countryName			= Country Name (2 letter code)
countryName_default		= KR
countryName_min			= 2
countryName_max			= 2

# 회사명 입력
organizationName		= Organization Name (eg, company)
organizationName_default	= PBLab

# 부서 입력
#organizationalUnitName		= Organizational Unit Name (eg, section)
#organizationalUnitName_default	= PBLab SSL

# SSL 서비스할 domain 명 입력
commonName			= Common Name (eg, your name or your server's hostname)
commonName_default		= PBLab CA
commonName_max			= 64

간단하게 문법 설명을 하자면 # 기호는 주석기호이므로 위내용중에 # 기호뒤의 한줄은 꼭 같이 작성해주지 않아도 무관하다.
주의사항으로 위 글을 그대로 복사해서 메모장이든 에디터든 집어넣고 저장할수도 있겠으나 공백을 따로 인식을 하는탓인지 에러가 발생하는 경우가 간혹있으므로 가급적 직접 타이핑 하거나 혹은 타이핑이 귀찮다면 하단 링크를 통해 파일을 내려받아서 하도록 하자.
rootca-openssl.conf 파일 다운로드
위의 Config 파일은 rootca-openssl.conf라는 이름으로 pblab 폴더안에 넣어둔다.

CSR 생성


openssl req -new -key pblab\rootca.key -out pblab\rootca.csr -config pblab\rootca-openssl.conf

이렇게 하면 rootca.csr 이라는 파일이 pblab 폴더안에 생성된다.

개인서명 CA 인증서 생성


openssl x509 -req -days 3650 -extensions v3_ca -set_serial 1 -in pblab\rootca.csr -signkey pblab\rootca.key -out pblab\rootca.crt -extfile pblab\rootca-openssl.conf

days 항목에 입력한 숫자에 따라 인증서의 유효기간이 달라진다. 만일 1년마다 매번 새로 인증서를 발급하여 사용할 생각일경우 days 항목에 365라고 입력해주면 1년짜리 인증서가 생성된다. 위 예제는 10년짜리 인증서를 발급받는 과정이다.

개인 SSL 인증서 생성
위에서 만들어둔 CA 개인키로 개인 SSL 인증서를 발급할것이다.
개인인증서용 Key 생성


openssl genrsa -aes256 -out pblab\pblab.kr.key 2048

개인인증서용 키에도 암호가 생성되게 되는데 대부분 삭제를 권장한다. 그리고 한가지 추가로 nginx에서 서버 구동시에 암호입력을 하게되어있는데 맞게 입력해도 Enter PEM Pass phrase 라는 문구만 4번 뜰뿐 nginx가 정상적으로 작동하지 않고 죽어버리는 증상이 있어서 암호제거를 권장한다. 원인은 찾는중이나… 왜인지는 모르겠다.(리눅스용에서는 이런 문제가 발생하지 않는듯 하다.)

개인인증서용 Key 암호제거
개인인증서용 키로 생성해둔 pblab.kr.key 파일을 pblab.kr.key.enc로 변경해준뒤 명령프롬프트에 아래와 같이 입력해준다.


openssl rsa -in pblab\pblab.kr.key.enc -out pblab\pblab.kr.key

개인 SSL 인증서용 CSR 생성을 위한 Config 파일 작성


[ req ]
default_bits			= 2048
default_md			= sha1
default_keyfile			= rootca.key
distinguished_name		= req_distinguished_name
extensions			= v3_user
## 인증서 요청시에도 extension 이 들어가면 authorityKeyIdentifier 를 찾지 못해 에러가 나므로 막아둔다.
## req_extensions 		= v3_user

[ v3_user ]
# Extensions to add to a certificate request
basicConstraints		= CA:FALSE
authorityKeyIdentifier		= keyid,issuer
subjectKeyIdentifier		= hash
keyUsage			= nonRepudiation, digitalSignature, keyEncipherment
## SSL 용 확장키 필드
extendedKeyUsage		= serverAuth,clientAuth
subjectAltName			= @alt_names

[ alt_names ]
## Subject AltName의 DNSName field에 SSL Host 의 도메인 이름을 적어준다.
## 멀티 도메인일 경우 *.lesstif.com 처럼 쓸 수 있다.
DNS.1				= www.pblab.kr
DNS.2				= pblab.kr
DNS.3				= *.pblab.kr

[ req_distinguished_name ]
countryName			= Country Name (2 letter code)
countryName_default		= KR
countryName_min			= 2
countryName_max			= 2

# 회사명 입력
organizationName		= Organization Name (eg, company)
organizationName_default	= PBLab

# 부서 입력
organizationalUnitName		= Organizational Unit Name (eg, section)
organizationalUnitName_default	= PBLab SSL

# SSL 서비스할 domain 명 입력
commonName			= Common Name (eg, your name or your server's hostname)
commonName_default		= pblab.kr
commonName_max			= 64

pblab-openssl.conf로 저장해준다.
pblab-openssl.conf 파일 다운로드

개인 인증서용 CSR 파일 생성


openssl req -new -key pblab\pblab.kr.key -out pblab\pblab.kr.csr -config pblab\pblab-openssl.conf

CA 서명이 포함된 개인 SSL 인증서 발급


openssl x509 -req -days 3650 -extensions v3_user -in pblab\pblab.kr.csr -CA pblab\rootca.crt -CAcreateserial -CAkey pblab\rootca.key -out pblab\pblab.kr.crt -extfile pblab\pblab-openssl.conf

이제 여기서 서버 클라이언트를 어떤걸 쓰느냐에따라 추가작업이 필요한지 아닌지가 나뉘게 되는데, httpd에 사용할거라면 위의 작업까지만 해주면 되고, nginx에 적용할것이라면 인증서 두개를 묶어서 체인을 시켜줘야 한다.
방법은 간단하다.
같은 폴더에 들어있는 두개의 crt 인증서 파일을 합쳐주면 되는데 무식하게 에디터로 두파일을 열어서 합쳐주지말고 아래의 명령어를 통해서 작업을 해주면 된다.

아래의 글을 참고하였다.
– 윈도우에서 파일 합치는 명령어 http://mwultong.blogspot.com/2006/11/text-file-txt-txt-merge-dos.html
– SSL 체인 https://www.lesstif.com/pages/viewpage.action?pageId=27984443

Copy 명령어로 두 파일을 합쳐 줄텐데 이때 순서를 개인인증서 -> CA 인증서 순으로 해줘야만 Key 암호가 제거된 개인인증서용 Key것으로 적용되므로 반드시 순서를 준수해야 한다.


copy pblab.kr.crt + rootca.crt pblab.kr.chained.crt /b