DV 인증서 즉시 발급

API를 사용하여 DV 인증서를 주문할 때 많은 경우 인증서가 발급되기를 기다리면서 시간이 지나갑니다. 이 워크플로 가이드의 단계들을 따라서 DV 인증서 즉시 발급 기능을 이용하여 DV 인증서를 즉시 발급할 수 있어서 API 호출을 최대 70%까지 감소할 수 있습니다.

Encryption Everywhere DV 인증서를 요청하려면 이 단계를 따르고 계정에 대해 AuthKey를 구성해야 합니다. 그렇지 않은 경우, 요청을 제출할 때 auth_key_not_setup 오류를 받습니다.

개요

즉시 발급을 이용하려면 DV 인증서 주문을 제출하기 전에 이 단계를 완료해야 합니다.

  1. CertCentral 계정에 대한 AuthKey를 만듭니다.
  2. DV 인증서 주문에 대한 CSR(인증서 서명 요청)을 생성합니다.
  3. 타임스탬프를 만들어서 요청 토큰 유효 기간를 결정합니다.
  4. 자신의 AuthKey 및 CSR을 사용하여 요청 토큰을 만듭니다.
  5. DV 인증서로 보호할 생성된 요청 토큰을 도메인에 추가합니다.
  6. DV 인증서 주문을 제출합니다.

DV 인증서 주문을 제출할 때 모든 단계가 완료되면 즉시 DV 인증서를 발급하며 응답 본문에 포함하여 보냅니다. 건너뛴 단계가 있는 경우, 즉시 발급되지 않습니다.

단계 1: AuthKey 만들기

먼저 CertCentral 계정에 대한 AuthKey를 만듭니다. 이 키를 사용하여 도메인에 대한 제어를 제공하기 위한 요청 토큰을 생성합니다. Create AuthKey 엔드포인트에 POST로 AuthKey를 만들 수 있습니다.

이 엔드포인트에 POST가 성공적이면 200 OK HTTP 응답이 반환됩니다. 응답 본문은 2개 정보를 포함합니다.

  • auth_key_id - 만든 AuthKey의 고유한 ID입니다.
  • auth_key - CertCentral 계정에 대한 생성한 AuthKey입니다.

CertCentral 계정에 단 한 개의 AuthKey만 존재할 수 있습니다. 계정에 이미 AuthKey가 있는 경우 Create AuthKey 엔드포인트는 auth_key_exists_for_account 오류와 함께 400 Bad Request HTTP 응답을 반환합니다. 이 오류가 발생하는 경우, AuthKey 상세 정보 엔드포인트를 사용하여 기존 AuthKey를 받을 수 있습니다.

cURL
curl -X POST \
  https://www.digicert.com/services/v2/account/auth-key \
  -H 'Content-Type: application/json' \
  -H 'X-DC-DEVKEY: {{api_key}}'
200 OK
{
  "auth_key_id": "{{auth_key_id}}",
  "auth_key": "{{auth_key}}"
}
400 Bad Request
{
  "errors": [
    {
      "code": "auth_key_exists_for_account",
      "message": "An error occurred while processing your request."
    }
  ]
}

단계 2: CSR(인증서 서명 요청) 생성

계정에 대한 AuthKey를 갖고 있으면 다음 단계는 인증서 주문에 대한 CSR을 만드는 것입니다. 요청 토큰을 생성하려면 CSR이 필요합니다. 인증서를 설치할 서버에서 CSR을 생성해야 합니다.

CSR을 만드는 데 도움이 필요하십니까? CSR(인증서 서명 요청) 만들기를 참조하십시오.

단계 3: 타임스탬프 만들기

타임스탬프는 요청 토큰의 30일 유효 기간이 시작할 때를 결정합니다. 타임스탬프를 만들 때 결과로 나오는 유효 기간이 DV 인증서 주문을 제출할 때와 일치하게 합니다. 유효 기간 이전 또는 이후에 주문을 제출하는 경우, 즉시 발급은 발생하지 않습니다.

이후 날짜에 대한 타임스탬프를 만들 수 있습니다. 그렇지만 그 날짜 이전에 DV 인증서 주문을 제출하지 마십시오. 요청 토큰이 아직 "유효"하지 않기 때문에, 도메인을 유효성을 검사하는 데 사용될 수 없습니다.

요청 토큰의 유효 기간이 시작되는 시간을 결정한 후에 타임스탬프를 아래와 같은 형식으로 만드러야 합니다.

generic
yyyyMMddhhmmss

예를 들어, October 21, 2019 1:30:12 PM은(는) 20191021133012이(가) 됩니다.

단계 4: 요청 토큰 생성

요청 토큰은 타임스탬프의 데이터에서 결정한 30일 유효 기간이 있습니다. 요청 토큰을 생성할 때 30일 타임스탬프 기간이 DV 인증서 주문을 제출할 때와 일치하게 합니다.

이제 AuthKey, CSR 및 타임스탬프가 있으므로 도메인에 대한 제어를 증명하는 요청 토큰을 생성할 준비가 되었습니다. 이 요청 토큰으로 인증서를 주문하기 전에 DNS TXT 레코드 또는 fileauth.txt 파일을 설정할 수 있습니다.

요청 토큰을 생성하는 방법

  1. PEM 형식의 CSR에 타임스탬프를 앞에 추가하여 해시할 암호를 만듭니다.
  2. AuthKey를 키로 사용하고 HMAC-SHA256를 사용하여 암호를 해시합니다.
  3. 결과로 나오는 16진수 해시를 10진수(base10) 해시 값으로 변환합니다.
  4. 10진수 해시 값을 base36 해시 값으로 변환합니다.
  5. base36 해시 값이 최소 50자 이상인지 확인합니다. 그렇지 않은 경우, 50자가 될 때까지 앞에 영(0)을 추가합니다.
  6. base36 해시 값이 타임스탬프을 앞에 추가하여 최조 요청 토큰을 만듭니다.

이 예제 의사코드(pseudo-code)는 위 단계를 사용하여 요청 토큰을 생성하는 방법을 보여줍니다.

generic
# Declare AuthKey, CSR, and timestamp
auth_key = 'certcentral_account_auth_key'
csr = 'pem_formatted_csr'
timestamp = 'yyyyMMddhhmmss'

# Construct secret to be hashed
secret = timestamp + csr

# Hash secret using HMAC-SHA256 and auth_key
hash = hmac.sha256(secret, auth_key)

# Convert hexadecimal hash to decimal
decimal_hash = convertToBase10(hash)

# Convert decimal_hash to base36
base36_hash = convertToBase36(decimal_hash)

# If base36_hash length is < 50, prepend with zeros
valid_hash = base36_hash.padStart(50, '0')

# Construct final request token
request_token = timestamp + valid_hash

단계 5: 요청 토큰 복사

DV 인증서를 즉시 발급하려면 인증서를 주문하기 전에 요청 토큰을 다음 중 한 곳에 놓아야 합니다.

  • 도메인의 DNS에 TXT 레코드로 놓습니다.
  • 웹 사이트의 사전에 결정된 위치에 fileauth.txt 파일로 놓습니다.

요청 토큰을 위치에 놓으면 DV 인증서 주문을 제출할 수 있습니다.

DNS TXT

요청 토큰을 포함하는 DNS TXT 레코드를 만들어서 DV 인증서 주문에 도메인에 대한 제어를 증명할 수 있습니다. DNS TXT 레코드를 만들면 DV 인증서를 요청할 수 있습니다.

요청 토큰에 대한 DNS TXT를 사용할 때 dcv_method 값을 dns-txt-token(으)로 설정합니다.

  1. DNS 공급자의 사이트에서 새 TXT 레코드를 만듭니다.

  2. TXT Value 필드에 요청 토큰을 붙여넣습니다.

  3. 인증서 주문 및 보호할 도메인에 따라서 Host 필드에 다음 중 한 개를 수행합니다.

    • 기본 도메인(예, example.com)
      비워두거나 @ 기호를 입력합니다.(DNS 요구 사항을 따름)
    • 하위 도메인
      인증서로 보호할 하위 도메인을 입력합니다.
    • 권한 부여 도메인 이름
      _dnsauth를 입력합니다.
  4. 레코드 유형 필드(또는 상응하는 필드)에서 TXT를 선택합니다.

  5. TTL(Time-to-Live) 값을 선택하거나 DNS 공급자의 기본값을 사용합니다.

  6. 레코드를 저장합니다.

  7. DV 인증서 주문을 제출하며, dcv_methoddns-txt-token으로 설정합니다.

파일 인증

웹 사이트의 미리 결정된 위치에 요청 토큰을 포함하는 fileauth.txt 파일을 호스팅하여 DV 인증서 주문에 도메인에 대한 제어를 증명할 수 있습니다. 파일 인증을 사용할 때 일반적인 실수를 피하도록 합니다.

웹 사이트에서 파일을 사용 가능하게 되면 DV 인증서를 요청할 수 있습니다.

요청 토큰에 대한 파일 인증을 사용할 때 dcv_method 값을 http-token(으)로 설정합니다.

  1. 텍스트 편집기(예를 들어 메모장)을 시작하고 요청 토큰을 붙여 넣습니다.

  2. 파일을 fileauth.txt로 저장합니다.

  3. 웹 사이트의 다음 위치에서 파일을 사용하게 합니다.(필요에 따라 디렉터리를 만듭니다.)

    http://[domain.name]/.well-known/pki-validation/fileauth.txt

Windows 기반 서버의 경우 .well-known 폴더를 명령줄을 사용하여 만들어야 합니다: mkdir .well-known

  1. DV 인증서 주문을 제출하며, dcv_methodhttp-token으로 설정합니다.

단계 6: DV 인증서 주문 제출

요청 토큰을 놓았으면 DV 인증서 주문을 제출할 준비가 되었습니다. 이것은 DV SSL 주문 엔드포인트에 POST로 수행합니다.

이 엔드포인트에 POST가 성공적이면 201 Created HTTP 응답 코드가 반환됩니다. 모든 즉시 발급 요구 사항을 충족했으면 전체 인증서 체인이 응답 본문에서 반환됩니다.

DV 인증서를 주문할 때 dcv_method 값이 요청 토큰의 위치와 일치하는지 확인합니다.

누락된 사전 요구 사항이 있는 경우, 즉시 발급되지 않습니다. 전체 인증서 체인을 받는 대신에 표준 DV SSL 주문 응답 본문을 받을 것입니다.

cURL (DNS TXT)
curl -X POST \
  'https://www.digicert.com/services/v2/order/certificate/{{dv_ssl_certificate_id}}' \
  -H 'Content-Type: application/json' \
  -H 'X-DC-DEVKEY: {{api_key}}' \
  -d '{
    "certificate": {
        "common_name": "example.com",
        "csr": "<csr>",
        "server_platform": {
            "id": 2
        }
    },
    "validity_years": 1,
    "dcv_method": "dns-txt-token"
}'
cURL (File Auth)
curl -X POST \
  'https://www.digicert.com/services/v2/order/certificate/{{dv_ssl_certificate_id}}' \
  -H 'Content-Type: application/json' \
  -H 'X-DC-DEVKEY: {{api_key}}' \
  -d '{
    "certificate": {
        "common_name": "example.com",
        "csr": "<csr>",
        "server_platform": {
            "id": 2
        }
    },
    "validity_years": 1,
    "dcv_method": "http-token"
}'
201 Created
{
  "id": 112339,
  "certificate_id": 132345,
  "certificate_chain": [
    {
      "subject_common_name": "example.com",
      "pem": "<pem_certificate>"
    },
    {
      "subject_common_name": "DigiCert SHA2 Secure Server CA",
      "pem": "<pem_certificate>"
    },
    {
      "subject_common_name": "DigiCert Global Root CA",
      "pem": "<pem_certificate>"
    }
  ]
}