2021년 5월 10일 월요일

Conda가 SSL 비표준 인증서 문제로 말썽을 부릴 때 REQUESTS_CA_BUNDLE 환경변수에 지정해 버리기

일러두기: 쉘변수(shell variable)와 환경변수(environment variable)는 다르다. 어떻게 다른지 정확하게 설명할 수 있는가? Unix Power Tools의 Shell and Environemtn Variable 항목을 인용하는 것으로 일단 책임을 회피하고자 한다.

Environment variables are managed by your shell. The difference between environment variables and regular shell variables is that a shell variable is local to a particular instance of the shell (such as a shell script), while environment variables are "inherited" by any program you start, including another shell. That is, the new process gets its own copy of these variables, which it can read, modify, and pass on in turn to its own children. In fact, every UNIX process (not just the shell) passes its environment variables to its child processes.

나에게 SSL 인증서 문제는 끊이 없는 떡밥이다. 도대체 몇번째 글을 쓰는 것인지 모르겠다. 해결이 된 것도 같다가, 여전히 이해가 가지 않는 상태로 되돌아가다가..

.condarc 파일에서 ssl_verify: false로 하여도 conda 명령이 제대로 작동하지 않는다면 어떻게 해야 될까? 깨끗하게 우분투 최신판을 설치한 서버(설치만 새로 했을 뿐, 서버의 구입 연도는 정말 오래되었음)에서는 별다른 조치를 취하지 않았음에도 conda 명령은 잘 돌아간다. 그런데 왜 CentOS 서버에서만 다음과 같은 에러가 나는 것일까? 약 2년 전에는 문제를 일으키지 않았었다. 현 근무지의 네트워크 보안이 강화된 것과 분명히 관계가 있으리라. 물론 이것은 전부 리눅스 컴퓨터에서 벌어지는 문제이다.

2021년 5월 18일 업데이트: SSL 인증서 문제를 해결하기 위해 땜질 처방을 너무 심해게 해서 불필요한 에러 오히려 만들고 있다. .condarc 파일에서 ssl_verify: false로 설정해도 conda 명령이 제대로 돌지 않는 이유는 .bashrc 파일에서 REQUESTS_CA_BUNDLE와 CURL_CA_BUNDLE 환경변수를 함부로 선언한 때문이었다. 해당 두 줄을 코멘트 아웃 처리하면 conda 명령이 잘 돈다!

$ conda install -c conda-forge -c bioconda quickmerge
Collecting package metadata (repodata.json): failed

CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/main/linux-64/repodata.json>
Elapsed: -

An HTTP error occurred when trying to retrieve this URL.
HTTP errors are often intermittent, and a simple retry will get you on your way.

If your current network has https://www.anaconda.com blocked, please file
a support request with your network engineering team.

u'https://repo.anaconda.com/pkgs/main/linux-64'

오늘은 conda 공식 문서에서 안내한 Using non-standard certificates를 따르기로 하였다. 연구소에서 쓰도록 배포되는 SSLPrism.crt 파일을 이 체계에 쑤셔넣으면 될 것이라고 생각했었지만 마음먹은대로 되지는 않았다.

크롬 웹브라우저에서 문제가 되는 웹사이트를 접속한 뒤 주소창 왼쪽의 잠긴 자물쇠를 클릭하여 '인증서(유효)'를 택한다. '인증경로' 탭에서 최상위에 있는 CA를 선택한 뒤 '인증서 보기'를 클릭하면 새 창이 뜰 것이다. 여기에서 '자세히' 탭을 선택한 뒤 '파일에 복사'를 클릭한다. 그러면 '인증서 내보내기 마법사'가 실행될 것이다. 내보내기 파일 형식은 특별히 건드리지 말고 원래 선택되어 있는 DER를 그대로 쓰도록 한다.


그 다음 과정은 conda 공식 문서에 나온대로 하면 된다. openssl 명령을 사용하여 DER로 인코딩하여 파일로 저장한 인증서(.cer)를 .pem으로 바꾼 뒤 이를 REQUESTS_CA_BUNDLE 환경 변수에 지정하면 된다. 명령어는 아래에 소개하였다. 실제 사례에서는 윈도우 PC에서 크롬으로 해당 사이트를 접속하여 .cer 파일을 받은 뒤, 리눅스로 전송하여 사용하였다. 리눅스에서는 오직 파이어폭스만을 쓰고 있기 때문이다.
  
$ openssl x509 -inform der -in /path/to/your/certificate.cer -out /path/to/converted/certificate.pem
$ export REQUESTS_CA_BUNDLE=/path/to/converted/certificate.pem

최상위 인증서에 ePrism SSL이 나오는 것은 어떤 웹사이트인가? non-standard certificate와 자체 서명 인증서는 무엇이 다른가? 최상위 인증서 자리에 ePrism SSL이 자리를 잡고 있는 것은 어떠한 웹사이트의 경우에 그런가? 만약 이런 것을 잘 이해하고 있다면 나는 인터넷 보안 전문가로 보수를 받고 일을 해야 할 것이다...

환경변수를 쓰지 않고 인증서의 위치를 .condarc 파일에 지정할 수는 없을까? 여러 사이트의 접속이 전부 문제라면, 인증서 번들을 전부 일정 디렉토리에 복사해 넣은 뒤 .condarc에서 해당 디렉토리를 지정해 버리면 되지 않을까? 

도대체 어디까지를 내가 알고 있고 어디부터를 모르는 것인지를 모르겠다. 이건 진짜 모른다는 뜻이다. 진정한 앎은 아는 것과 모르는 것의 경계를 명확히 아는 상태에 이르렀음을 의미하므로.

댓글 없음: