1.1 OpenSSL
(1) 개요 (출처 : wiki)
OpenSSL은 네트워크를 통한 데이터 통신에 쓰이는 프로토콜인 TLS와 SSL의 오픈 소스 구현판이다. C 언어로 작성되어 있는 중심 라이브러리 안에는, 기본적인 암호화 기능 및 여러 유틸리티 함수들이 구현되어 있다.
거의 모든 버전의 유닉스 계열 운영 체제(솔라리스, 맥 OS X, 리눅스, BSD 포함) 및 OpenVMS, 윈도우에서 OpenSSL을 이용할 수 있다.
(2) 알고리즘 (출처 : wiki)
OpenSSL은 각기 다른 다양한 암호화 알고리즘을 지원한다:
구분 |
내용 |
암호문(cipher) |
AES, 블로피시, Camellia, CAST-128, DES, IDEA, RC2, RC4, RC5, 트리플 DES, GOST 28147-89 |
암호학의 해시 함수 |
MD5, MD2, SHA-1, SHA-2, MDC-2 |
공개 키 암호 방식 |
RSA, DSA, 디피-헬만 키 교환, 타원 암호, GOST R 34.10-2001 |
(3) 다운로드
https://sourceforge.net/projects/openssl/
1.2 SSL 인증서 생성
(1) openssl.exe 실행(관리자 권한으로 실행)
(2) openssl.exe 실행(관리자 권한으로 실행)
(3) 개인키(private) 발급
절차 |
내용 |
1 |
OpenSSL\bin 폴더에 인증서를 생성할 폴더를 미리 만든다. 예) ssl |
2 |
genrsa -aes3 -out [./경로/]파일명 bit수 - 경로는 상대경로 또는 절대경로 입력 - bit수를 2048은 SHA-1이고, 4096을 입력해야 SHA-2로 생성함 |
genrsa -aes256 -out ./ssl/private.pem 4096 |
(3) 비밀번호 입력
절차 |
내용 |
3 |
비밀번호를 입력한다. 비밀번호는 두번 입력하게 된다. |
Password01* |
(4) “private.pem” 파일 생성 확인
절차 |
내용 |
4 |
opensssl/bin/ssl 폴더에 “private.pem” 생성되어 있는지 확인 |
|
(5) 패스워드가 없는 key 파일을 생성
절차 |
내용 |
5 |
genrsa –aes256 -out [./경로/]파일명 bit수 - 경로는 상대경로 또는 절대경로 입력 - bit수를 2048은 SHA-1이고, 4096을 입력해야 SHA-2로 생성함 |
genrsa -aes256 -out ./ssl/private.key 4096 |
(6) “private.key” 파일 생성 확인
절차 |
내용 |
6 |
opensssl/bin/ssl 폴더에 “private.key” 생성되어 있는지 확인 |
|
(7) 공개키(public) 발급
절차 |
내용 |
7 |
개인키를 이용하여 공개키 생성(비밀번호 없는 공개키 생성) rsa -in [./경로/]개인키 -pubot -out [./경로/]키이름 |
rsa -in ./ssl/private.key -pubout -out ./ssl/public.key |
(8) CSR 생성
절차 |
내용 |
||
8 |
req -new -key [./경로/]Key이름 –config [./경로/]파일명.cnf -out [./경로/]파일명.csr |
||
req -new -key ./ssl/private.key -config ./openssl.cnf -out ./ssl/private.csr |
|||
9 |
Country Name |
KR |
ex) KR |
State or Province Name |
BUSAN |
아무거나상관없음 |
|
Locality Name |
BUSAN |
아무거나상관없음 |
|
Organization Name |
HWANGSANGGYU |
아무거나상관없음 |
|
Organization Unit Name |
HWANGSANGGYU |
아무거나상관없음 |
|
Common Name |
www.hwangsanggyu.co.kr |
ip는 안됨. 도메인 입력후 PC의 hosts 파일에서 추가하여 사용가능 ex) hosts 파일에 아래 내용(샘플) 추가 123.233.212.11 www.hwangsanggyu.co.kr |
|
Email Address |
sghwang@hwangsanggyu.co.kr |
아무거나상관없음 |
|
A challenge password |
|
입력하지 않음 |
|
An optional company name |
|
입력하지 않음 |
(9) “private.csr” 파일 생성 확인
절차 |
내용 |
9 |
opensssl/bin/ssl 폴더에 “private.csr” 생성되어 있는지 확인 |
|
(10) CRT 생성
절차 |
내용 |
|
10 |
명령어 : genrsa 암호화 알고리즘 -out [./경로/]파일이름 비트수 - private를 이용하여 만들 CRT 파일에 대한 보증을 해줄 최상위의 CRT 파일 |
|
genrsa -aes256 -out ./ssl/rootCA.key 4096 |
||
Enter pass phrase for ./ssl/rootCA.key |
Password01* |
(11) 최상위 CA키를 이용하여 CSR을 생성
절차 |
내용 |
|
11 |
req -x509 -new -nodes -key [./경로/]key이름 -days 유효기간 -config [./경로/]cnf파일명 -out [./경로/]pem파일명 |
|
req -x509 -new -nodes -key ./ssl/rootCA.key -days 3650 -config ./openssl.cnf -out ./ssl/rootCA.pem |
||
12 |
Enter pass phrase for ./ssl/rootCA.key |
ex)Password01* |
Country Name |
ex) KR |
|
State or Province Name |
ex) BUSAN |
|
Locality Name |
ex) ex) BUSAN |
|
Organization Name |
ex) HWANGSANGGYU |
|
Organization Unit Name |
ex) HWANGSANGGYU |
|
Common Name |
ex) www.hwangsanggyu.co.kr |
|
Email Address |
ex) sghwang@hwangsanggyu.co.kr |
(12) 최상위 CA키를 이용하여 CRT 파일
절차 |
내용 |
|
13 |
x509 -req -in [./경로/]csr파일명 -CA [./경로/]pem파일명 -CAkey [./경로/]CAKey명칭 -CAcreateserial -out [./경로/]crt 파일명 -days 유효기간 |
|
x509 -req -in ./ssl/private.csr -CA ./ssl/rootCA.pem -CAkey ./ssl/rootCA.key -CAcreateserial -out ./ssl/private.crt -days 3650 |
||
14 |
Enter pass phrase for ./ssl/rootCA.key |
ex) Password01* |
(13) 인증서(private.crt) 생성 확인
절차 |
내용 |
|
15 |
opensssl/bin/ssl 폴더에 “private.crt” 생성되어 있는지 확인 |
|
Enter pass phrase for ./ssl/rootCA.key |
ex) Password01* |
(14) TOMCAT에 적용하기 위해 private.crt를 pkcs12라는 형식으로 변경
절차 |
내용 |
|
16 |
Tomcat에 적용할 keystore 파일 생성 |
|
pkcs12 -export -in ./ssl/private.crt -inkey ./ssl/private.key -out ./ssl/keystore -name tomcat |
||
17 |
Enter Export Password |
ex) Password01* |
(15) keystore 파일 생성 확인
절차 |
내용 |
16 |
Tomcat에 적용할 keystore 파일 생성 |
|
(16) keystore 파일 을 Tomcat 서버에 복사
절차 |
내용 |
17 |
Tomcat에 적용할 keystore 복사 |
D:\BIZ\apache-tomcat-8.5.37/ssl/keystore |
(17) Tomcat conf 파일(server.xml) 수정
절차 |
내용 |
18 |
Tomcat server.xml 수정 |
<Connector port="8080" |