CSMS 연동 문서
CSMS Integration
PnC(ISO 15118 Plug & Charge) 연동 가이드
충전기 제조사용

0. 문서 개요

PnC는 차량이 케이블 연결만으로 계약 인증서(eMAID)로 인증되는 기능입니다. 본 문서는 충전기(SECC)가 CSMS와 주고받아야 하는 OCPP 1.6 메시지 규격과 CSMS의 동작을 정의합니다. EV↔충전기 구간의 ISO 15118-2 자체 구현(TLS·EXI·V2G 메시지)은 한국환경공단 「공공 V2G PKI 및 PnC 가이드라인」을 따릅니다.
규격 정본비고
OCA 「Using ISO 15118 Plug & Charge with OCPP 1.6」 v1.0 (2020-09-16)OCPP 1.6 매핑(DataTransfer 래핑) 정본
「공공 V2G PKI 및 PnC 가이드라인」 V1.3.1 (한국환경공단)국내 PKI 체계·인증서 프로파일·eMAID 규칙 정본

1. 규격 개요

1.1 전송 방식 — DataTransfer 래핑

모든 PnC 메시지는 표준 OCPP 1.6 DataTransfer로 래핑합니다.

필드
vendorId고정값 org.openchargealliance.iso15118pnc
messageId아래 1.3 표의 메시지 이름
data래핑된 메시지 JSON을 문자열로 직렬화해 담는다
⚠ data 인코딩 — OCPP 연동 가이드 §4.0(자사 확장: JSON 객체)과 다른 예외 규칙. PnC 확장의 data는 OCA 규격상 JSON 문자열(이중 인코딩)입니다. CP→CSMS 요청은 문자열이 정식이고(CSMS는 객체 전송 구현도 관용 수용), CSMS→CP 방향(응답 data, 명령 data)은 CSMS가 항상 문자열로 보냅니다 — 충전기는 data 문자열을 JSON으로 파싱해야 합니다.
[2,"123456","DataTransfer",{
  "vendorId": "org.openchargealliance.iso15118pnc",
  "messageId": "SignCertificate",
  "data": "{\"csr\":\"-----BEGIN CERTIFICATE REQUEST-----\\n...\"}"
}]

응답(CALLRESULT)의 data에는 대응하는 conf JSON 문자열이 담깁니다 — 요청·응답이 하나의 OCPP CALL/CALLRESULT 쌍 안에서 완결됩니다.

1.2 활성화 게이트 — Rejected 응답의 의미

CSMS에서 해당 충전기의 PnC 사용이 꺼져 있으면 래핑 메시지에 status=Rejected로 응답합니다. 이때 충전기는 OCA §2.1에 따라 CSMS의 TriggerMessage로 촉발되기 전까지 같은 요청을 재전송하지 않아야 합니다(SHALL not). PnC 적용 대상 충전기는 사전에 CSMS 운영팀과 활성화를 협의하십시오.

1.3 메시지 목록 (9종)

messageId방향용도
AuthorizeCP → CSMSPnC(eMAID) 인가
Get15118EVCertificateCP → CSMS계약 인증서 설치 EXI 릴레이
GetCertificateStatusCP → CSMSOCSP 상태 조회 프록시
SignCertificateCP → CSMSV2G 충전기 인증서 CSR 제출
CertificateSignedCSMS → CP발급된 V2G 인증서 전달
InstallCertificateCSMS → CP루트 CA 인증서 설치
GetInstalledCertificateIdsCSMS → CP설치 인증서 목록 조회
DeleteCertificateCSMS → CP설치 인증서 삭제
TriggerMessageCSMS → CPSignCertificate 전송 촉발 (필드 없음)

1.4 충전기 설정 키 (OCA §9)

필수설명
ISO15118PnCEnabled필수 (RW, Boolean)본 확장 지원 여부. 키 존재 자체가 지원 판별 기준
ContractValidationOffline필수 (RW, Boolean)오프라인 시 계약 인증서 로컬 검증 시도
CentralContractValidationAllowed권장 (RW, Boolean)true 권장 — 충전기가 검증 불가한 계약 인증서를 CSMS로 넘겨 중앙 검증
CertificateSignedMaxChainSize선택 (R)certificateChain 수용 크기. 5,600자 이상 권장, 상한 10,000자
CertSigningWaitMinimum / CertSigningRepeatTimes선택 (RW)CSR 무응답 시 재생성 백오프 (2배 증가)
CertificateStoreMaxLength선택 (R)설치 가능한 Root/CA 인증서 최대 수

1.5 암호·프로파일 요구 (공단 가이드라인)

  • V2G 인증서 키: secp256r1 / ECDSA-SHA256
  • EV↔SECC TLS 1.2, cipher 0xC023·0xC025 둘 다 지원
  • OCPP 전송: Security Profile 2 이상 (SP0/1 불가)
  • 계약 갱신(CertificateUpdate)은 공공 V2G PKI 미지원 — SECC ServiceDetail에 Installation만 제공

2.1 V2G 충전기 인증서 발급 (A02/A03)

CSMS ─(선택)─ TriggerMessage ──▶ CP        ← CSMS 주도(A02). CP 자발 시작(A03)도 가능
CP  ── 새 키쌍 생성 → SignCertificate(csr) ──▶ CSMS   (conf: status Accepted/Rejected)
CSMS ── KPNC(공공 V2G PKI) 발급 ── CertificateSigned(certificateChain) ──▶ CP
CP  ── 체인 검증 후 설치, conf status Accepted / (검증 실패 시) Rejected ──▶ CSMS

TriggerMessage.req (CSMS → CP)

필드 없음data"{}". OCPP 2.0.1처럼 requestedMessage를 넣지 않습니다(OCA 정의). 수신하면 새 키쌍을 생성해 SignCertificate를 (재)시작합니다.

SignCertificate.req (CP → CSMS)

필드타입필수설명
csrstring[0..5500]RFC 2986 CSR, PEM 인코딩

CSR 요구사항: EC secp256r1 키, 자기서명 유효할 것. CSMS는 파싱·서명 검증 실패 시 conf {"status":"Rejected"}. Accepted는 "접수" 의미 — 발급 완료가 아닙니다. 발급이 지연·실패해도 재제출은 백오프 설정 또는 CSMS 트리거를 따릅니다.

CertificateSigned.req (CSMS → CP)

필드타입필수설명
certificateChainstring[0..10000]PEM 연결 문자열 — leaf 우선, 이어서 Sub-CA 체인

충전기는 체인을 설치된 V2G Root로 검증하고, 유효하면 ISO 15118 충전기 인증서로 설치 후 {"status":"Accepted"}, 무효면 {"status":"Rejected"}로 응답해야 합니다. (V2G Root는 CSMS가 사전에 InstallCertificate로 배포 — 2.5)

응답 status 주의: 설치 실패 시 반드시 내부 conf의 status를 Rejected로 응답하십시오. 현재 CSMS는 DataTransfer 바깥 status로 설치 성공을 판정하므로, 바깥 Accepted + 내부 Rejected 조합은 오판을 만듭니다 — 실패 시 바깥 status도 Rejected로 맞추는 구현을 권장합니다.

2.2 계약 인증서 설치 (M01) — Get15118EVCertificate

EV가 CertificateInstallationReq(EXI)를 보내면 충전기는 EXI를 변경 없이 CSMS로 릴레이합니다.

Get15118EVCertificate.req (CP → CSMS)

필드타입필수설명
iso15118SchemaVersionstring[0..50]예: urn:iso:15118:2:2013:MsgDef
actionenumInstall / Update공공 V2G PKI는 Update 미지원 → 항상 Failed 응답
exiRequeststring[0..5600]CertificateInstallationReq raw EXI, Base64

Get15118EVCertificate.conf (CSMS → CP)

필드타입설명
statusAccepted / FailedAccepted = exiResponse 포함(메시지 정상 처리)
exiResponsestring[0..5600]CertificateInstallationRes raw EXI, Base64. Failed 시 생략

충전기는 exiResponse를 EV에 그대로 전달합니다. CSMS 처리(공공 PKI 조회)에 수 초가 걸릴 수 있으므로 EV 측 타임아웃(V2G_SECC_Msg_Performance_Time) 내 응답 대기를 구현하십시오.

2.3 PnC 인가 (C07) — 래핑 Authorize

PnC 세션의 인가는 반드시 래핑 Authorize를 사용합니다 — 일반 Authorize.req 사용 금지. (RFID 등 EIM 인증은 반대로 일반 Authorize.req 사용)

Authorize.req (CP → CSMS)

필드타입필수설명
idTokenIdTokenTypeeMAID. {"idToken":"KRABC012345678"} 객체가 정식 — CSMS는 평문 문자열도 수용
certificatestring[0..5500]선택계약 인증서 PEM — 충전기가 루트 부재로 자체 검증 불가 + CentralContractValidationAllowed=true일 때 반드시 전달
iso15118CertificateHashDataOCSPRequestData[0..4]선택OCSP 검증용 체인 해시 (hashAlgorithm·issuerNameHash·issuerKeyHash·serialNumber·responderURL — responderURL 필수)

Authorize.conf (CSMS → CP)

필드설명
idTokenInfo.statusAccepted / Blocked / ConcurrentTx / Expired / Invalid
idTokenInfo.cacheExpiryDateTime이 시각 이후 토큰 무효 (Authorization Cache 용)
certificateStatusAccepted / SignatureError / CertificateExpired / CertificateRevoked / NoCertificateAvailable / CertChainError / ContractCancelled (0..1)
이후 충전 시작은 일반 StartTransaction.reqidTag에 eMAID를 사용해야 합니다(필수). eMAID는 idTag 20자 한도 안이며 대소문자 무구분입니다. CSMS는 최근 10분 내 같은 충전기의 PnC 인가 성공 이력으로 시작을 승인합니다 — 인가 없이 StartTransaction만 보내면 Invalid.

오프라인 동작: ContractValidationOffline=false면 오프라인 충전 불허. true면 로컬 검증 후 Local Authorization List/Cache 규칙(OCA §5 표)을 따릅니다.

2.4 OCSP 프록시 (M06) — GetCertificateStatus

충전기가 계약 인증서 상태를 직접 확인하고 싶을 때 사용합니다(선택).

방향필드설명
req (CP→CSMS)ocspRequestDatahashAlgorithm SHA256|SHA384|SHA512, issuerNameHash·issuerKeyHash·serialNumber = hex, responderURL 필수
conf (CSMS→CP)status + ocspResultAccepted|Failed + RFC 6960 OCSPResponse (DER→Base64)

2.5 루트 인증서 관리 (M03/M04/M05) — CSMS → CP

메시지req 필드conf status
InstallCertificatecertificateType = V2GRootCertificate | MORootCertificate, certificate = PEMAccepted / Rejected(무효·저장 한도 초과) / Failed
GetInstalledCertificateIdscertificateType 배열(생략=전체; V2GRootCertificate/MORootCertificate/V2GCertificateChain)Accepted/NotFound + certificateHashDataChain 목록
DeleteCertificatecertificateHashDataAccepted / Failed / NotFound. 해당 타입의 마지막 남은 인증서면 거부 가능

3. 오류 처리 매트릭스

상황CSMS 응답충전기가 할 일
PnC 미활성 충전기의 래핑 메시지DataTransfer Rejected재전송 금지 — 운영팀에 활성화 문의
모르는 messageIdDataTransfer UnknownMessageId구현 확인
CSR 파싱·서명 검증 실패SignCertificate.conf RejectedCSR 재생성(EC P-256·자기서명 확인)
PKI 발급 실패/지연SignCertificate.conf는 Accepted, CertificateSigned 미도착백오프 설정에 따라 재시도 또는 CSMS 트리거 대기
계약 데이터 없음/PKI 타임아웃Get15118EVCertificate.conf FailedEV에 FAILED_NoCertificateAvailable 등 매핑
action=UpdateGet15118EVCertificate.conf Failed정상 동작 — 공공 PKI는 Update 미지원, Install로 재설치
eMAID 형식 위반·인증서 만료/폐지Authorize.conf Invalid (+certificateStatus)EV에 인가 거부 전달, EIM 폴백
OCSP responder 접근 불가GetCertificateStatus.conf Failed로컬 정책에 따름
PnC 실패 시 폴백(공단 가이드라인 §3.9 — 필수): Authorization 단계 이전에서 PnC가 실패하면 충전기는 케이블 재연결 없이 EIM(RFID/화면 인증 등)으로 전환해 충전을 지속할 수 있어야 합니다.

4. 구현 체크리스트 (제조사)

  • vendorId org.openchargealliance.iso15118pnc 래핑 DataTransfer 송수신 — data는 JSON 문자열(수신 파싱 포함)
  • 설정 키 ISO15118PnCEnabled·ContractValidationOffline(필수), CentralContractValidationAllowed(권장 true)
  • SignCertificate: EC secp256r1 키쌍 생성·PEM CSR, CertificateSigned 체인(leaf 우선) 검증·설치, 실패 시 내부·바깥 status 모두 Rejected
  • TriggerMessage(필드 없음) 수신 → SignCertificate 재시작
  • Get15118EVCertificate: EXI 무변조 릴레이, Failed 시 EV 오류 매핑
  • 래핑 Authorize (PnC 세션에서 일반 Authorize 금지) + StartTransaction idTag=eMAID
  • InstallCertificate(V2G/MO Root)·GetInstalledCertificateIds·DeleteCertificate 처리
  • CertificateSignedMaxChainSize ≥ 5600
  • PnC 실패 시 EIM 폴백(케이블 재연결 없이)
  • EV↔SECC: TLS 1.2 + cipher 0xC023/0xC025, ServiceDiscovery에 ContractCertificate(Installation만)

5. 문의

PnC 활성화(충전기별 설정), 시험 환경, 공단(KPNC) 온보딩 일정은 CSMS 운영팀에 문의하십시오.

문의: axd@bionever.com

CSMS PnC Integration Guide · 충전기 제조사용