2.5. 자체 인증서 생성

2.5.1. 사전 요구 사항

2.5.1.1. OpenSSL 유틸리티

이 섹션에 설명된 단계는 OpenSSL 프로젝트의 OpenSSL 명령줄 유틸리티를 기반으로 합니다. OpenSSL 명령줄 유틸리티에 대한 추가 문서는 http://www.openssl.org/docs/ 에서 확인할 수 있습니다.

2.5.1.2. CA 디렉터리 구조 샘플

설명을 위해 CA 데이터베이스에는 다음과 같은 디렉터리 구조가 있다고 가정합니다.

X509CA/ca

X509CA/certs

X509CA/newcerts

X509CA/crl

여기서 X509CA 는 CA 데이터베이스의 상위 디렉터리입니다.

2.5.2. 자체 CA 설정

2.5.2.1. 수행할 하위 단계

이 섹션에서는 자체 개인 CA를 설정하는 방법을 설명합니다. 실제 배포를 위해 CA를 설정하기 전에 2.2.3절. “개인 인증 기관” 에서 추가 노트를 읽으십시오.

자체 CA를 설정하려면 다음 단계를 수행합니다.

2.5.2.2. bin 디렉토리를 PATH에 추가합니다.

보안 CA 호스트에서 OpenSSL bin 디렉토리를 경로에 추가합니다.

Windows

> set PATH=OpenSSLDir\bin;%PATH%

UNIX

% PATH=OpenSSLDir/bin:$PATH; export PATH

이 단계에서는 명령줄에서 openssl 유틸리티를 사용할 수 있습니다.

2.5.2.3. CA 디렉터리 계층 구조 생성

새 CA를 저장할 새 디렉터리 X509CA 를 만듭니다. 이 디렉터리는 CA와 연결된 모든 파일을 보유하는 데 사용됩니다. X509CA 디렉토리에서 다음 디렉터리 계층 구조를 생성합니다.

X509CA/ca

X509CA/certs

X509CA/newcerts

X509CA/crl

2.5.2.4. openssl.cnf 파일을 복사하고 편집합니다.

OpenSSL 설치의 샘플 openssl.cnfX509CA 디렉터리에 복사합니다.

X509CA 디렉터리의 디렉터리 구조를 반영하고 새 CA에서 사용하는 파일을 식별하도록 openssl.cnf 를 편집합니다.

openssl.cnf 파일의 [CA_default] 섹션을 다음과 같이 편집합니다.

#############################################################
[ CA_default ]

dir        = X509CA            # Where CA files are kept
certs      = $dir/certs  # Where issued certs are kept
crl_dir    = $dir/crl          # Where the issued crl are kept
database   = $dir/index.txt    # Database index file
new_certs_dir = $dir/newcerts  # Default place for new certs

certificate   = $dir/ca/new_ca.pem # The CA certificate
serial        = $dir/serial        # The current serial number
crl           = $dir/crl.pem       # The current CRL
private_key   = $dir/ca/new_ca_pk.pem  # The private key
RANDFILE      = $dir/ca/.rand
# Private random number file

x509_extensions = usr_cert  # The extensions to add to the cert
...

이 시점에서 OpenSSL 구성의 다른 세부 정보를 편집하도록 결정할 수 있습니다. 자세한 내용은 http://www.openssl.org/docs/ 을 참조하십시오.

2.5.2.5. CA 데이터베이스 초기화

X509CA 디렉토리에서 serialindex.txt 두 파일을 초기화합니다.

Windows

Windows에서 직렬 파일을 초기화하려면 다음 명령을 입력합니다.

> echo 01 > serial

Windows의 빈 파일 index.txt 를 만들려면 다음과 같이 X509CA 디렉터리의 명령줄에서 Windows 메모장을 시작합니다.

> notepad index.txt

텍스트가 포함된 대화 상자에 대한 응답으로 text.txt 파일을 찾을 수 없습니다. 새 파일을 생성하시겠습니까?, 를 클릭하고 메모장을 닫습니다.

UNIX

UNIX에서 직렬 파일 및 index.txt 파일을 초기화하려면 다음 명령을 입력합니다.

% echo "01" > serial
% touch index.txt

이러한 파일은 CA에서 인증서 파일의 데이터베이스를 유지 관리하는 데 사용됩니다.

참고

index.txt 파일은 공백도 포함하지 않고 처음에 완전히 비어 있어야 합니다.

2.5.2.6. 자체 서명된 CA 인증서 및 개인 키 생성

다음 명령을 사용하여 자체 서명된 새 CA 인증서 및 개인 키를 생성합니다.

openssl req -x509 -new -config X509CA/openssl.cnf -days 365 -out X509CA/ca/new_ca.pem -keyout X509CA/ca/new_ca_pk.pem

이 명령은 CA 개인 키에 대한 패스 문구와 CA 고유 이름의 세부 정보를 입력하라는 메시지를 표시합니다. 예를 들면 다음과 같습니다.

Using configuration from X509CA/openssl.cnf
Generating a 512 bit RSA private key
....++
.++
writing new private key to 'new_ca_pk.pem'
Enter PEM pass phrase:
Verifying password - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be
incorporated into your certificate request.
What you are about to enter is what is called a Distinguished
Name or a DN. There are quite a few fields but you can leave
some blank. For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:IE
State or Province Name (full name) []:Co. Dublin
Locality Name (eg, city) []:Dublin
Organization Name (eg, company) []:Red Hat
Organizational Unit Name (eg, section) []:Finance
Common Name (eg, YOUR name) []:Gordon Brown
Email Address []:gbrown@redhat.com
참고

CA의 보안은 이 단계에서 사용되는 개인 키 파일의 보안 및 개인 키 전달 구문에 따라 달라집니다.

CA 인증서 및 개인 키의 파일 이름과 위치, new_ca.pemnew_ca_pk.pemopenssl.cnf 에 지정된 값과 동일한지 확인해야 합니다(이전 단계 참조).

이제 CA로 인증서에 서명할 준비가 되었습니다.

2.5.3. CA를 사용하여 Java 키 저장소에서 서명된 인증서 생성

2.5.3.1. 수행할 하위 단계

JKS(Java 키 저장소), CertName.jks 에서 인증서를 생성하고 서명하려면 다음 하위 단계를 수행합니다.

2.5.3.2. Java bin 디렉토리를 PATH에 추가합니다.

아직 수행하지 않은 경우 경로에 Java bin 디렉토리를 추가합니다.

Windows

> set PATH=JAVA_HOME\bin;%PATH%

UNIX

% PATH=JAVA_HOME/bin:$PATH; export PATH

이 단계에서는 명령줄에서 keytool 유틸리티를 사용할 수 있습니다.

2.5.3.3. 인증서 및 개인 키 쌍 생성

명령 프롬프트를 열고 키 저장소 파일 KeystoreDir 을 저장하는 디렉터리로 디렉터리를 변경합니다. 다음 명령을 실행합니다.

keytool -genkey -dname "CN=Alice, OU=Engineering, O=Progress, ST=Co. Dublin, C=IE" -validity 365 -alias CertAlias -keypass CertPassword -keystore CertName.jks -storepass CertPassword

-genkey 옵션으로 호출되는 이 keytool 명령은 X.509 인증서 및 일치하는 개인 키를 생성합니다. 인증서와 키는 모두 새로 생성된 키 저장소인 CertName.jks의 키 항목에 배치됩니다. 지정된 키 저장소 CertName.jks 이므로 명령을 실행하기 전에는 존재하지 않아 keytool 에서 새 키 저장소를 암시적으로 생성합니다.

-dname-validity 플래그는 새로 생성된 X.509 인증서의 내용을 정의하여 각각 제목 DN과 만료 날짜를 지정합니다. DN 형식에 대한 자세한 내용은 부록 A. ASN.1 및 Distinguished Names 을 참조하십시오.

제목 DN의 일부 부분은 CA 인증서의 값과 일치해야 합니다( openssl.cnf 파일의 CA 정책 섹션에 지정되어 있음). 기본 openssl.cnf 파일은 다음 항목이 일치해야 합니다.

  • 국가 이름 (C)
  • 시/도 이름(ST)
  • 조직 이름(O)
참고

제약 조건을 준수하지 않으면 OpenSSL CA가 인증서에 서명하지 않습니다( “CSR에 서명” 참조).

2.5.3.4. 인증서 서명 요청 생성

다음과 같이 CertName.jks 인증서에 대한 새 CSR(인증서 서명 요청)을 생성합니다.

keytool -certreq -alias CertAlias -file CertName_csr.pem -keypass CertPassword -keystore CertName.jks -storepass CertPassword

이 명령은 CSR을 CertName_csr.pem 파일로 내보냅니다.

2.5.3.5. CSR에 서명

다음과 같이 CA를 사용하여 CSR에 서명합니다.

openssl ca -config X509CA/openssl.cnf -days 365 -in CertName_csr.pem -out CertName.pem

인증서에 서명하려면 CA 개인 키 전달 문구를 입력해야 합니다( 2.5.2절. “자체 CA 설정”참조).

참고

기본 CA 이외의 CA 인증서를 사용하여 CSR에 서명하려면 -cert-keyfile 옵션을 사용하여 CA 인증서와 개인 키 파일을 각각 지정합니다.

2.5.3.6. PEM 형식으로 변환

서명된 인증서 CertName.pem 을 다음과 같이 PEM 전용 형식으로 변환합니다.

openssl x509 -in CertName.pem -out CertName.pem -outform PEM

2.5.3.7. 파일 연결

다음과 같이 CA 인증서 파일과 CertName.pem 인증서 파일을 연결합니다.

Windows

copy CertName.pem + X509CA\ca\new_ca.pem CertName.chain

UNIX

cat CertName.pem X509CA/ca/new_ca.pem> CertName.chain

2.5.3.8. 전체 인증서 체인으로 키 저장소를 업데이트

다음과 같이 인증서의 전체 인증서 체인을 가져와 키 저장소 CertName.jks 를 업데이트합니다.

keytool -import -file CertName.chain -keypass CertPassword -keystore CertName.jks -storepass CertPassword

2.5.3.9. 필요에 따라 단계를 반복

2~7단계를 반복하여 시스템에 대한 전체 인증서 세트를 생성합니다.

2.5.4. CA를 사용하여 서명된 PKCS#12 인증서 만들기

2.5.4.1. 수행할 하위 단계

2.5.2절. “자체 CA 설정” 에 설명된 대로 개인 CA를 설정한 경우 이제 자체 인증서를 생성하고 서명할 준비가 된 것입니다.

PKCS#12 형식 CertName.p12 에서 인증서를 생성하고 서명하려면 다음 하위 단계를 수행합니다.

2.5.4.2. bin 디렉토리를 PATH에 추가합니다.

아직 수행하지 않은 경우 다음과 같이 OpenSSL bin 디렉토리를 경로에 추가합니다.

Windows

> set PATH=OpenSSLDir\bin;%PATH%

UNIX

% PATH=OpenSSLDir/bin:$PATH; export PATH

이 단계에서는 명령줄에서 openssl 유틸리티를 사용할 수 있습니다.

2.5.4.3. subjectAltName 확장 구성(선택 사항)

인증서가 URL 무결성 검사를 적용하는 HTTPS 서버용이고 다중 홈 호스트 또는 여러 DNS 이름 별칭이 있는 호스트(예: 다중 홈 웹 서버에 인증서를 배포하는 경우)에 서버를 배포하려는 경우입니다. 이 경우 인증서 ID는 여러 호스트 이름과 일치해야 하며 subjectAltName 인증서 확장만 추가할 수 있습니다( 2.4절. “HTTPS 인증서에 대한 특수 요구 사항”참조).

subjectAltName 확장자를 구성하려면 다음과 같이 CA의 openssl.cnf 파일을 편집합니다.

  1. [req] 섹션에 다음 req_extensions 설정을 추가합니다( openssl.cnf 파일에 없는 경우).

    # openssl Configuration File
    ...
    [req]
    req_extensions=v3_req
  2. [v3_req] 섹션 헤더를 추가합니다( openssl.cnf 파일에 아직 없는 경우). [v3_req] 섹션에서 subjectAltName 설정을 추가하거나 수정하여 DNS 호스트 이름 목록으로 설정합니다. 예를 들어 서버 호스트가 대체 DNS 이름인 www.redhat.comjboss.org 를 지원하는 경우 subjectAltName 을 다음과 같이 설정합니다.

    # openssl Configuration File
    ...
    [v3_req]
    subjectAltName=DNS:www.redhat.com,DNS:jboss.org
  3. 적절한 CA 구성 섹션에 copy_extensions 설정을 추가합니다. 인증서 서명에 사용되는 CA 구성 섹션은 다음 중 하나입니다.

    • openssl ca 명령의 -name 옵션에 지정된 섹션
    • [ca] 섹션 아래의 default_ca 설정에서 지정하는 섹션(일반적으로 [CA_default]).

      예를 들어 적절한 CA 구성 섹션이 [CA_default] 인 경우 다음과 같이 copy_extensions 속성을 설정합니다.

      # openssl Configuration File
      ...
      [CA_default]
      copy_extensions=copy

      이 설정을 사용하면 인증서 서명 요청에 있는 인증서 확장이 서명된 인증서로 복사됩니다.

2.5.4.4. 인증서 서명 요청 생성

다음과 같이 CertName.p12 인증서에 대한 새 CSR(인증서 서명 요청)을 생성합니다.

openssl req -new -config X509CA/openssl.cnf -days 365 -out X509CA/certs/CertName_csr.pem -keyout X509CA/certs/CertName_pk.pem

이 명령은 인증서의 개인 키에 대한 패스 문구와 인증서의 고유 이름에 대한 정보를 입력하라는 메시지를 표시합니다.

CSR 고유 이름의 일부 항목은 CA 인증서의 값과 일치해야 합니다( openssl.cnf 파일의 CA 정책 섹션에서 지정됨). 기본 openssl.cnf 파일을 사용하려면 다음 항목이 일치해야 합니다.

  • 국가 이름
  • 시/도 이름
  • 조직 이름

인증서 제목 DN의 일반 이름은 일반적으로 인증서 소유자의 ID를 나타내는 데 사용되는 필드입니다. 일반 이름은 다음 조건을 준수해야 합니다.

  • OpenSSL 인증 기관에서 생성한 모든 인증서에 대해 공통 이름을 구분해야 합니다.
  • HTTPS 클라이언트가 URL 무결성 검사를 구현하는 경우 일반 이름이 인증서를 배포할 호스트의 DNS 이름과 동일한지 확인해야 합니다( 2.4절. “HTTPS 인증서에 대한 특수 요구 사항”참조).
참고

HTTPS URL 무결성 검사의 목적을 위해 subjectAltName 확장이 Common Name보다 우선합니다.

Using configuration from X509CA/openssl.cnf
Generating a 512 bit RSA private key
.++
.++
writing new private key to
      'X509CA/certs/CertName_pk.pem'
Enter PEM pass phrase:
Verifying password - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be
incorporated into your certificate request.
What you are about to enter is what is called a Distinguished
Name or a DN. There are quite a few fields but you can leave
some blank. For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:IE
State or Province Name (full name) []:Co. Dublin
Locality Name (eg, city) []:Dublin
Organization Name (eg, company) []:Red Hat
Organizational Unit Name (eg, section) []:Systems
Common Name (eg, YOUR name) []:Artix
Email Address []:info@redhat.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:password
An optional company name []:Red Hat

2.5.4.5. CSR에 서명

다음과 같이 CA를 사용하여 CSR에 서명합니다.

openssl ca -config X509CA/openssl.cnf -days 365 -in X509CA/certs/CertName_csr.pem -out X509CA/certs/CertName.pem

이 명령에는 new_ca.pem CA 인증서와 연결된 개인 키에 대한 암호 문구가 필요합니다. 예를 들면 다음과 같습니다.

Using configuration from X509CA/openssl.cnf
Enter PEM pass phrase:
Check that the request matches the signature
Signature ok
The Subjects Distinguished Name is as follows
countryName :PRINTABLE:'IE'
stateOrProvinceName :PRINTABLE:'Co. Dublin'
localityName :PRINTABLE:'Dublin'
organizationName :PRINTABLE:'Red Hat'
organizationalUnitName:PRINTABLE:'Systems'
commonName :PRINTABLE:'Bank Server Certificate'
emailAddress :IA5STRING:'info@redhat.com'
Certificate is to be certified until May 24 13:06:57 2000 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

인증서에 서명하려면 CA 개인 키 전달 문구를 입력해야 합니다( 2.5.2절. “자체 CA 설정”참조).

참고

openssl.cnf 파일의 [CA_default] 섹션에 copy_extensions=copy 를 설정하지 않은 경우 서명된 인증서에는 원래 CSR에 있는 인증서 확장 기능이 포함되지 않습니다.

2.5.4.6. 파일 연결

다음과 같이 CA 인증서 파일 CertName.pem 인증서 파일 및 CertName_pk.pem 개인 키 파일을 연결합니다.

Windows

copy X509CA\ca\new_ca.pem + X509CA\certspass:quotes[_CertName_].pem + X509CA\certspass:quotes[_CertName_]_pk.pem X509CA\certspass:quotes[_CertName_]_list.pem

UNIX

cat X509CA/ca/new_ca.pem X509CA/certs/CertName.pem X509CA/certs/CertName_pk.pem > X509CA/certs/CertName_list.pem

2.5.4.7. PKCS#12 파일 생성

다음과 같이 CertName_list.pem 파일에서 PKCS#12 파일을 생성합니다.

openssl pkcs12 -export -in X509CA/certs/CertName_list.pem -out X509CA/certs/CertName.p12 -name "New cert"

PKCS#12 인증서를 암호화하기 위한 암호를 입력하라는 메시지가 표시됩니다. 일반적으로 이 암호는 CSR 암호와 동일합니다. 이 암호는 많은 인증서 리포지토리에 필요합니다.

2.5.4.8. 필요에 따라 단계를 반복

3~6단계를 반복하여 시스템에 대한 전체 인증서 세트를 생성합니다.

1. (선택 사항) subjectAltName 확장을 지웁니다.

특정 호스트 시스템에 대한 인증서를 생성한 후 openssl.cnf 파일에서 subjectAltName 설정을 지워 실수로 다른 인증서 세트에 잘못된 DNS 이름을 할당하지 않는 것이 좋습니다.

openssl.cnf 파일에서 subjectAltName 설정을 주석 처리하고(행 시작 시 # 문자를 추가하여) copy_extensions 설정을 주석 처리합니다.