E-openssl을 이용한 인증서 생성 실습
개요
이 문서는 3W - Public Key Infrastructure에서 간단하게 보여줄 실습을 위해 미리 정리하는 문서이다.
PKI의 개념을 익힌 이후, 간단하게 로컬 환경에서 키를 만들고 인증서를 만드는 실습을 해본다.
다음의 순서로 실습을 진행하며, 환경은 리얼리눅스를 활용한다(속도 빨라서 조아용).
- 루트 키 페어 생성 - rsa 2048
- 루트 인증서 생성
- 사용할 키 페어 생성 - ed20119
- csr 파일 생성
- 루트의 서명을 받은 인증서 생성
- nginx에 curl 날려 통신 확인
사전 준비
https://reallinux.co.kr/
로그인을 하고 나면 실습 환경에서 실습을 진행할 수 있다.
우분투 22를 쓸 것이다.
sudo su
# 웹사이트에 나온 비밀번호 입력
실습 편의를 위해 루트 계정으로 접속한다.
루트 키페어 및 인증서 생성
# rsa 방식으로 2048 비트의 개인키 생성
openssl genrsa -out root.key 2048
첫번째로, 루트가 될 키페어를 만들어본다.
매우 긴 개인키가 생성된다.
# 해당 키를 까보고 싶으면 이렇게 하면 정보를 볼 수 있다.
openssl rsa -in root.key -text -noout
그러나 사실 이건 개인키만 들어있는 것이 아니라, 키 페어를 만드는데 필요한 각종 값들이 함께 들어있다.
실질적으로 공개키가 필요하진 않은데, 왜냐하면 실제 만들어졌다는 개인키에 공개키를 만들기 위한 각종 정보가 포함되어있기 때문이다.
# 굳이 공개키를 직접 꺼내보고 싶다면
openssl rsa -in root.key -pubout -text
이렇게 인자를 주면 마지막에 실제 계산되는 공개키 정보도 확인할 수 있다.
openssl req -new -x509 -key root.key -out root.pem -subj /CN=root
이제 자체서명 인증서를 만든다.
원래는 CSR 파일을 만들어야 하나, -x509
인자를 주면 바로 인증서가 만들어지게도 할 수 있다.
openssl x509 -in root.pem -noout -text
인증서 내용을 확인해보면, Issuer와 Subject 정보가 같은, 자체 서명 인증서가 발급된 것을 확인할 수 있다.
사용할 키페어 생성 및 인증서 발급
openssl genpkey -algorithm ed25519 -out server.key
다음으로는 이 루트 인증서에 서명을 받은 서버 인증서를 만들 것이다.
이때 모바일 환경에서 많이 쓰이는, 차원곡선함수(ECC)를 활용한 공개키 알고리즘을 사용해본다.
진짜 어마무시하게 키 크기가 줄어든 것을 확인할 수 있다.
openssl req -new -key server.key -subj "/CN=nginx-test" -out server.csr
이번에는 제대로 CSR, 즉 인증서 서명 요청 파일을 만들어본다.
openssl req -in server.csr -text -noout
내용을 까보는 것은 위에서 본 방식과 동일한데, 크기가 정말 작다.
이제 이 인증서를 가지고 루트 인증서와 개인키를 이용해 서명을 진행하면 된다.
# 인증서 발급
openssl x509 -req -in server.csr -CA root.pem -CAkey root.key -out server.pem
성공적으로 인증서를 발급 받았다.
openssl x509 -in server.pem -text -noout
이번에는 발행자는 root, 주체는 nginx-test인 인증서가 만들어진 것을 확인할 수 있다.
# 제대로 서명됐는지 검증
openssl verify -CAfile root.pem server.pem
이런 식으로 루트의 인증서를 통해 서버의 인증서를 검증할 수 있다.
실제 tls 통신이 발생할 때도 이런 식으로 상위 인증서를 가지고 서버의 인증서를 검증하는 방식으로 검증이 진행된다.
nginx 통신 테스트
apt update -y && apt install -y nginx
curl http://localhost
curl https://localhost
이제 만들어진 인증서를 가지고 nginx 서버를 만들어보자!
nginx를 설치하면 자동으로 systemctl에 등록되어 서비스가 동작한다.
아직 tls 설정이 되어있지 않기 때문에 그냥 https로 요청하면 소용이 없다.
vi /etc/nginx/sites-enabled/default
nginx의 기본 파일을 수정한다.
listen 443 ssl default_server;
ssl_certificate /home/reallinux/server.pem;
ssl_certificate_key /home/reallinux/server.key;
이 값을 추가해준다.
위에서 만든 인증서와 개인키를 사용하는 것이다.
systemctl restart nginx
그리고 설정 파일을 리로드할 수 있도록 프로세스를 재시작해준다.
curl -k https://localhost
k 옵션은 신뢰할 수 없는 서명을 받은 서버의 인증서라고 해도 이를 무시하고 통신이 가능하게 하는 설정이다.
이렇게 하면 통신은 가능하지만, 우리는 이 상태로 만족할 수 없다.
curl을 날릴 때 상대를 검증하는데 사용될 루트 인증서를 직접 지정해서 curl이 우리의 nginx를 신뢰할 수 있도록 해보자.
curl --cacert root.pem https://localhost
이미 루트 인증서를 만들었기 때문에, 이것을 그대로 활용해주면 된다.
그러나, 위에서 CN(Common Name)을 nginx-test로 했기에 검증 단계에서는 실제 서버의 도메인이 nginx-test이길 기대한다.
echo "127.0.0.1 nginx-test" >> /etc/hosts
curl --cacert root.pem https://nginx-test
그렇다면 dns 로컬 파일을 직접 수정해서 nginx-test라는 도메인에 대한 요청이 localhost로 가도록 설정하면 된다.
석세스!
결론
이제는 너무 많이 해봐서 결론이랄 것도 없다.
관련 문서
이름 | noteType | created |
---|