SSL 인증서 & HTTPS 설정 가이드

도메인 SSL 인증서 self-upload(신규·수정·최종 배포)와 HTTPS·HTTP2 설정을 API로 관리합니다.

개요 & 지원 프로토콜

본 API는 도메인에 대한 SSL 인증서 관리HTTPS / HTTP2 설정을 제공합니다. 고객이 직접 발급·보유한 인증서를 업로드(self-upload)하여 Speedy CDN 도메인에 적용할 수 있습니다. 모든 통신은 SSL(HTTPS) 기반 REST(HTTP POST/GET)이며, 응답은 application/json입니다.

BASE URL  ·  https://openapi.cloudn.co.kr/cdnservice/{Method Name}

인증 방식

모든 요청은 User Portal 계정으로 인증합니다. 비밀번호(password) 또는 API KEY(cloud_key_value)택1로 인증하며, form-data 방식은 폼 필드로, JSON 방식은 api_request.common 아래에 넣습니다.

공통 배포 흐름

인증서 배포와 도메인 HTTPS 설정은 공통으로 사전 배포(Staging) → 검증 → 최종 배포 절차를 따릅니다.

1

사전 배포

Staging 서버에만 반영 (실서비스 미반영)

2

Staging 검증

Staging IP로 직접 요청 + Host Header 지정해 동작 확인

3

최종 배포

검증 통과분을 실서비스에 반영

운영 반영 완료

운영 엣지에 적용

⚠️ 최초 적용 시 필수 순서 — 도메인에 인증서를 처음 적용할 때는 아래 순서를 반드시 지킵니다.
SSL 인증서 배포(최종까지) HTTPS ON 사전배포 Staging 검증 HTTPS ON 최종배포
최초 1회 연결 후에는 이미 HTTPS ON된 도메인은 인증서 배포(사전/최종)만으로 갱신됩니다.
실패 시 재시도 경로   사전배포 취소재사전배포재검증최종배포

API 목록

기능METHODURL (…/cdnservice/)형식
SSL 신규 등록 사전배포POSTssl/staging/deployform-data
SSL 수정 사전배포POSTssl/staging/updateform-data
SSL 최종 배포POSTssl/updateform-data
SSL 사전배포 취소POSTssl/staging/cancelform-data
SSL 상세 / 목록 / 이력 / 삭제POSTssl/info · ssl/list · ssl/history · ssl/deleteJSON
HTTPS·HTTP2 ON 사전배포POSTdomain/staging/https/settingsform-data
HTTPS·HTTP2 ON 최종배포POSTdomain/https/settingsform-data
HTTPS 사전배포 취소 / 이력 / 상세 / 목록POST/GETdomain/staging/https/cancel · domain/config/history · domains/info · domains/listform-data / JSON
POST

SSL 인증서 신규 등록 사전배포 (Staging)

🔷 form-data
https://openapi.cloudn.co.kr/cdnservice/ssl/staging/deploy

인증서를 시스템 DB에 등록하고 연결 도메인 대상으로 Staging 배포합니다. 인증서(.crt)와 개인키(.key)는 분리된 파일로 업로드하며(합본 .pem 미지원), CN이 대상 도메인과 일치해야 합니다.

파라미터
구분ParameterRequiredDescription비고
commonidY계정 IDex) speedy
password택1계정 비밀번호password 또는 cloud_key_value 중 1개 필수
cloud_key_value택1계정 API KEY
datassl_certY인증서 crt 파일 (MultipartFile).crt
ssl_keyY인증서 key 파일 (MultipartFile).key
ssl_key_password선택개인키 암호암호화 시 필수
domain_list선택배포 도메인 목록다중 시 , 구분
memo선택메모
Request · curl
curl -X POST 'https://openapi.cloudn.co.kr/cdnservice/ssl/staging/deploy' \
  -F 'id=speedy' \
  -F 'password=********' \
  -F 'ssl_cert=@ic.speedykorea.com.crt' \
  -F 'ssl_key=@ic.speedykorea.com.key' \
  -F 'domain_list=ic.speedykorea.com'
Response
{
  "api_response": {
    "result_msg": "success",
    "data": {
      "ssl_file_name": "ic.speedykorea.com",
      "domain_list": "ic.speedykorea.com"
    },
    "result_code": "200"
  }
}
POST

SSL 인증서 수정 사전배포 (Staging)

🔷 form-data
https://openapi.cloudn.co.kr/cdnservice/ssl/staging/update

기존 인증서를 갱신하거나 도메인 매핑을 추가/삭제합니다. 인증서 갱신 시 신규 배포와 동일 요건을 만족해야 합니다.

파라미터
구분ParameterRequiredDescription비고
commonidY계정 IDex) speedy
password택1계정 비밀번호password 또는 cloud_key_value 중 1개 필수
cloud_key_value택1계정 API KEY
datassl_file_nameY최초 배포 시 등록한 인증서 파일명확장자 없이
ssl_cert / ssl_key선택갱신 시 새 crt/key
ssl_key_password선택개인키 암호
add_domain_list선택매핑 추가 도메인다중 , 구분
del_domain_list선택매핑 해제 도메인다중 , 구분
memo선택메모
Request · curl (인증서 갱신)
curl -X POST 'https://openapi.cloudn.co.kr/cdnservice/ssl/staging/update' \
  -F 'id=speedy' -F 'password=********' \
  -F 'ssl_file_name=ic.speedykorea.com' \
  -F 'ssl_cert=@ic.speedykorea.com.crt' \
  -F 'ssl_key=@ic.speedykorea.com.key'
Response
{
  "api_response": {
    "result_msg": "success",
    "data": {
      "ssl_file_name": "ic.speedykorea.com",
      "add_domain_list": "ic.speedykorea.com"
    },
    "result_code": "200"
  }
}
POST

SSL 인증서 최종 배포

🔷 form-data
https://openapi.cloudn.co.kr/cdnservice/ssl/update

사전 배포(Staging)한 내용을 실제 서비스로 최종 배포합니다. 사전 배포가 성공적으로 등록된 인증서만 대상입니다.

파라미터
구분ParameterRequiredDescription비고
commonidY계정 IDex) speedy
password택1계정 비밀번호password 또는 cloud_key_value 중 1개 필수
cloud_key_value택1계정 API KEY
datassl_file_nameY인증서 파일명확장자 없이
Request · curl
curl -X POST 'https://openapi.cloudn.co.kr/cdnservice/ssl/update' \
  -F 'id=speedy' -F 'password=********' \
  -F 'ssl_file_name=ic.speedykorea.com'
Response
{
  "api_response": {
    "result_msg": "success",
    "data": { "ssl_file_name": "ic.speedykorea.com" },
    "result_code": "200"
  }
}
POST

SSL 상세 조회

🔷 JSON
https://openapi.cloudn.co.kr/cdnservice/ssl/info

인증서 상세 정보를 조회합니다. 목록은 ssl/list(data:{}), 이력은 ssl/history, 삭제는 ssl/delete(연결 도메인 없는 인증서만)를 동일 JSON 형식으로 호출합니다.

파라미터
구분ParameterRequiredDescription비고
commonidY계정 IDex) speedy
password택1계정 비밀번호password 또는 cloud_key_value 중 1개 필수
cloud_key_value택1계정 API KEY
datassl_file_nameY인증서 파일명
Request · JSON
{
  "api_request": {
    "common": { "id": "speedy", "password": "********" },
    "data": { "ssl_file_name": "ic.speedykorea.com" }
  }
}
Response
{
  "api_response": {
    "result_msg": "success",
    "data": {
      "ssl_file_name": "ic.speedykorea.com",
      "domain_list": ["ic.speedykorea.com"],
      "valid_from": "2026-07-27 16:21:30",
      "expires_at": "2026-10-25 16:21:29",
      "is_active": "Y",
      "cert_path": "ssl/ic.speedykorea.com/ic.speedykorea.com.crt",
      "key_path":  "ssl/ic.speedykorea.com/ic.speedykorea.com.key"
    },
    "result_code": "200"
  }
}
POST

도메인 HTTPS · HTTP2 ON 사전배포 (Staging)

🔶 form-data
https://openapi.cloudn.co.kr/cdnservice/domain/staging/https/settings

HTTPS(listen 443)·HTTP2 설정을 Staging에 반영합니다. 사전 배포 후 Staging 서버 IP로 직접 요청하고 Host Header에 도메인을 지정해 검증합니다.

파라미터
구분ParameterRequiredDescription비고
commonidY계정 IDex) speedy
password택1계정 비밀번호password 또는 cloud_key_value 중 1개 필수
cloud_key_value택1계정 API KEY
datadomainY대상 도메인ex) ic.speedykorea.com
httpsYHTTPS 설정on / off
http2YHTTP2 설정on / off
Request · curl
curl -X POST 'https://openapi.cloudn.co.kr/cdnservice/domain/staging/https/settings' \
  -F 'id=speedy' -F 'password=********' \
  -F 'domain=ic.speedykorea.com' \
  -F 'https=on' -F 'http2=on'
Response
{
  "api_response": { "result_msg": "success", "result_code": "200" }
}
검증 · Staging IP 조회 (domain/config/history)
# config_list[].pv_ip (action_text=pre-deploy)
openssl s_client -connect <STAGING_IP>:443 \
  -servername ic.speedykorea.com -tls1_2
# subject=CN=ic.speedykorea.com
# Verify return code: 0 (ok)
POST

도메인 HTTPS · HTTP2 ON 최종 배포

🔶 form-data
https://openapi.cloudn.co.kr/cdnservice/domain/https/settings

사전 배포(Staging)한 설정을 실제 서비스에 반영합니다.

파라미터
구분ParameterRequiredDescription비고
commonidY계정 IDex) speedy
password택1계정 비밀번호password 또는 cloud_key_value 중 1개 필수
cloud_key_value택1계정 API KEY
datadomainY대상 도메인
Request · curl
curl -X POST 'https://openapi.cloudn.co.kr/cdnservice/domain/https/settings' \
  -F 'id=speedy' -F 'password=********' \
  -F 'domain=ic.speedykorea.com'
Response
{
  "api_response": { "result_msg": "success", "result_code": "200" }
}

실전 예제 — Let's Encrypt 인증서 self-upload

도메인 ic.speedykorea.com(download 서비스)에 Let's Encrypt 인증서를 발급해 self-upload하고 HTTPS를 최초로 켠 전체 과정입니다.

1

LE 인증서 발급

certbot DNS-01
CN=ic.speedykorea.com

2

SSL 사전배포

ssl/staging/deploy
+ domain_list

3

SSL 최종배포

ssl/update

4

HTTPS ON 사전배포

domain/staging/
https/settings

5

Staging 검증

Host헤더+Staging IP
verify=0(OK)

6

HTTPS ON 최종배포

https_enabled: true

① 인증서 발급 (certbot DNS-01)

TXT 레코드 _acme-challenge.ic.speedykorea.com에 검증값을 등록하면 발급됩니다. 발급물 fullchain.pem.crt, privkey.pem.key로 분리해 업로드합니다(RSA 2048 권장).

결과 확인

domains/infohttps_enabledtrue로 전환되고, 운영 엣지 TLS 핸드셰이크에서 인증서 체인 검증이 통과(Verify return code: 0)하면 완료입니다.

✅ 검증 완료 — 운영 엣지 전 노드 정상 인증서 서빙, 체인 검증 OK, HTTPS 종단 정상.
① 발급
# DNS-01, RSA 2048
certbot certonly --manual \
  --preferred-challenges dns \
  -d ic.speedykorea.com \
  --key-type rsa --rsa-key-size 2048
②~⑥ 배포 & 검증
# ② SSL 사전배포
POST /ssl/staging/deploy       -> 200
# ③ SSL 최종배포
POST /ssl/update               -> 200
# ④ HTTPS ON 사전배포
POST /domain/staging/https/settings
     https=on http2=on         -> 200
# ⑤ Staging 검증 (TLS 1.2)
openssl s_client -connect <IP>:443 \
  -servername ic.speedykorea.com -tls1_2
  # CN=ic.speedykorea.com / verify=0
# ⑥ HTTPS ON 최종배포
POST /domain/https/settings    -> 200
⚠️ TLS 버전 — CDN 엣지는 TLS 1.2까지 지원(1.3 미지원). 구형 클라이언트(예: macOS 기본 LibreSSL)가 1.3 우선 협상 시 alert이 날 수 있으므로 TLS 1.2로 검증하세요.

에러 코드 & 유의사항

result_code의미대응
200성공
401인증 정보 오류 (invalid auth info)id / password(또는 API KEY) 확인
403도메인 접근 권한 없음도메인이 속한 계정으로 인증
E500SSL mapping not found 등인증서→도메인 매핑(domain_list) 반영 후 재시도
  • 매핑 반영 지연 — 최종 배포 직후 인증서→도메인 매핑 반영에 수 초가 걸릴 수 있습니다. HTTPS ON 사전배포가 "SSL mapping not found"로 실패하면 잠시 후 재시도하세요.
  • 최초 vs 갱신 — 최초 1회는 HTTPS ON(사전→검증→최종)까지 완료해야 도메인과 인증서가 연결됩니다. 이후 갱신은 인증서 배포만으로 반영됩니다.
  • 인증서 만료 관리 — Let's Encrypt는 90일 유효. 만료 전 재발급 → ssl/staging/update(갱신) → ssl/update로 교체합니다.

Speedy CDN OpenAPI Manual · SSL 인증서 & HTTPS 설정 가이드