force_https 활성화용 유효한 인증서 테스트가 깨져서 켜져야 할 때 꺼져 있습니다

수정: 버그로 변경합니다. Force_https가 이전에 켜져 있던 사이트에서 이제 꺼져 있고, 이로 인해 문제가 발생합니다.


"업로드가 작동하지 않는다"는 문제를 겪고 있는 사이트를 디버깅하느라 한동안 시간을 보냈습니다. rebuild, safe-mode, 비표준 플러그인 검토 등 명백한 사항들을 하나씩 점검한 끝에 마침내 혼합 콘텐츠(mixed-content) 경고를 발견하고 force_https를 켜니 문제가 해결되었습니다.

1~2년 전쯤 force_https가 기본적으로 켜져 있다고 생각했는데, 최근 몇 차례 force_https가 켜져 있지 않아 문제가 발생했다는 이야기를 들었습니다(혹은 직접 확인했습니다).

기본적으로 켜져 있지 않은 이유가 있을까요?
[/quote]

"업로드가 작동하지 않는다"는 문제를 겪고 있는 사이트를 디버깅하느라 한동안 시간을 보냈습니다. rebuild, safe-mode, 비표준 플러그인 검토 등 명백한 사항들을 하나씩 점검한 끝에 마침내 혼합 콘텐츠(mixed-content) 경고를 발견하고 force_https를 켜니 문제가 해결되었습니다.

1~2년 전쯤 force_https가 기본적으로 켜져 있다고 생각했는데, 최근 몇 차례 force_https가 켜져 있지 않아 문제가 발생했다는 이야기를 들었습니다(혹은 직접 확인했습니다).

기본적으로 켜져 있지 않은 이유가 있을까요?

1개의 좋아요

discourse.conf에서 유효한 인증서가 존재하는 경우 자동으로 활성화됩니다.
실제로 1~2년 전부터 그렇게 되고 있습니다.

grep -q 'force_https' "/var/www/discourse/config/discourse.conf" || echo "force_https = 'true'" >> "/var/www/discourse/config/discourse.conf"

1개의 좋아요

아하! 리처드, 감사합니다.

그러니까 내가 미친 게 아니었군요.

문제는 유효한 인증서를 검사하는 테스트가 실패하는 것입니다:

# openssl verify -CAfile ca.cer fullchain.cer 
O = Digital Signature Trust Co., CN = DST Root CA X3
error 10 at 3 depth lookup: certificate has expired
error fullchain.cer: verification failed

그런 다음 /etc/ca-certificates.conf에서 mozilla/DST_Root_CA_X3.crt를 제거하고 update-ca-certificates를 실행하면 다음 결과가 나옵니다:

C = US, O = Internet Security Research Group, CN = ISRG Root X1
error 2 at 2 depth lookup: unable to get issuer certificate
error fullchain.cer: verification failed

브라우저에서는 정상적으로 표시됩니다. 그리고 오늘 이 컨테이너를 다시 빌드했기 때문에(최신 루트 인증서가 있어야 합니다).

인증서 관련 지식이 부족해서 정확히 무슨 일이 일어나고 있는지 알 수 없습니다. 컨테이너 내부에서 Let’s Encrypt 인증서를 curl로 가져올 수 있습니다(지난주 작업하던 WordPress 컨테이너에서는 실패하던 테스트입니다).

그리고 이번에는 저뿐만 아니라, 최근 몇몇 사람들이 force_https를 켜서 문제를 해결한 사례가 있습니다: force_https order:latest 검색 결과.

1개의 좋아요

네, 이는 LetsEncrypt 루트 인증서 만료와 관련이 있어 보입니다. 특히 지난 금요일 이후에 이 문제가 발생하기 시작했다면 더욱 그렇습니다.

openssl version 명령어는 (docker 컨테이너 내에서) 어떤 내용을 반환하나요? (이 내용 때문입니다.)

2개의 좋아요
OpenSSL 1.1.1d  10 Sep 2019

그러면 “ISRG Root X1을 신뢰 저장소(trust store)에 추가해야 하는” 건가요? 하지만 ca-certificates.conf 파일에서 mozilla/ISRG_Root_X1.crt 파일을 볼 수 있습니다.

1개의 좋아요

아니, 정말. Rails와 Ansible, Python 사이의 복잡한 문제인 줄 알고 이틀 동안 디버깅을 했더니, 결국 예전에는 force_https가 켜져 있던 서버가 이제 꺼져 있어서, 요청이 https://myserver 대신 http://myserver로 보내진 거였어요.

이건 버그인 것 같습니다.

2개의 좋아요

네, 실제로 버그입니다.

지난주 포럼을 다른 서버로 이전하던 중 LetsEncrypt 재발행 한도(같은 호스트네임당 주당 최대 5회)에 도달하는 문제가 발생했습니다. 처음에는 그 이유가 무엇인지 알지 못했지만, 이 버그로 인해 빌드될 때마다 인증서가 재발행되었고, 5회 이후에 속도 제한(rate limit)에 걸렸습니다. 이전 인증서가 여전히 서버에 남아 있었기 때문에 어떤 경고도 울리지 않았습니다.

포럼을 새 서버로 옮길 때까지는 문제없었습니다. 하지만 그때 새로운 인증서를 받지 못했습니다. 이전 서버에서 복사해 올 수는 있었지만, 그 원인이 무엇인지 우리는 깨닫지 못했습니다.

acme.sh는 2.9.0으로 고정되어 있으며, 마스터 브랜치는 3.0.1 버전으로 기본 체인(default chain)을 설정하는 기능을 갖추고 있는데, 이것이 관련이 있을 것으로 의심됩니다.

3개의 좋아요

Falco님, 이거 한번 봐주실래요? 이쪽 분야에 잘 아시는 것 같아서요. 지난 1~2주 동안 몇 시간씩이나 이것저것 해봤는데도 여전히 무슨 일이 일어나고 있는지 모르겠어요.

1개의 좋아요

네, 지난 주말에 제가 직접 처리했어요. 여기는 연휴가 길어서요. 이번 주에 최대한 빨리 확인해 보겠습니다.

2개의 좋아요

아, 그 부분을 제가 놓쳤군요. 그럼 귀찮게 해서 죄송합니다.

우리 연휴가 막 끝났는데, 아파레시다 성모 대축일이 제 캘린더에 없었네요. 하지만 이제 알겠습니다.

감사합니다.

2개의 좋아요

다음으로 수정됩니다.

5개의 좋아요

이 일로 수고 많으셨어요, @Falco :slight_smile:

2개의 좋아요