
HLS PUSH는 https 프로토콜을 이용해 데이터를 전송하며 인증서를 통해 서버의 진위여부를 확인한다. 파이썬을 이용해 사설 인증서를 생성하고, 와우자 스트리밍 엔진에 적용해 HLS PUSH 스트림 데이터를 PushCap 개발 서버에서 수신하는 방법을 설명한다.
HLS와 https 인증서
HLS(HTTP Live Streaming)는 우리가 흔히 인터넷이라고 부르는 HTTP(HyperText Transfer Protocol)를 이용해 동영상 파일과 그 동영상 파일을 재생할 재생목록을 전송하는 방식을 사용한다.
인터넷 초기부터 사용된 http는 도청이나 변조가 가능한 보안상의 문제가 대두되었고, 이를 대응하기 위해 https가 널리 사용되게 되어 현대 인터넷 전송의 표준 방식이 되었다. https는 전송되는 데이터를 키(key)를 사용해 암호화하고, 통신하는 대상의 진위여부를 인증서(certificate)로 확인해, 통신의 신뢰성을 높인다.
문제는, 이러한 보안 대책들은 실제 서비스 환경에서 큰 도움이 되지만, 개발환경에서는 그다지 도움이 되지 못한다는 것이다. OBS
나 와우자 스트리밍 엔진(Wowza Streaming Engine)
같은 스트리밍 프로그램에서 https 인증서를 문제삼아 송출을 하지 않기 때문이다. 때문에 사설 인증서를 생성하고 허용하도록 만들어 주어야 한다.
본 글에서는 와우자나 OBS같은 스트리밍 프로그램이 PushCap
와 같은 사설 HLS PUSH 서버에 스트리밍 송출을 허용하도록, 파이썬을 이용해 사설 인증서를 생성하고 적용하는 방법에 대해 설명한다.
파이썬을 이용한 인증서 생성
파이썬 실행환경 준비
- 파이썬 설치
이 코드는 파이썬을 기반으로 작동한다. 파이썬 설치 방법과 같은 글을 참고하여 서버로 사용할 PC에 파이썬을 설치한다.
- 추가 패키지 설치
다음의 명령어를 통해 프로그램의 실행에 필요한
cryptography
패키지를 설치해 준다.py -m pip install cryptography
- 프로그램 파일 생성
적당한 디렉토리를 생성하고, 아래의 코드 내용을 복사해
GenCert.py
라는 파일로 저장해 준다.
b.upload.youtube.com 부분에 사용하고자 하는 인터넷 주소 혹은, IP 주소를 입력해 준다.from cryptography import x509 from cryptography.x509.oid import NameOID from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.asymmetric import rsa from cryptography.hazmat.primitives import serialization import datetime # 도메인 이름을 여기에 넣어준다. 이 주소가 스트리밍 프로그램에 입력될 주소이다. domain_name = u"b.upload.youtube.com" # 1. 개인 키 생성 key = rsa.generate_private_key( public_exponent=65537, key_size=2048, ) # 2. 개인 키를 파일에 저장 (key.pem) with open("key.pem", "wb") as f: f.write(key.private_bytes( encoding=serialization.Encoding.PEM, format=serialization.PrivateFormat.TraditionalOpenSSL, encryption_algorithm=serialization.NoEncryption(), )) # 3. 자체 서명을 위한 인증서 정보 설정 (Common Name을 수정) subject = issuer = x509.Name([ x509.NameAttribute(NameOID.COUNTRY_NAME, u"KR"), x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u"Gyeonggi-do"), x509.NameAttribute(NameOID.LOCALITY_NAME, u"Hanam-si"), x509.NameAttribute(NameOID.ORGANIZATION_NAME, u"DectENG"), x509.NameAttribute(NameOID.COMMON_NAME, domain_name), ]) # 4. 인증서 생성 및 서명 cert = x509.CertificateBuilder().subject_name( subject ).issuer_name( issuer ).public_key( key.public_key() ).serial_number( x509.random_serial_number() ).not_valid_before( datetime.datetime.now(datetime.timezone.utc) ).not_valid_after( datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(days=365) ).add_extension( x509.SubjectAlternativeName([x509.DNSName(domain_name)]), critical=False, ).sign(key, hashes.SHA256()) # 5. 인증서를 파일에 저장 (cert.pem) with open("cert.pem", "wb") as f: f.write(cert.public_bytes(serialization.Encoding.PEM)) print(f"'{domain_name}' cert.pem / key.pem 생성됨.")
- 프로그램 실행
콘솔 창에서
GenCert.py
파일이 있는 디렉토리로 이동해 코드를 실행시켜 준다. 아래와 같이, 생성됨이라는 메시지가 출력되면 정상적으로 암호키와 인증서가 생성 되었다는 의미이다.Microsoft Windows [Version 10.0.20348.4052] (c) Microsoft Corporation. All rights reserved. D:\>cd HLSWEB D:\HLSWEB>py GenCert.py 'b.upload.youtube.com' cert.pem / key.pem 생성됨.
- 생성된
cert.pem
파일과key.pem
파일을PushCap.py
실행 디렉토리로 복사한다.
OBS
와 같이, 별도의 인증서와 키 검증 기능이 없는 스트리밍 프로그램을 사용하고 있다면, HTTPS HLS PUSH 스트림을 전송할 수 있게 된다.
와우자 스트리밍 엔진에 사설 인증서 적용하기
와우자 스트리밍 엔진과 같은 상업용 스트리밍 프로그램의 경우, 인증서를 자체적으로 추가로 검증하는 절차가 있어 사설 인증서를 사용할 수 없다. 때문에 와우자의 경우, 생성한 인증서를 신뢰할 수 있는 인증서로 등록시켜주는 절차가 필요하다.
- 와우자 서비스 정지 : 와우자 스트리밍 엔진 서비스를 정지시킨다.
- 콘솔 접속 : 관리자 권한을 사용할 수 있는 콘솔(도스창 등)을 연다.
- 자바 도구 디렉토리 이동
와우자 스트리밍 엔진을 설치하며 함께 설치되는 자바 도구 디렉토리로 이동한다. 기본 경로는
[와우자 기본 설치 경로]/jre/bin
이다. - 인증서 파일 등록
다음의 명령을 입력해 인증서 파일을 등록해 준다.
keytool -importcert -alias "[인증서 이름]" -keystore "[인증서 저장소]" -storepass changeit -file "[인증서 파일]"- [인증서 이름]
- 와우자 스트리밍 엔진에서 사용할 인증서의 이름으로, 사용자가 임의로 지정할 수 있다.
- [인증서 저장소]
- 인증서가 저장될 위치로, 와우자가 사용하는 JRE 디렉토리 내부의 인증서 저장소 위치로, 기본 경로는
[와우자 설치 경로]\jre\lib\security\cacerts
이다. - [인증서 파일]
- 등록할 인증서 파일 (
.pem
)의 경로와 파일 이름
와우자 스트리밍 엔진에 인증서를 적용하는 예
윈도우 환경의 와우자 스트리밍 엔진에 사설 인증서를 적용하는 절차의 예로, 환경은 다음과 같다.
- 운영체제
- 윈도우 서버 2022
- 와우자 버전
- 4.8.25+2
- 인증서 파일 경로
D:\HLSWEB\cert.pem
- 관리자 권한으로 콘솔창 (DOS창)을 띄운다.
- 와우자 엔진 서비스 정지
C:\>sc stop WowzaStreamingEngine4825+2 SERVICE_NAME: WowzaStreamingEngine4825+2 TYPE : 10 WIN32_OWN_PROCESS STATE : 3 STOP_PENDING (STOPPABLE, PAUSABLE, ACCEPTS_SHUTDOWN) WIN32_EXIT_CODE : 0 (0x0) SERVICE_EXIT_CODE : 0 (0x0) CHECKPOINT : 0x0 WAIT_HINT : 0x7d0
- 인증서 등록
C:>Program Files\Wowza Media Systems\Wowza Streaming Engine 4.8.25+2\jre\bin>keytool.exe -importcert -alias "YouTubeLocal" -keystore "C:\Program Files\Wowza Media Systems\Wowza Streaming Engine 4.8.25+2\jre\lib\security\cacerts" -storepass changeit -file "D:\HLSWEB\cert.pem" Warning: use -cacerts option to access cacerts keystore Owner: CN=b.upload.youtube.com, O=DectENG, L=Hanam-si, ST=Gyeonggi-do, C=KR Issuer: CN=b.upload.youtube.com, O=DectENG, L=Hanam-si, ST=Gyeonggi-do, C=KR Serial number: 389c81b7d9e5452c8cbace6436a99aff004376 Valid from: Mon Aug 25 23:34:59 KST 2025 until: Tue Aug 25 23:34:59 KST 2026 Certificate fingerprints: SHA1: AA:BB:CC:DD:EE:FF:AA:BB:CC:DD:EE:FF:65:33:A0:A8:44:55:C0:54 SHA256: AA:BB:CC:DD:EE:FF:AA:BB:CC:DD:EE:FF:GG:AA:BB:CC:DD:EE:25:9E:AD:00:54:DE:D0:AE:52:97:1C:A1:85:59 Signature algorithm name: SHA256withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.17 Criticality=false SubjectAlternativeName [ DNSName: b.upload.youtube.com ] Trust this certificate? [no]: yes Certificate was added to keystore
- 인증서 등록 확인
C:\Program Files\Wowza Media Systems\Wowza Streaming Engine 4.8.25+2\jre\bin>keytool -list -cacerts Enter keystore password:Enter ***************** WARNING WARNING WARNING ***************** * The integrity of the information stored in your keystore * * has NOT been verified! In order to verify its integrity, * * you must provide your keystore password. * ***************** WARNING WARNING WARNING ***************** Keystore type: JKS Keystore provider: SUN Your keystore contains 93 entries ... (전략) ... youtubelocal, 2025 Aug 26, trustedCertEntry, Certificate fingerprint (SHA-256): AA:BB:CC:DD:EE:FF:AA:BB:CC:DD:EE:FF:GG:AA:BB:CC:DD:EE:25:9E:AD:00:54:DE:D0:AE:52:97:1C:A1:85:59 ... (생략) ...
위와 같이 등록한 이름의 인증서 (이 예에서는 youtubelocal)가 존재하면 정상적으로 등록되었다는 의미이다.
- 와우자 엔진 서비스 재시작
C:\>sc start WowzaStreamingEngine4825+2 SERVICE_NAME: WowzaStreamingEngine4825+2 TYPE : 10 WIN32_OWN_PROCESS STATE : 2 START_PENDING (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN) WIN32_EXIT_CODE : 0 (0x0) SERVICE_EXIT_CODE : 0 (0x0) CHECKPOINT : 0x0 WAIT_HINT : 0x7d0 PID : 4356 FLAGS :
결론
HLS PUSH 를 캡처해 디버그하기 위한 PushCap
은 https 통신을 위한 인증서과 키를 생성해 주어야 한다. 이렇게 생성된 사설 인증서와 키는, 별도의 검증을 하지 않는 OBS
와 같은 도구에서는 문제 없이 사용되지만, 와우자 스트리밍 엔진과 같이 내부의 검증절차가 있는 도구에서는 신뢰할 수 있는 인증서로 등록해 주어야 사용이 가능하다.
간단하게 파이썬을 이용해 인증서와 암호키를 생성하고, 자바의 신뢰할 수 있는 인증서로 동작하는 절차를 통해 와우자 스트리밍 엔진의 https 스트리밍 데이터를 원하는 곳으로 전송하는 것이 가능해 진다.
본 글을 통해, 서버의 문제를 해결하고 실제 스트리밍 데이터의 검증 작업을 해야하는 독자 제위에게 작은 도움이 되기를 바라는 바 이다.