마지막으로 직접 인증서를 발급하고 이를 개인용 사이트에 적용하는 방법을 상세히 알아보겠습니다. 

 

이 테스트는 CentOS 7.x , OpenSSL, Nginx에서 실행되었습니다.

 

인증서 발급을 위한 준비

 

인증서를 발급한 기록을 위해 두 가지 파일이 필요합니다. 하나는 발급된 인증서의 정보를 기록하는 것과 serial을 기록하는 파일, 이렇게 두 개의 파일을 준비해야 합니다. 

 

touch /etc/pki/CA/index.txt
echo '00' > /etc/pki/CA/serial

추후 인증서를 발급 후 두 파일을 보면 아래와 같습니다.

V    210109061528Z    00    unknown /C=KR/ST=Seoul/O=COMPANY/OU=DEV1/CN=your_domain/emailAddress=your_email@server.com

index.txt 파일에는 언제 어떤 정보를 포함한 인증서가 발급되었는지가 기록됩니다. 

01

serial 파일에는 00 에서 01로 한 개의 인증서가 발급되었다는 것을 확인할 수 있습니다. 

 

 

이제 CA 개인키를 생성합니다.

openssl genrsa -des3 -out ca.key 1024

그리고 CA의 CSR(Certificate Signing Request)을 생성합니다. csr 파일은 공개키와 사용하는 알고리즘 정보가 포함됩니다.

openssl req -new -key ca.key -out ca.csr

이제 Root CA의 인증서를 생성합니다. 

openssl x509 -req -days 1280 -in ca.csr -signkey ca.key -out ca.crt

이제 개인키에서 패스워드를 삭제하겠습니다. 사실 패스워드가 있는게 당연하겠지만, 웹 서버 가동때마다 계속 패스워드를 물어보게 할 수 없으니 일반적으로 삭제하고 사용합니다. 일반적으로 웹 서버들은 모두 패스워드 삭제를 '강요'합니다.

openssl rsa -in ca.key -out ca_key.pem

이로서 CA로서의 준비를 끝났습니다. 이제 웹서버를 위한 준비를 하겠습니다. 

 

웹 서버 인증서 만들기

웹 서버용 개인키를 생성합니다.

openssl genrsa -des3 -out server.key 1024

웹 서버용 CSR 을 생성합니다.

openssl req -new -key server.key -out server.csr

이제 준비가 되었으니 실제 인증서를 발급해 보겠습니다. 이 글은 개인용 인증서를 생성하고 적용하는 내용을 정리한 글입니다. 공인된 CA에 인증서 생성 요청은 필요하다면 추후 별도로 정리해 보겠습니다. (이미 수많은 글들이 있으니 쉽게 구글링으로 확인하실 수 있습니다.)

 

준비된 CA로 인증서를 제작합니다.

openssl x509 -req -in server.csr -out server.crt -signkey server.key -CA ca.crt -CAkey ca.key -CAcreateserial -days 365

웹 서버에 설정하기 위해 웹 서버용 개인키에서 패스워드를 삭제합니다. (안그러면 웹 서버 실행때마다 물어봅니다.)

openssl rsa -in server.key -out server_key.pem

Diffie-Hellman 키 생성하기 

(* Logjam 취약점이 이전에 발표되었으며, 이로 인해 1024bit는 안전하지 않습니다. 꼭 2048 이상으로 사용하시기 바랍니다. 상세 내용은 구글링으로... ^^a)

openssl dhparam -out dhparam.pem2048

 

이제 위에서 생성한 파일들을 /etc/nginx/ssl 폴더를 만들어 넣어두고 아래와 같이 상위 폴더의 보안 설정에 맞춰줍니다.

restorecon -v -R /etc/nginx

 

웹 서버 (NGINX ) 설정하기 

 

nginx 의 설정을 별도로 수정하지 않았다면 /etc/nginx/default.conf 파일을 수정하면 됩니다.

 

# 기존 http도 https로 리디렉션 되도록 설정.
server {	
	listen      80;
	listen      [::]:80;
	server_name your_domain; # ip 일때는 굳이 쓸 필요가 없다.

# 301 moved permanently 응답과 합께 모든 http 요청을 https로 리디렉션한다.
	location / {
		return 301 https://your_domain:443$request_uri;
	}
}

server {
	listen       443 ssl http2 default_server;
	listen      [::]:443 ssl http2 default_server;
	server_name  your_domain; # ip 일때는 굳이 쓸 필요가 없다.

	ssl_certificate /etc/nginx/ssl/ca.crt;
	ssl_certificate_key /etc/nginx/ssl/ca_key.pem;
	ssl_session_timeout 1d;
	ssl_session_cache shared:SSL:50m;
	ssl_session_tickets off;

	ssl_dhparam /etc/nginx/ssl/dhparam.pem;
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	# Cipher Suites 에 대해서는 이 링크(https://rsec.kr/?p=455)를 참고하세요. 너무 잘 설명해 두셔서 감동이었습니다. -o-b
	ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
	ssl_ecdh_curve secp384r1;

	ssl_prefer_server_ciphers on;
	ssl_stapling off;	# for self-signed cert
	ssl_stapling_verify off; # for self-signed cert

	location ~ /\.ht {
		deny all;
	}
	.
	.
	.

 만약 443이 아닌 다른 임의의 포트를 사용한다면 semanage에 추가해야 합니다. (selinux를 사용하지 않는 상태라면 통과입니다.)

semanage port -a -t http_port_t -p tcp 4430  # 포트 추가하기
semanage port -l | grep http_port_t # 포트 적용되었는지 확인

firewall-cmd --permanent --zone=public --add-port=4430/tcp # firewall에 4430포트 오픈
firewall-cmd --reload # 변경 사항 적용하기

이제 웹서버를 재실행 해보시기 바랍니다. http로 접속하시면 바로 https로 포워딩 되는지도 잘 확인해보시고요.

 

도움이 되셨으면 합니다.

 

모두 새해 복 많이 받으시고 멋진 2020년 되시기 바랍니다.

 

이만  ~~ !

"가장 빨리 만나는 Docker" 책을 참고함.


구조는 아래와 같이 잡는다. 


(내부) docker-registry <---> nginx auth <---> (외부)docker daemon


기본 registry를 내려받아 실행.


sudo docker run -d --name docker-registry -v /tmp/registry:/tmp/registry registry:0.9.1

(* port는 nginx에서 redirect될거라 오픈할 필요는 없음.)


openssl로 key 제작


1. openssl genrsa -out 이름.key 2048

2. openssl req -new -key 이름.key -out.이름.csr  (작성시 도메인은  registry.test.com로 맞춰야 한다.)

3. openssl x509 -req -days 365 -in 이름.csr -signkey 이름.key -out 이름.crt


이 파일을 nginx 서버와 클라에서 아래 과정을 거쳐 인증서를 시스템에 설치한다.


1. cp 이름.crt /usr/share/ca-certificates/ (ca-certificates 폴더가 없다면 "sudo apt-get install curl")

2. echo "이름.crt" | tee -a /etc/ca-certificates.conf (설치할 인증서 목록에 추가함.)

3. update-ca-certificates (ca-certificates.conf에 포함된 내용을 참고로 인증서 설치)


 이후 도커 재시작 필요함.


nginx 서버는 아래와 같이 실행할 것! (이걸 실행 후 openssl 처리해야 할 걸.)


sudo docker run --name reg-auth \

 -p 443:443 \

 -d  \

 -v /rs2m/data:/data \

 -v /rs2m/data/nginx.conf:/etc/nginx/nginx.conf \

 -v /rs2m/data/이름.crt:/etc/이름.crt \

 -v /rs2m/data/이름.key:/etc/이름.key \

 -v /rs2m/data/.htpasswd:/etc/nginx/.htpasswd \

 --link docker-registry:docker-registry \

 nginx:1.7.9


nginx.conf는 아래와 같이 !!


worker_processes  1;


events{

    worker_connections   1024;

}


http{

    server{

        listen 443 ssl;

        server_name registry.test.com


        ssl on;

        ssl_certificate /etc/rs2m_reg.crt;

        ssl_certificate_key /etc/rs2m_reg.key;


        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header Authorization "";

        proxy_redirect http:// https://;


        client_max_body_size 0;

        chunked_transfer_encoding on;


        location / {

            proxy_pass http://rs2m-reg:5000;

            auth_basic "Restricted";

            auth_basic_user_file /etc/nginx/.htpasswd;

        }

    }

}


+ Recent posts