[Linux] OpenSSL을 사용한 자체 서명된 CA 생성 가이드

 내부 서비스에서 TLS 보안 연결을 구성할 때 외부 인증 기관(CA)을 사용하는 대신, 자체 서명된 인증서를 기반으로 사설 CA(Private CA)를 구성하는 방식이 종종 사용됩니다. 특히 비용 절감이나 내부 네트워크 전용 인증이 필요한 경우 적합한 접근법입니다.

이 문서에서는 OpenSSL을 사용하여 자체 서명된 CA를 구성하는 방법을 단계별로 안내합니다.


1. 준비 사항

  • 루트 권한 또는 sudo 명령을 사용할 수 있는 계정
  • OpenSSL이 설치된 리눅스 시스템

2. 자체 서명된 CA 생성 절차

2.1 CA용 개인 키 생성

256비트 ECDSA(Elliptic Curve Digital Signature Algorithm) 기반의 키를 생성합니다. 키 생성 속도는 하드웨어 성능과 엔트로피 수준에 따라 달라질 수 있습니다.

# openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 -out ca.key

2.2 자체 서명된 CA 인증서 생성

위에서 생성한 ca.key를 기반으로 CA 인증서를 생성합니다. 인증서는 X.509 형식이며, 유효 기간은 10년(3650일)로 설정합니다.

# openssl req -key ca.key -new -x509 -days 3650 \\
  -addext keyUsage=critical,keyCertSign,cRLSign \\
  -subj "/CN=Example_CA" -out ca.crt
  • /CN=Example_CA는 CA의 Common Name입니다. 필요에 따라 적절한 명칭으로 변경하세요.

3. 보안 설정

CA 개인 키 파일의 권한을 적절히 설정하여 무단 접근을 차단합니다.

# chown root:root ca.key
# chmod 600 ca.key

4. 클라이언트에 인증서 등록 (선택사항)

생성한 ca.crt 파일을 시스템 전체에서 신뢰하도록 하려면, trust 명령어를 사용해 볼 수 있습니다. 이 명령어는 생성한 CA 인증서를 시스템의 신뢰할 수 있는 루트 인증서 저장소에 등록하여 /etc/ssl/certs/ca-bundle.crt와 /etc/pki/tls/certs/ca-bundle.crt 파일에 인증서 정보를 추가합니다. 이렇게 하면 브라우저에서 "안전하지 않은 연결" 경고가 사라지고, curl이나 다른 애플리케이션에서도 SSL 인증서 검증 오류 없이 정상적으로 HTTPS 통신을 할 수 있어 더욱 편리하게 개발이나 테스트를 진행할 수 있습니다.

4.1 시스템 truststore에 CA 인증서 추가

RHEL 기반 시스템에서는 시스템 전체 truststore가 /etc/pki/ca-trust//usr/share/pki/ca-trust-source/ 디렉토리에 위치합니다. 이 통합된 truststore는 NSS, GnuTLS, OpenSSL, Java 등 다양한 라이브러리가 공유하는 시스템 인증서 저장소입니다.

CA 인증서를 시스템에 등록하는 방법

# trust anchor ca.crt

5. 서버 인증서 생성

TLS 보안 통신에 사용할 서버 인증서를 만들기 위해, 먼저 인증서 서명 요청(CSR)를 생성해야 합니다. 이 요청서는 CA가 서명해서 정식 인증서로 발급하게 됩니다.

5.1 서버 인증서를 위한 CSR 생성

# openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 -out server.key

# openssl req -new -key server.key -out server.csr \\
  -subj "/C=KR/ST=Seoul/O=MyOrg/CN=server.example.com"
  • server.key: 서버의 비공개 키
  • server.csr: 이 키를 기반으로 생성된 인증서 요청 파일
  • /CN=server.example.com: 이 인증서가 적용될 서버의 도메인 이름

5.2 인증서 서명 요청(CSR)에 대한 인증서 발급

클라이언트에서 생성된 CSR 파일에 대해 위 CA를 이용해 인증서를 서명할 수 있습니다.

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

최종적으로 완성된 파일은 아래와 같습니다.

# ll
total 28
-rw-r--r--. 1 root root  603 Jun 22 16:05 ca.crt
-rw-------. 1 root root  241 Jun 22 16:03 ca.key
-rw-r--r--. 1 root root   41 Jun 23 23:05 ca.srl
-rw-r--r--. 1 root root  530 Jun 23 23:05 server.crt
-rw-r--r--. 1 root root  432 Jun 23 23:00 server.csr
-rw-------. 1 root root  241 Jun 23 23:00 server.key

6. 인증서 검증

6.1 CA 인증서 정보 확인

# openssl x509 -in ca.crt -text -noout

이 명령을 통해 인증서의 상세 내용을 확인할 수 있습니다.

6.2 개인 키 유효성 확인

#  openssl pkey -check -in ca.key
Key is valid
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgLBCA/g3IGPIC/JMk
ZB9wCWGU0PRK/dCtGRjuy+5u5IChRANCAATsY9IBynFlE+kOfmhmMtMADLXG6i4b
...

정상적으로 생성된 키는 "Key is valid"라는 메시지가 출력됩니다.


마무리

OpenSSL을 사용한 자체 서명된 CA 구성은 VPN, 내부 API, Galera 클러스터 등 다양한 용도로 활용할 수 있습니다. 외부 CA 없이도 내부 인증 체계를 구축할 수 있어 비용 절감과 유연한 보안 설정이 가능합니다.

다만 사설 CA의 키는 반드시 안전하게 보관해야 하며, 갱신 주기도 체계적으로 관리해야 합니다. 또한 자체 서명된 CA로 발급된 인증서는 내부 네트워크에서만 신뢰되므로, 외부 서비스와의 연동 시에는 공인 CA 인증서를 사용하는 것이 좋습니다.


참고

https://docs.redhat.com/ko/documentation/red_hat_enterprise_linux/8/html/securing_networks/creating-a-private-ca-using-openssl_creating-and-managing-tls-keys-and-certificates

https://docs.redhat.com/ko/documentation/red_hat_enterprise_linux/8/html/securing_networks/creating-a-private-key-and-a-csr-for-a-tls-server-certificate-using-openssl_creating-and-managing-tls-keys-and-certificates

https://docs.redhat.com/ko/documentation/red_hat_enterprise_linux/8/html/securing_networks/using-a-private-ca-to-issue-certificates-for-csrs-with-openssl_creating-and-managing-tls-keys-and-certificates

댓글

이 블로그의 인기 게시물

[Linux] RHEL Local YUM Repository 구성

[Linux Command] sudo command 설명

[Ansible Modules] Fetch module 설명 및 활용