OpenSSL에서 체인 인증서를 만드는 방법

8039 단어 openssl
최근에는 상시 SSL화나, http/2 대응 등, 테스트 환경에서도 검증용의 TLS 증명서를 작성할 기회가 늘어 왔습니다.

OpenSSL을 이용한 증명서 작성에는 openssl ca 커멘드를 사용한 방법등, 여러가지 방법이 있습니다만, 증명서만을 간단하게 작성할 수 있는 방법을 정리합니다.

이번 만드는 구성



2018년 현재로 자주 사용되고 있는 RSA 2048bit 열쇠로 SHA-2인 증명서로,
이번에는, 루트 CA가 부하에 서버 증명서를 작성하는 구성(중간 CA 증명서 없음)으로 합니다.


1.CA 인증서 생성



먼저 체인 인증서의 루트 CA 인 CA 인증서를 만듭니다.

1-1. CA 비밀 키 생성


opnessl genrsa 명령을 사용하여 인증서의 개인 키를 생성합니다.
아래 명령은 표준 RSA 2048비트 키를 생성합니다.
openssl genrsa -out ca.key 2048

1-2. CSR(+공개키) 작성



1-1.에서 만든 개인 키를 기반으로 CSR을 만듭니다.
openssl req -new -key ca.key -out ca.csr

※ 상기 커맨드 실행 후에 CommonName 등의 필요 사항을 대화식으로 입력해 가는 형태가 됩니다만, -subj 라는 옵션을 이용하면, 대화식 입력 없이 인수에 지정한 정보로 작성할 수도 있다 합니다.

1-3. CA 인증서 작성



1-2.에서 만든 CSR에서 인증서를 만듭니다.

1-3-a. 증명 속성 정의 파일의 작성



CSR에 서명하기 전에 다음 ca.ext와 같은 내용의 인증서 속성 정의 파일을 작성하십시오.

CA 인증서용



ca.ext
# CA証明書用
[ v3_ca ]
basicConstraints = critical, CA:true
keyUsage = keyCertSign, cRLSign
extendedKeyUsage = serverAuth, clientAuth
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer

1-3-b. CSR에 서명하고 인증서 생성



루트 CA만은 자체 서명이어야 하며, 자체 서명의 경우 1-1.에서 작성한 개인 키로 1-2.의 CSR에 서명하는 형태가 됩니다.-signkey 선택적으로 서명에 사용할 개인 키를 지정합니다.
openssl x509 -req \
    -signkey ca.key \
    -extfile ca.ext \
    -extensions "v3_ca" \
    -in ca.csr \
    -out ca.crt \
    -days 3650 \
    -sha256

2. 서버 인증서 작성



지금까지 만든 CA의 개인 키와 인증서를 사용하여 서버 인증서를 생성 (발행)합니다.

2-1. 비밀키 생성



CA 개인 키를 만들 때와 동일합니다.
openssl genrsa -out server.key 2048

2-2. CSR(+공개키) 작성



여기도 CA와 마찬가지로 비밀 키를 기반으로 CSR을 만듭니다.
openssl req -new -key server.key -out server.csr

2-3. 인증서 작성



2-2.에서 만든 CSR에서 서버 인증서를 만듭니다.

2-3-a. 인증서 속성 정의 파일 작성



여기도 CA와 마찬가지로 CSR에 서명하기 전에 인증서 속성 정의 파일을 만듭니다.
이것은 CA 인증서용과 서버 인증서용으로 일부 속성이 다르기 때문에 CA 인증서 시에 작성한 것과는 별도로 작성합니다.
(이번에는 server.ext 라는 파일로 작성하기로 하겠습니다)

서버 인증서용



※ subjectAltName의 값은, 작성하는 서버 증명서로 설정하는 CommonName(CN)의 도메인에 재기록해 주세요.
도메인의 경우 DNS: 도메인 이름, IP 주소의 경우 IP: IP 주소 형식으로 지정합니다.

server.ext
# TLSサーバ証明書用
[ v3_server ]
basicConstraints = critical, CA:false
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
subjectAltName = DNS:www.example.com

2-3-b. CSR에 서명하고 인증서 생성



CA에서 체인 인증서로 발급하려면 -CAkey 선택적으로 CA 개인 키를 지정하고 -CA 선택적으로 CA 인증서를 지정합니다.
이렇게 하면 CA의 키가 CSR에 서명되고 체인 인증서가 됩니다.
openssl x509 -req \
    -CAkey ca.key \
    -CA ca.crt \
    -CAcreateserial \
    -extfile server.ext \
    -extensions "v3_server" \
    -in server.csr \
    -out server.crt \
    -days 365 \
    -sha256

3. 인증서 확인



작성한 증명서의 상세 정보는 이하의 커멘드로 내용을 확인할 수 있습니다.
openssl x509 -in server.crt -noout -text

이것으로 CA 인증서 및 서버 인증서 생성이 완료되었습니다.

절차만 요약



루트 CA 인증서 만들기


# 秘密鍵作成
openssl genrsa -out ca.key 2048

# CSR作成
openssl req -new -key ca.key -out ca.csr -subj "/C=JP/CN=Hogehoge CA"

# 証明書属性定義ファイル作成
cat << _EOF_ > ca.ext
[ v3_ca ]
basicConstraints = critical, CA:true
keyUsage = keyCertSign, cRLSign
extendedKeyUsage = serverAuth, clientAuth
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
_EOF_

# 自己署名でルート証明書を作成
openssl x509 -req -signkey ca.key -extfile ca.ext -extensions "v3_ca" -in ca.csr -out ca.crt -days 3650 -sha256

서버 인증서 작성 (루트 CA로 서명)


# 秘密鍵作成
openssl genrsa -out server.key 2048

# CSR作成
openssl req -new -key server.key -out server.csr -subj "/CN=www.hogehoge.com"

# 証明書属性定義ファイル作成
cat << _EOF_ > server.ext
[ v3_server ]
basicConstraints = critical, CA:false
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
subjectAltName = DNS:www.hogehoge.com
_EOF_

# ルート証明書で署名した証明書を作成
openssl x509 -req -CAkey ca.key -CA ca.crt -CAcreateserial -extfile server.ext -extensions "v3_server" -in server.csr -out server.crt -days 365 -sha256

좋은 웹페이지 즐겨찾기