POSA_LEAKSMS/firmware/certs/server_ca.c
유창욱 90f121e14c chore: import codebase with security hardening
SHT30 온습도 모니터링 시스템 전체 소스(서버 PHP, STM32 펌웨어, SQL, 테스트).
전체 코드리뷰에서 도출된 보안 하드닝 10건 반영:
- 요청 서명 HMAC-SHA256 전환(펌웨어 sig.c/서버 config.php/호스트 패리티 동시)
- 재전송 방어 + 기본 API_KEY fail-closed + 디바이스 문자열 정제(api/sensor_data.php)
- 오프라인 SMS 중복 발송 경합 제거(cron_heartbeat.php, 원자적 선점)
- CSV 수식 주입 방지(monthly_report.php), 감사로그 회전 락(retention_cleanup.php)
- 브루트포스 카운터 원자화(login.php), 예시 TOTP 비밀키 무효화, 마이그레이션 멱등화

_backup/(하드코딩 실 비밀값 포함)·config.local.php·런타임 상태는 .gitignore 제외.
2026-06-20 09:37:40 +09:00

50 lines
3.1 KiB
C

/* =============================================================================
* server_ca.c - 서버(Cafe24) 루트 CA 인증서 (PEM, flash 임베드)
*
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! PLACEHOLDER !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
* 아래 인증서는 *자리표시자(PLACEHOLDER)* 이며 실제 서버 검증에 사용할 수 없다.
* 배포 전에 반드시 실제 Cafe24 서버의 루트 CA 체인으로 교체해야 한다.
*
* 교체 방법(요약, 자세히는 certs/README.md):
* 1) 서버에서 체인 추출:
* openssl s_client -showcerts -connect <host>:443 -servername <host>
* 2) 루트(필요 시 intermediate + root 를 한 파일에 연결)를 PEM 으로 저장
* 3) PowerShell 로 이 파일 재생성:
* ./certs/gen_ca_header.ps1 -PemPath cafe24_root.pem
*
* 동작(fail-closed): 이 자리표시자는 컴파일은 되지만 유효한 X.509 DER 이 아니므로
* tls_init() 의 mbedtls_x509_crt_parse() 단계에서 파싱이 실패한다. 그 결과
* tls_init() 이 음수를 반환하고 main 이 bsp_fatal() 로 안전 정지(부팅 중단)한다.
* 즉 자리표시자 상태로는 펌웨어가 애플리케이션까지 도달하지 못한다(데이터 유출 없음).
* 실제 CA 로 교체하면 정상 부팅 후 핸드셰이크에서 풀 검증이 수행된다.
* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
*
* TODO(hw): 위 절차로 실제 Cafe24 루트 CA 로 교체할 것. (위험 R3)
* ===========================================================================*/
#include "server_ca.h"
/* -----------------------------------------------------------------------------
* PLACEHOLDER CA — 실제 인증서가 아님. 반드시 교체할 것.
*
* 형식 주의:
* - 각 라인 끝에 명시적 "\n" 을 넣는다(PEM 라인 구분자).
* - BEGIN/END 마커와 본문 base64 가 모두 있어야 mbedTLS PEM 파서가 인식한다.
* - 마지막 라인 뒤 "\n" 까지 포함하고, C 문자열의 종결 NUL 은 LEN 에 반영된다.
* ---------------------------------------------------------------------------*/
const char SERVER_CA_PEM[] =
"-----BEGIN CERTIFICATE-----\n"
"MIIB/zCCAaWgAwIBAgIUUExBQ0VIT0xERVJfRE9fTk9UX1VTRTAKBggqhkjOPQQD\n"
"AjBFMQswCQYDVQQGEwJYWDEVMBMGA1UEBwwMRGVmYXVsdCBDaXR5MR8wHQYDVQQK\n"
"DBZQTEFDRUhPTERFUiBDQSAtIEZBS0UwHhcNMjUwMTAxMDAwMDAwWhcNMjYwMTAx\n"
"MDAwMDAwWjBFMQswCQYDVQQGEwJYWDEVMBMGA1UEBwwMRGVmYXVsdCBDaXR5MR8w\n"
"HQYDVQQKDBZQTEFDRUhPTERFUiBDQSAtIEZBS0UwWTATBgcqhkjOPQIBBggqhkjO\n"
"PQMBBwNCAAQEXAMPLEPLACEHOLDERKEYBYTESDONOTUSEINPRODUCTIONXXXXXXXX\n"
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXo1Mw\n"
"UTAdBgNVHQ4EFgQUUExBQ0VIT0xERVJfRkFLRV9DQV9YMB8GA1UdIwQYMBaAFFBM\n"
"QUNFSE9MREVSX0ZBS0VfQ0FfWDAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMC\n"
"A0gAMEUCIQDPLACEHOLDERSIGNATUREVALUEDONOTTRUSTXXXXXXXXXXXXXXAiEA\n"
"PLACEHOLDERSIGNATUREVALUEDONOTTRUSTYYYYYYYYYYYYYYYYYYYYYYYYYY=\n"
"-----END CERTIFICATE-----\n";
/* 길이: sizeof 는 종결 NUL 1바이트를 포함한다(mbedTLS PEM 요구사항). */
const unsigned int SERVER_CA_PEM_LEN = sizeof(SERVER_CA_PEM);