웹사이트 검색

OpenSSL Essentials: SSL 인증서, 개인 키 및 CSR 작업


소개

OpenSSL은 PKI(Public Key Infrastructure) 및 HTTPS(HTTP over TLS)와 관련된 다양한 작업에 사용할 수 있는 다목적 명령줄 도구입니다. 이 치트 시트 스타일 가이드는 일반적이고 일상적인 시나리오에서 유용한 OpenSSL 명령에 대한 빠른 참조를 제공합니다. 여기에는 개인 키 생성, 인증서 서명 요청 및 인증서 형식 변환을 위한 OpenSSL 예제가 포함됩니다. OpenSSL의 모든 용도를 다루지는 않습니다.

이 가이드를 사용하는 방법:

  • 인증서 서명 요청(CSR)에 익숙하지 않은 경우 첫 번째 섹션을 읽으십시오.
  • 첫 번째 섹션을 제외하고 이 가이드는 치트 시트 형식으로 되어 있습니다. 자체 포함된 명령줄 스니펫 목록입니다.
  • 완료하려는 작업과 관련된 섹션으로 이동합니다(힌트: 콘텐츠 메뉴 또는 브라우저의 찾기 기능 사용)
  • 대부분의 명령은 명확성을 위해 여러 줄로 확장된 한 줄짜리 명령입니다(\\ 기호 사용).

인증서 서명 요청(CSR) 정보

상용 인증 기관(CA)에서 SSL 인증서를 얻으려면 인증서 서명 요청(CSR)을 생성해야 합니다. CSR은 주로 키 쌍의 공개 키와 일부 추가 정보로 구성됩니다. 이 두 구성 요소는 인증서가 서명될 때 인증서에 삽입됩니다.

CSR을 생성할 때마다 인증서에 대한 정보를 제공하라는 메시지가 표시됩니다. 이 정보를 식별 이름(DN)이라고 합니다. DN의 중요한 필드는 인증서를 사용하려는 호스트의 정확한 정규화된 도메인 이름(FQDN)이어야 하는 일반 이름(CN)입니다. 명령줄을 통해 또는 파일에서 정보를 전달하여 CSR을 생성할 때 대화형 프롬프트를 건너뛸 수도 있습니다.

DN의 다른 항목은 비즈니스 또는 조직에 대한 추가 정보를 제공합니다. 인증 기관에서 SSL 인증서를 구입하는 경우 "조직\과 같은 추가 필드에 조직의 세부 정보를 정확하게 반영해야 하는 경우가 많습니다.

다음은 CSR 정보 프롬프트의 예입니다.

---
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:Brooklyn
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Brooklyn Company
Organizational Unit Name (eg, section) []:Technology Division
Common Name (e.g. server FQDN or YOUR name) []:examplebrooklyn.com
Email Address []:

CSR 정보 프롬프트에 비대화식으로 응답하려면 CSR 정보를 요청하는 OpenSSL 명령에 -subj 옵션을 추가하면 됩니다. 다음은 위의 코드 블록에 표시된 것과 동일한 정보를 사용하는 옵션의 예입니다.

-subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=examplebrooklyn.com"

이제 CSR을 이해했으므로 이 가이드에서 OpenSSL 요구 사항을 다루는 섹션으로 자유롭게 이동할 수 있습니다.

CSR 생성

이 섹션에서는 CSR(및 개인 키가 아직 없는 경우) 생성과 관련된 OpenSSL 명령을 다룹니다. CSR은 인증 기관에서 SSL 인증서를 요청하는 데 사용할 수 있습니다.

이전 섹션에서 언급한 -subj 옵션을 사용하여 비대화형으로 CSR 정보를 추가할 수 있음을 명심하십시오.

개인 키 및 CSR 생성

HTTPS(TLS를 통한 HTTP)를 사용하여 Apache HTTP 또는 Nginx 웹 서버를 보호하고 인증 기관(CA)을 사용하여 SSL 인증서를 발급하려는 경우 이 방법을 사용하십시오. 생성된 CSR은 CA 서명 SSL 인증서 발급을 요청하기 위해 CA로 보낼 수 있습니다. CA가 SHA-2를 지원하는 경우 -sha256 옵션을 추가하여 SHA-2로 CSR에 서명합니다.

이 명령은 처음부터 2048비트 개인 키(domain.key) 및 CSR(domain.csr)을 생성합니다.

  1. openssl req \
  2. -newkey rsa:2048 -nodes -keyout domain.key \
  3. -out domain.csr

CSR 정보 프롬프트에 응답하여 프로세스를 완료하십시오.

-newkey rsa:2048 옵션은 키가 RSA 알고리즘을 사용하여 생성된 2048비트여야 함을 지정합니다. -nodes 옵션은 개인 키가 암호 문구로 암호화되지 않도록 지정합니다. 여기에 포함되지 않았지만 암시된 -new 옵션은 CSR이 생성되고 있음을 나타냅니다.

기존 개인 키에서 CSR 생성

CA에서 인증서를 요청하는 데 사용할 개인 키가 이미 있는 경우 이 방법을 사용하십시오.

이 명령은 기존 개인 키(domain.key)를 기반으로 새 CSR(domain.csr)을 생성합니다.

  1. openssl req \
  2. -key domain.key \
  3. -new -out domain.csr

CSR 정보 프롬프트에 응답하여 프로세스를 완료하십시오.

-key 옵션은 새 CSR을 생성하는 데 사용할 기존 개인 키(domain.key)를 지정합니다. -new 옵션은 CSR이 생성되고 있음을 나타냅니다.

기존 인증서 및 개인 키에서 CSR 생성

기존 인증서를 갱신하고 싶지만 귀하 또는 귀하의 CA에 어떤 이유로 원래 CSR이 없는 경우 이 방법을 사용하십시오. 기본적으로 기존 인증서에서 해당 정보를 추출하므로 CSR 정보를 다시 입력하는 수고를 덜 수 있습니다.

이 명령은 기존 인증서(domain.crt) 및 개인 키(domain.key)를 기반으로 새 CSR(domain.csr)을 생성합니다. :

  1. openssl x509 \
  2. -in domain.crt \
  3. -signkey domain.key \
  4. -x509toreq -out domain.csr

-x509toreq 옵션은 X509 인증서를 사용하여 CSR을 생성하도록 지정합니다.

SSL 인증서 생성

SSL 인증서를 사용하여 서비스를 보호하고 싶지만 CA 서명 인증서가 필요하지 않은 경우 유효한(무료) 솔루션은 자체 인증서에 서명하는 것입니다.

직접 발급할 수 있는 일반적인 유형의 인증서는 자체 서명된 인증서입니다. 자체 서명된 인증서는 자체 개인 키로 서명된 인증서입니다. 자체 서명된 인증서는 CA 서명된 인증서와 마찬가지로 데이터를 암호화하는 데 사용할 수 있지만 컴퓨터나 브라우저에서 인증서를 신뢰할 수 없다는 경고가 사용자에게 표시됩니다. 따라서 자체 서명된 인증서는 사용자에게 서비스 ID를 증명할 필요가 없는 경우(예: 비프로덕션 또는 비공용 서버)에만 사용해야 합니다.

이 섹션에서는 자체 서명된 인증서 생성과 관련된 OpenSSL 명령에 대해 설명합니다.

자체 서명된 인증서 생성

HTTPS(TLS를 통한 HTTP)를 사용하여 Apache HTTP 또는 Nginx 웹 서버를 보호하고 CA에서 인증서를 서명할 필요가 없는 경우 이 방법을 사용하십시오.

이 명령은 처음부터 2048비트 개인 키(domain.key)와 자체 서명된 인증서(domain.crt)를 생성합니다.

  1. openssl req \
  2. -newkey rsa:2048 -nodes -keyout domain.key \
  3. -x509 -days 365 -out domain.crt

CSR 정보 프롬프트에 응답하여 프로세스를 완료하십시오.

-x509 옵션은 자체 서명된 인증서를 생성하도록 req에 지시합니다. -days 365 옵션은 인증서가 365일 동안 유효하도록 지정합니다. 인증서와 연결할 정보를 수집하기 위해 임시 CSR이 생성됩니다.

기존 개인 키에서 자체 서명된 인증서 생성

자체 서명된 인증서를 생성하려는 개인 키가 이미 있는 경우 이 방법을 사용하십시오.

이 명령은 기존 개인 키(domain.key)에서 자체 서명된 인증서(domain.crt)를 생성합니다.

  1. openssl req \
  2. -key domain.key \
  3. -new \
  4. -x509 -days 365 -out domain.crt

CSR 정보 프롬프트에 응답하여 프로세스를 완료하십시오.

-x509 옵션은 자체 서명된 인증서를 생성하도록 req에 지시합니다. -days 365 옵션은 인증서가 365일 동안 유효하도록 지정합니다. -new 옵션은 CSR 정보 프롬프트를 활성화합니다.

기존 개인 키 및 CSR에서 자체 서명된 인증서 생성

개인 키와 CSR이 이미 있고 이를 사용하여 자체 서명된 인증서를 생성하려는 경우 이 방법을 사용하십시오.

이 명령은 기존 개인 키(domain.key) 및 (domain.csr)에서 자체 서명된 인증서(domain.crt)를 생성합니다. :

  1. openssl x509 \
  2. -signkey domain.key \
  3. -in domain.csr \
  4. -req -days 365 -out domain.crt

-days 365 옵션은 인증서가 365일 동안 유효하도록 지정합니다.

인증서 보기

인증서 및 CSR 파일은 사람이 쉽게 읽을 수 없는 PEM 형식으로 인코딩됩니다.

이 섹션에서는 PEM 인코딩 파일의 실제 항목을 출력하는 OpenSSL 명령에 대해 설명합니다.

CSR 항목 보기

이 명령을 사용하면 CSR(domain.csr)의 내용을 일반 텍스트로 보고 확인할 수 있습니다.

  1. openssl req -text -noout -verify -in domain.csr

인증서 항목 보기

이 명령을 사용하면 인증서(domain.crt)의 내용을 일반 텍스트로 볼 수 있습니다.

  1. openssl x509 -text -noout -in domain.crt

인증서가 CA에 의해 서명되었는지 확인

이 명령을 사용하여 인증서(domain.crt)가 특정 CA 인증서(ca.crt)에 의해 서명되었는지 확인합니다.

  1. openssl verify -verbose -CAFile ca.crt domain.crt

개인 키

이 섹션에서는 개인 키 생성 및 확인과 관련된 OpenSSL 명령을 다룹니다.

개인 키 생성

이 명령을 사용하여 암호로 보호된 2048비트 개인 키(domain.key)를 만듭니다.

  1. openssl genrsa -des3 -out domain.key 2048

프로세스를 완료하라는 메시지가 표시되면 암호를 입력합니다.

개인 키 확인

이 명령을 사용하여 개인 키(domain.key)가 유효한 키인지 확인하십시오.

  1. openssl rsa -check -in domain.key

개인 키가 암호화된 경우 암호 문구를 입력하라는 메시지가 표시됩니다. 성공하면 암호화되지 않은 키가 터미널에 출력됩니다.

개인 키가 인증서 및 CSR과 일치하는지 확인

이 명령을 사용하여 개인 키(domain.key)가 인증서(domain.crt) 및 CSR(domain.csr)과 일치하는지 확인합니다. :

  1. openssl rsa -noout -modulus -in domain.key | openssl md5
  2. openssl x509 -noout -modulus -in domain.crt | openssl md5
  3. openssl req -noout -modulus -in domain.csr | openssl md5

각 명령의 출력이 동일하면 개인 키, 인증서 및 CSR이 관련되어 있을 가능성이 매우 높습니다.

개인 키 암호화

이것은 암호화되지 않은 개인 키(unencrypted.key)를 사용하여 암호화된 버전(encrypted.key)을 출력합니다.

  1. openssl rsa -des3 \
  2. -in unencrypted.key \
  3. -out encrypted.key

개인 키를 암호화하기 위해 원하는 암호 문구를 입력하십시오.

개인 키 해독

이것은 암호화된 개인 키(encrypted.key)를 사용하여 해독된 버전(decrypted.key)을 출력합니다.

  1. openssl rsa \
  2. -in encrypted.key \
  3. -out decrypted.key

메시지가 표시되면 암호화된 키의 암호 문구를 입력합니다.

인증서 형식 변환

우리가 작업한 모든 인증서는 ASCII PEM으로 인코딩된 X.509 인증서였습니다. 다양한 기타 인증서 인코딩 및 컨테이너 유형이 있습니다. 일부 응용 프로그램은 다른 형식보다 특정 형식을 선호합니다. 또한 이러한 형식 중 다수는 개인 키, 인증서 및 CA 인증서와 같은 여러 항목을 단일 파일에 포함할 수 있습니다.

OpenSSL은 인증서를 이러한 다양한 형식으로 변환하는 데 사용할 수 있습니다. 이 섹션에서는 가능한 변환 중 일부를 다룹니다.

PEM을 DER로 변환

PEM 인코딩 인증서(domain.crt)를 바이너리 형식인 DER 인코딩 인증서(domain.der)로 변환하려면 이 명령을 사용하십시오.

  1. openssl x509 \
  2. -in domain.crt \
  3. -outform der -out domain.der

DER 형식은 일반적으로 Java와 함께 사용됩니다.

DER을 PEM으로 변환

DER로 인코딩된 인증서(domain.der)를 PEM으로 인코딩된 인증서(domain.crt)로 변환하려면 이 명령을 사용하십시오.

  1. openssl x509 \
  2. -inform der -in domain.der \
  3. -out domain.crt

PEM을 PKCS7로 변환

PEM 인증서(domain.crtca-chain.crt)를 PKCS7 파일(domain.p7b)에 추가하려면 이 명령을 사용하십시오. ):

  1. openssl crl2pkcs7 -nocrl \
  2. -certfile domain.crt \
  3. -certfile ca-chain.crt \
  4. -out domain.p7b

하나 이상의 -certfile 옵션을 사용하여 PKCS7 파일에 추가할 인증서를 지정할 수 있습니다.

P7B라고도 하는 PKCS7 파일은 일반적으로 Java 키 저장소 및 Microsoft IIS(Windows)에서 사용됩니다. 인증서 및 CA 인증서를 포함할 수 있는 ASCII 파일입니다.

PKCS7을 PEM으로 변환

PKCS7 파일(domain.p7b)을 PEM 파일로 변환하려면 이 명령을 사용하십시오.

  1. openssl pkcs7 \
  2. -in domain.p7b \
  3. -print_certs -out domain.crt

PKCS7 파일에 여러 항목(예: 인증서 및 CA 중간 인증서)이 있는 경우 생성된 PEM 파일에는 모든 항목이 포함됩니다.

PEM을 PKCS12로 변환

개인 키(domain.key)와 인증서(domain.crt)를 가져와 PKCS12 파일( 도메인.pfx):

  1. openssl pkcs12 \
  2. -inkey domain.key \
  3. -in domain.crt \
  4. -export -out domain.pfx

내보내기 암호를 묻는 메시지가 표시되며 비워 둘 수 있습니다. 이 경우 단일 PEM 파일(domain.crt)에서 인증서를 연결하여 PKCS12 파일에 인증서 체인을 추가할 수 있습니다.

PFX 파일이라고도 하는 PKCS12 파일은 일반적으로 Microsoft IIS(Windows)에서 인증서 체인을 가져오고 내보내는 데 사용됩니다.

PKCS12를 PEM으로 변환

PKCS12 파일(domain.pfx)을 변환하고 PEM 형식(domain.combined.crt)으로 변환하려는 경우 이 명령을 사용합니다.

openssl pkcs12 \
       -in domain.pfx \
       -nodes -out domain.combined.crt

PKCS12 파일에 여러 항목(예: 인증서 및 개인 키)이 있는 경우 생성된 PEM 파일에는 모든 항목이 포함됩니다.

OpenSSL 버전

openssl version 명령을 사용하여 실행 중인 버전을 확인할 수 있습니다. 실행 중인 OpenSSL의 버전과 컴파일된 옵션은 사용 가능한 기능(때로는 명령줄 옵션)에 영향을 미칩니다.

다음 명령은 실행 중인 OpenSSL 버전과 함께 컴파일된 모든 옵션을 표시합니다.

openssl version -a

이 가이드는 다음 세부 정보(이전 명령의 출력)와 함께 OpenSSL 바이너리를 사용하여 작성되었습니다.

OpenSSL 1.1.1  11 Sep 2018
built on: Mon Aug 23 17:02:39 2021 UTC
platform: debian-amd64
options:  bn(64,64) rc4(16x,int) des(int) blowfish(ptr)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -Wa,--noexecstack -g -O2 -fdebug-prefix-map=/build/openssl-Flav1L/openssl-1.1.1=. -fstack-protector-strong -Wformat -Werror=format-security -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPADLOCK_ASM -DPOLY1305_ASM -DNDEBUG -Wdate-time -D_FORTIFY_SOURCE=2
OPENSSLDIR: "/usr/lib/ssl"
ENGINESDIR: "/usr/lib/x86_64-linux-gnu/engines-1.1"
Seeding source: os-specific

결론

그것은 대부분의 사람들이 OpenSSL을 사용하여 SSL 인증서로 작업하는 방법을 다루어야 합니다. 여기에서 다루지 않은 다른 많은 용도가 있으므로 의견에 다른 용도를 묻거나 제안하십시오.

명령에 문제가 있는 경우 주석을 달고 OpenSSL 버전 출력을 포함하십시오.