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 제외.
50 lines
3.1 KiB
C
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);
|