트러블슈팅 7. Apache 리버스 프록시로 https 백엔드에 넘겼더니 502: SSLProxyVerifyDepth 기본값 1 - PCMEISTER 기술 노트
본문 글자 크기

트러블슈팅 7. Apache 리버스 프록시로 https 백엔드에 넘겼더니 502: SSLProxyVerifyDepth 기본값 1

비밀번호 관리자(vaultwarden)를 새 서버로 옮길 때 이야기입니다.

DNS 가 바뀌는 데 시간이 걸리니, 그동안 옛 서버로 들어오는 요청을 새 서버로 넘기기로 했습니다. 데이터가 두 서버로 갈라지면 안 되니까요. 옛 서버 앞단은 Apache 였고, 옛 서버의 /etc/hosts 에 도메인을 새 서버 IP 로 박아 둔 다음 같은 도메인의 https 로 넘겼습니다.

SSLProxyEngine on
SSLProxyVerify require
ProxyPass        / https://pass.pcmeister.co.kr/
ProxyPassReverse / https://pass.pcmeister.co.kr/

새 서버에는 미리 Let’s Encrypt 인증서를 받아 두었으니 바로 될 줄 알았는데, 옛 서버로 들어온 요청은 전부 502 가 났습니다. 새 서버를 직접 부르면 멀쩡했고요.

원인은 mod_ssl 의 SSLProxyVerifyDepth 였습니다. Apache 가 프록시 상대의 인증서를 검증할 때 체인을 몇 단계까지 따라갈지 정하는 값인데, 기본값이 1 입니다. 1 이면 상대 인증서가 신뢰하는 루트 CA 에 직접 서명받은 경우만 통과합니다. Let’s Encrypt 인증서는 중간 인증서를 거쳐 루트로 가니 1 단으로는 검증이 안 됩니다.

SSLProxyEngine on
SSLProxyVerify require
SSLProxyVerifyDepth 4
ProxyPass        / https://pass.pcmeister.co.kr/
ProxyPassReverse / https://pass.pcmeister.co.kr/

4 로 올리고 Apache 를 다시 읽게 하자 바로 붙었습니다. 넘기기 시작한 지 5분쯤 서비스가 끊겨 있었던 셈입니다.

검증을 아예 끄는 SSLProxyVerify none 이나 SSLProxyCheckPeerName off 로도 502 는 없어지겠지만, 그러면 굳이 https 로 넘길 이유가 없어집니다. 깊이만 올려 주면 됩니다.

참고: Apache mod_ssl SSLProxyVerifyDepth, https://httpd.apache.org/docs/2.4/mod/mod_ssl.html#sslproxyverifydepth

트러블슈팅 시리즈의 글

완료 글 30개 인터넷