๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

๐Ÿ›ƒ ์‚ฌ์šฉ์ž ์ง€์ • CA ์Šคํ† ์–ด ์„ค์ •

๊ฒฝ๊ณ 

์ด ํŠœํ† ๋ฆฌ์–ผ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ์—ฌ์˜ ์ผํ™˜์ด๋ฉฐ Open WebUI ํŒ€์—์„œ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋งž๊ฒŒ Open WebUI๋ฅผ ๋งž์ถคํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ฐ๋ชจ๋กœ๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๊ธฐ์—ฌ๋ฅผ ์›ํ•˜์‹ญ๋‹ˆ๊นŒ? ๊ธฐ์—ฌ ํŠœํ† ๋ฆฌ์–ผ์„ ํ™•์ธํ•˜์„ธ์š”.

OI๋ฅผ ์‹คํ–‰ํ•˜๋ ค๊ณ  ํ•  ๋•Œ [SSL: CERTIFICATE_VERIFY_FAILED] ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด, ๋Œ€๋ถ€๋ถ„ ๋„คํŠธ์›Œํฌ์—์„œ HTTPS ํŠธ๋ž˜ํ”ฝ์ด ์ฐจ๋‹จ๋˜๊ณ  ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค(์˜ˆ: ๊ธฐ์—… ๋„คํŠธ์›Œํฌ).

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์ƒˆ๋กœ์šด ์ธ์ฆ์„œ๋ฅผ OI์˜ ์‹ ๋ขฐ ์Šคํ† ์–ด์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „์— ๋นŒ๋“œ๋œ Docker ์ด๋ฏธ์ง€ ์‚ฌ์šฉ ์‹œ:

  1. docker run ๋ช…๋ น์ค„ ์˜ต์…˜์œผ๋กœ --volume=/etc/ssl/certs/ca-certificates.crt:/etc/ssl/certs/ca-certificates.crt:ro๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์—์„œ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ธ์ฆ์„œ ์Šคํ† ์–ด๋ฅผ ๋งˆ์šดํŠธํ•ฉ๋‹ˆ๋‹ค.
  2. REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt๋ฅผ ์„ค์ •ํ•˜์—ฌ Python์ด ์‹œ์Šคํ…œ ์‹ ๋ขฐ ์Šคํ† ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค(์ฐธ์กฐ: https://docs.docker.com/reference/cli/docker/container/run/#env).

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ REQUESTS_CA_BUNDLE์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋™์ผํ•œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€์‹  SSL_CERT_FILE์„ ์„ค์ •ํ•ด๋ณด์‹ญ์‹œ์˜ค(httpx documentation ์ฐธ์กฐ).

@KizzyCode์˜ compose.yaml ์˜ˆ์ œ:

services:
openwebui:
image: ghcr.io/open-webui/open-webui:main
volumes:
- /var/containers/openwebui:/app/backend/data:rw
- /etc/containers/openwebui/compusrv.crt:/etc/ssl/certs/ca-certificates.crt:ro
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
environment:
- WEBUI_NAME=compusrv
- ENABLE_SIGNUP=False
- ENABLE_COMMUNITY_SHARING=False
- WEBUI_SESSION_COOKIE_SAME_SITE=strict
- WEBUI_SESSION_COOKIE_SECURE=True
- ENABLE_OLLAMA_API=False
- REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt

ro ํ”Œ๋ž˜๊ทธ๋Š” CA ์Šคํ† ์–ด๋ฅผ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋งˆ์šดํŠธํ•˜์—ฌ ํ˜ธ์ŠคํŠธ CA ์Šคํ† ์–ด์˜ ์šฐ๋ฐœ์  ๋ณ€๊ฒฝ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ๊ฐœ๋ฐœ์šฉ:

UI์— ๋ณ€๊ฒฝ์„ ์›ํ•  ๊ฒฝ์šฐ, ๋˜๋Š” ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค์—์„œ ์ธ์ฆ์„œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด Dockerfile์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ๋Š” ๋‹ค์ค‘ ๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ง€๋ฏ€๋กœ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ํ”„๋ก ํŠธ์—”๋“œ (build ๋‹จ๊ณ„):
COPY package.json package-lock.json <YourRootCert>.crt ./
ENV NODE_EXTRA_CA_CERTS=/app/<YourRootCert>.crt
RUN npm ci
  1. ๋ฐฑ์—”๋“œ (base ๋‹จ๊ณ„):
COPY <CorporateSSL.crt> /usr/local/share/ca-certificates/
RUN update-ca-certificates
ENV PIP_CERT=/etc/ssl/certs/ca-certificates.crt \
REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt