0. 문서 개요
| 규격 정본 | 비고 |
|---|---|
| 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는 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 응답의 의미
status=Rejected로 응답합니다. 이때 충전기는 OCA §2.1에 따라 CSMS의 TriggerMessage로 촉발되기 전까지 같은 요청을 재전송하지 않아야 합니다(SHALL not). PnC 적용 대상 충전기는 사전에 CSMS 운영팀과 활성화를 협의하십시오.1.3 메시지 목록 (9종)
| messageId | 방향 | 용도 |
|---|---|---|
Authorize | CP → CSMS | PnC(eMAID) 인가 |
Get15118EVCertificate | CP → CSMS | 계약 인증서 설치 EXI 릴레이 |
GetCertificateStatus | CP → CSMS | OCSP 상태 조회 프록시 |
SignCertificate | CP → CSMS | V2G 충전기 인증서 CSR 제출 |
CertificateSigned | CSMS → CP | 발급된 V2G 인증서 전달 |
InstallCertificate | CSMS → CP | 루트 CA 인증서 설치 |
GetInstalledCertificateIds | CSMS → CP | 설치 인증서 목록 조회 |
DeleteCertificate | CSMS → CP | 설치 인증서 삭제 |
TriggerMessage | CSMS → CP | SignCertificate 전송 촉발 (필드 없음) |
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 ──▶ CSMSTriggerMessage.req (CSMS → CP)
필드 없음 — data는 "{}". OCPP 2.0.1처럼 requestedMessage를 넣지 않습니다(OCA 정의). 수신하면 새 키쌍을 생성해 SignCertificate를 (재)시작합니다.
SignCertificate.req (CP → CSMS)
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
csr | string[0..5500] | ✔ | RFC 2986 CSR, PEM 인코딩 |
CSR 요구사항: EC secp256r1 키, 자기서명 유효할 것. CSMS는 파싱·서명 검증 실패 시 conf {"status":"Rejected"}. Accepted는 "접수" 의미 — 발급 완료가 아닙니다. 발급이 지연·실패해도 재제출은 백오프 설정 또는 CSMS 트리거를 따릅니다.
CertificateSigned.req (CSMS → CP)
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
certificateChain | string[0..10000] | ✔ | PEM 연결 문자열 — leaf 우선, 이어서 Sub-CA 체인 |
충전기는 체인을 설치된 V2G Root로 검증하고, 유효하면 ISO 15118 충전기 인증서로 설치 후 {"status":"Accepted"}, 무효면 {"status":"Rejected"}로 응답해야 합니다. (V2G Root는 CSMS가 사전에 InstallCertificate로 배포 — 2.5)
2.2 계약 인증서 설치 (M01) — Get15118EVCertificate
EV가 CertificateInstallationReq(EXI)를 보내면 충전기는 EXI를 변경 없이 CSMS로 릴레이합니다.
Get15118EVCertificate.req (CP → CSMS)
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
iso15118SchemaVersion | string[0..50] | ✔ | 예: urn:iso:15118:2:2013:MsgDef |
action | enum | ✔ | Install / Update — 공공 V2G PKI는 Update 미지원 → 항상 Failed 응답 |
exiRequest | string[0..5600] | ✔ | CertificateInstallationReq raw EXI, Base64 |
Get15118EVCertificate.conf (CSMS → CP)
| 필드 | 타입 | 설명 |
|---|---|---|
status | Accepted / Failed | Accepted = exiResponse 포함(메시지 정상 처리) |
exiResponse | string[0..5600] | CertificateInstallationRes raw EXI, Base64. Failed 시 생략 |
충전기는 exiResponse를 EV에 그대로 전달합니다. CSMS 처리(공공 PKI 조회)에 수 초가 걸릴 수 있으므로 EV 측 타임아웃(V2G_SECC_Msg_Performance_Time) 내 응답 대기를 구현하십시오.
2.3 PnC 인가 (C07) — 래핑 Authorize
Authorize.req 사용 금지. (RFID 등 EIM 인증은 반대로 일반 Authorize.req 사용)Authorize.req (CP → CSMS)
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
idToken | IdTokenType | ✔ | eMAID. {"idToken":"KRABC012345678"} 객체가 정식 — CSMS는 평문 문자열도 수용 |
certificate | string[0..5500] | 선택 | 계약 인증서 PEM — 충전기가 루트 부재로 자체 검증 불가 + CentralContractValidationAllowed=true일 때 반드시 전달 |
iso15118CertificateHashData | OCSPRequestData[0..4] | 선택 | OCSP 검증용 체인 해시 (hashAlgorithm·issuerNameHash·issuerKeyHash·serialNumber·responderURL — responderURL 필수) |
Authorize.conf (CSMS → CP)
| 필드 | 설명 |
|---|---|
idTokenInfo.status | Accepted / Blocked / ConcurrentTx / Expired / Invalid |
idTokenInfo.cacheExpiryDateTime | 이 시각 이후 토큰 무효 (Authorization Cache 용) |
certificateStatus | Accepted / SignatureError / CertificateExpired / CertificateRevoked / NoCertificateAvailable / CertChainError / ContractCancelled (0..1) |
StartTransaction.req의 idTag에 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) | ocspRequestData | hashAlgorithm SHA256|SHA384|SHA512, issuerNameHash·issuerKeyHash·serialNumber = hex, responderURL 필수 |
| conf (CSMS→CP) | status + ocspResult | Accepted|Failed + RFC 6960 OCSPResponse (DER→Base64) |
2.5 루트 인증서 관리 (M03/M04/M05) — CSMS → CP
| 메시지 | req 필드 | conf status |
|---|---|---|
InstallCertificate | certificateType = V2GRootCertificate | MORootCertificate, certificate = PEM | Accepted / Rejected(무효·저장 한도 초과) / Failed |
GetInstalledCertificateIds | certificateType 배열(생략=전체; V2GRootCertificate/MORootCertificate/V2GCertificateChain) | Accepted/NotFound + certificateHashDataChain 목록 |
DeleteCertificate | certificateHashData | Accepted / Failed / NotFound. 해당 타입의 마지막 남은 인증서면 거부 가능 |
3. 오류 처리 매트릭스
| 상황 | CSMS 응답 | 충전기가 할 일 |
|---|---|---|
| PnC 미활성 충전기의 래핑 메시지 | DataTransfer Rejected | 재전송 금지 — 운영팀에 활성화 문의 |
| 모르는 messageId | DataTransfer UnknownMessageId | 구현 확인 |
| CSR 파싱·서명 검증 실패 | SignCertificate.conf Rejected | CSR 재생성(EC P-256·자기서명 확인) |
| PKI 발급 실패/지연 | SignCertificate.conf는 Accepted, CertificateSigned 미도착 | 백오프 설정에 따라 재시도 또는 CSMS 트리거 대기 |
| 계약 데이터 없음/PKI 타임아웃 | Get15118EVCertificate.conf Failed | EV에 FAILED_NoCertificateAvailable 등 매핑 |
action=Update | Get15118EVCertificate.conf Failed | 정상 동작 — 공공 PKI는 Update 미지원, Install로 재설치 |
| eMAID 형식 위반·인증서 만료/폐지 | Authorize.conf Invalid (+certificateStatus) | EV에 인가 거부 전달, EIM 폴백 |
| OCSP responder 접근 불가 | GetCertificateStatus.conf Failed | 로컬 정책에 따름 |
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