일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 오블완
- 매터
- Apple
- RS-485
- Home Assistant
- 해외주식
- ConnectedHomeIP
- 공모주
- 배당
- esp32
- raspberry pi
- 미국주식
- 파이썬
- 나스닥
- 힐스테이트 광교산
- MQTT
- 티스토리챌린지
- 홈네트워크
- Espressif
- homebridge
- 코스피
- Python
- 월패드
- 엔비디아
- matter
- 애플
- 현대통신
- 퀄컴
- 국내주식
- Bestin
- Today
- Total
YOGYUI
Let's Encrypt(certbot) - bad marshal data 오류 해결 방법 본문
Resolving 'bad marshal data' error on certbot (Let's Encrypt)
1. 문제상황
라즈베리파이4에서 구글홈 연동을 위해 사용중인 무료 SSL 인증서 발급 서비스인 Let's Encrypt의 CLI 툴인 certbot을 사용하다보면 간혹 아래와 같은 오류메시지를 마주치게 될 때가 있다
오류 사항: 'bad marshal data (unknown type code)'
2. 원인
bad marshal data는 certbot 자체의 문제가 아니라 certbot이 사용하는 언어인 python의 문제다
- certbot에서 발생하는 Full error log는 아래와 같다
2024-09-18 22:12:09,133:WARNING:certbot.renewal:Attempting to renew cert (yogyui.duckdns.org) from /etc/letsencrypt/renewal/yogyui.duckdns.org.conf produced an unexpected error: bad marshal data (unknown type code). Skipping.
2024-09-18 22:12:09,156:DEBUG:certbot.renewal:Traceback was:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/certbot/renewal.py", line 465, in handle_renewal_request
main.renew_cert(lineage_config, plugins, renewal_candidate)
File "/usr/lib/python3/dist-packages/certbot/main.py", line 1191, in renew_cert
le_client = _init_le_client(config, auth, installer)
File "/usr/lib/python3/dist-packages/certbot/main.py", line 605, in _init_le_client
acc, acme = _determine_account(config)
File "/usr/lib/python3/dist-packages/certbot/main.py", line 509, in _determine_account
acc = account_storage.load(config.account)
File "/usr/lib/python3/dist-packages/certbot/account.py", line 246, in load
return self._load_for_server_path(account_id, self.config.server_path)
File "/usr/lib/python3/dist-packages/certbot/account.py", line 232, in _load_for_server_path
key = jose.JWK.json_loads(key_file.read())
File "/usr/lib/python3/dist-packages/josepy/interfaces.py", line 179, in json_loads
return cls.from_json(loads)
File "/usr/lib/python3/dist-packages/josepy/json_util.py", line 481, in from_json
return type_cls(**type_cls.fields_from_json(jobj))
File "/usr/lib/python3/dist-packages/josepy/jwk.py", line 251, in fields_from_json
default_backend())
File "/usr/lib/python3/dist-packages/cryptography/hazmat/backends/__init__.py", line 15, in default_backend
from cryptography.hazmat.backends.openssl.backend import backend
File "/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/__init__.py", line 7, in <module>
from cryptography.hazmat.backends.openssl.backend import backend
File "/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/backend.py", line 46, in <module>
from cryptography.hazmat.backends.openssl.encode_asn1 import (
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 724, in exec_module
File "<frozen importlib._bootstrap_external>", line 857, in get_code
File "<frozen importlib._bootstrap_external>", line 525, in _compile_bytecode
ValueError: bad marshal data (unknown type code)
2024-09-18 22:12:09,158:ERROR:certbot.renewal:All renewal attempts failed. The following certs could not be renewed:
2024-09-18 22:12:09,159:ERROR:certbot.renewal: /etc/letsencrypt/live/yogyui.duckdns.org/fullchain.pem (failure)
2024-09-18 22:12:09,163:DEBUG:certbot.log:Exiting abnormally:
Traceback (most recent call last):
File "/usr/bin/certbot", line 11, in <module>
load_entry_point('certbot==0.31.0', 'console_scripts', 'certbot')()
File "/usr/lib/python3/dist-packages/certbot/main.py", line 1365, in main
return config.func(config, plugins)
File "/usr/lib/python3/dist-packages/certbot/main.py", line 1272, in renew
renewal.handle_renewal_request(config)
File "/usr/lib/python3/dist-packages/certbot/renewal.py", line 490, in handle_renewal_request
len(renew_failures), len(parse_failures)))
certbot.errors.Error: 1 renew failure(s), 0 parse failure(s)
certbot이 사용하는 백엔드(backend) SSL 패키지는 cryptography의 hazmat/backend/opensssl인데, 해당 스크립트의 byte-code로 컴파일된 pyc파일이 certbot이 정상 작동할 때와는 다르게 컴파일되어 오류가 발생하는 것으로 추정된다 (SSL 관련 파이썬 개발 작업을 한 적이 있었는데, 이 때 뭔가 나도 모르게 sudo upgrade 등의 작업을 하면서 꼬였나보다...)
3. 해결책
라즈베리파이의 경우 /usr 디렉터리 내부에 여러 바이너리 파일, 라이브러리 파일들이 모여있는데, 여기 존재하는 .pyc 파일을 아래 명령어를 사용해 전부 삭제하면 된다
$ sudo find /usr -name '*.pyc' -delete
전부 삭제 후 certbot CLI를 다시 실행하면 다시 pyc파일을 컴파일하기 때문에 정상 작동하게 된다
결론: 'bad marshal data' 오류가 발생하면 .pyc 파일을 삭제해버리도록 하자
[참고]
https://stackoverflow.com/questions/30861493/how-to-fix-python-valueerrorbad-marshal-data
'홈네트워크(IoT) > 일반' 카테고리의 다른 글
LG ThinQ(씽큐) 플랫폼 API 공개 및 OpenAPI 사용해보기 (스마트솔루션 API) (0) | 2024.12.30 |
---|---|
Home Assistant 애드온 컨테이너 내부에서 애드온 옵션 변경하기 (bashio) (0) | 2024.03.20 |
Home Assistant add-on 베타버전 릴리즈 (24) | 2024.03.20 |
Home Assistant add-on 개발 일지 (0) | 2024.03.17 |
홈네트워크 파이썬 앱 Multi-platform Docker Image 만들기 (0) | 2024.02.21 |