Network/OpenSSL

[OpenSSL] OpenSSL 설치 방법 리눅스(Linux)

crypsec 2023. 10. 28. 13:11
반응형

Ubuntu & Kali Linux 운영체제에 OpenSSL 설치 방법

패키지로 설치하는 방법
$ sudo apt update && sudo apt upgrade
$ sudo apt install libssl-dev openssl
openssl 공식 사이트에서 설치

 
공식 다운로드 사이트 - https://www.openssl.org/source/
저는 가장 최근에 나온 3.14 버전을 다운로드하여 보겠습니다. 빨간색 밑줄로 된 파일입니다.

OpenSSL 공식 사이트

CLI(Command Line Interface) 환경에서는 wget 명령어로 받아줍니다.

$ wget https://www.openssl.org/source/openssl-3.1.4.tar.gz
wget으로 받은 OpenSSL 압축 파일

압축을 풀어줍니다.

$ tar -zxvf openssl-3.1.4.tar.gz

압축 해제한 디렉터리로 이동합니다.

$ cd openssl-3.1.4/ && ls
openssl-3.1.4 디렉터리 내부 파일들

초록색으로 표시된 Configure라는 파일이 보이시나요? 이는 실행가능한 파일입니다. Windows의. exe 파일 같은 겁니다.
실행시켜 줍니다. 뒤에 인자를 줄 수도 있습니다.

$ ./Configure

만약 실행이 잘 되지 않는다면 패키지들이 설치되어있지 않거나 파일이 빠졌던지 등 여러 경우의 수가 있습니다. 메시지를 잘 보시고 따라서 해결해 주시면 됩니다. 저의 경우 패키지 설치 문제였습니다.

$ sudo apt install gcc make

문제가 해결되었다면 아래와 같이 떠야 합니다.

Makefile이 생겼는지 확인해 보시고 생겼다면 make 명령어를 때려줍니다. 저는 속도를 높이기 위해 -j 옵션을 붙였습니다.

$ make -j

이제 실행시켜 보겠습니다. openssl을 실행시킬 수 있는 파일은 apps 디렉터리 안에 있습니다.

$ apps/openssl

그럼 아래와 같은 에러가 뜨시는 분들이 계실 겁니다. 이는 Ubuntu에 기본적으로 OpenSSL이 설치되어 있는데 저는 1.1.1f 버전으로 설치되어 있습니다. 저희는 지금 3.1.4 버전을 설치했습니다. 따라서 이에 맞는 libssl.so.3 이라는 동적 라이브러리 파일을 읽어와야 하는데 찾지 못해서 발생하는 겁니다.

아래 명령어를 통해 라이브러리 의존성을 확인할 수 있습니다.

$ ldd apps/openssl

지금 not found라고 뜨는 부분을 찾아야줘야 합니다.
 
그럼 찾을 수 있도록 위치를 알려주면 됩니다. 찾는 라이브러리는 openssl-3.1.4 디렉터리에 있습니다. 따라서 현재 위치에서 아래 명령어를 쳐주시면 됩니다.

$ export LD_LIBRARY_PATH=./

이제 실행까지 시켜보면 아래와 같은 결과가 나옵니다.

지금까지 다 Ubuntu환경에서의 캡처를 가져다 썼는데 이번엔 Kali Linux에서 version 확인 캡처사진을 가져와봤습니다.

$ apps/openssl version

저희가 설치한 버전과 일치합니다.

 
그런데 매번 실행할 때마다 openssl-3.1.4 디렉터리로 가서 apps/openssl 명령어를 입력하여 실행하는 게 조금 짜증 날 수 있습니다.
 
아무 위치에서나 설치한 openssl 버전을 실행하고 싶다면 /bin 디렉터리 등으로 파일들을 옮겨줘야 합니다.
 
그걸 일일이 다해야 해?
라고 생각할 수 있지만 아까 위의 make 명령어 이후 아래 명령어를 활용하면 알아서 해줍니다.

$ sudo make install

그런데 이미 openssl이 설치되어 있는 리눅스의 경우 기존의 openssl 버전을 default로 실행하게 됩니다.
따라서 경로를 설정해줘야 합니다.
 
아래 명령어로 openssl 실행파일들의 위치를 찾아줍시다. 또는 which -a openssl 라고 입력하면 openssl 명령어 위치를 모두 출력해 주게 됩니다.

$ whereis openssl

그 결과 두 개의 경로가 뜹니다.

openssl: /usr/bin/openssl /usr/local/bin/openssl

/usr/bin/openssl가 기존에 설치되어 있던 실행파일이었습니다. ( /usr/bin/openssl version 명령어로 확인해 봄)
 
저의 경우 새로운 실행파일이 /usr/local/bin/openssl 위치에 설치되었기 때문에 아래 명령어로 시스템이 /usr/local/bin을 먼저 검색하여 openssl을 찾도록 설정하겠습니다. 근데 이것도 초기화될 수도 있습니다. (아직 라이브러리는 링킹 안 했음)

$ export PATH=/usr/local/bin/openssl:$PATH

 
따라서 심볼릭 링크를 이용하는 방법을 사용하겠습니다. 심볼릭 링크란 간단하게 말하면 윈도우에서의 바로가기 파일을 만드는 느낌입니다. 단 심볼릭 링크는 뒤에 지정해 주는 경로에 이름이 같은 파일이 존재해서는 안됩니다. 시스템은 가장 먼저 usr/bin/, usr/lib/ 디렉터리에서 해당 명령어를 찾습니다. 이는 리눅스 관련 지식이라 기회가 되면 올리겠습니다. 

$ sudo mv /usr/bin/openssl /usr/bin/openssl_old
$ sudo ln -s /usr/local/bin/openssl /usr/bin/openssl

##################
# 이런 방법도 있다 #
##################

# 위의 명령어를 실행했다면 우선 심볼릭 링크 삭제를 해줘야함 - sudo unlink /usr/bin/openssl
# sudo ln -s /home/사용자이름/openssl-3.1.4/apps/openssl /usr/bin/openssl

 
이렇게 하면 기존 파일이 openssl_old로 백업되고, 새로운 OpenSSL이 /usr/bin/openssl로 연결됩니다.
 
이제 라이브러리 경로에 심볼릭 링크를 적용하겠습니다.

$ sudo ln -s /usr/local/lib64/libssl.so.3 /usr/lib/libssl.so.3
$ sudo ln -s /usr/local/lib64/libcrypto.so.3 /usr/lib/libcrypto.so.3


########################
여기도 마찬가지로 응용가능

# sudo ln -s /home/사용자이름/openssl-3.1.4/libcrypto.so.3 /usr/lib/libcrypto.so.3
# sudo ln -s /home/사용자이름/openssl-3.1.4/libssl.so.3 /usr/lib/libssl.so.3
응용 버전 심볼릭 링크 형성 확인

 
이제 시스템에서 openssl 명령을 실행하면 새로운 OpenSSL이 사용됩니다.

-------------
동적라이브러리 관련으로 짧게 팁하나 남기자면 위 방법도 괜찮지만 내 home 디렉터리안에 라이브러리를 남기지 않고  운영체제에서 알아서 읽게 하고 싶을수도 있지않은가?

이때는 /usr/lib/ 위치나 /lib/ 디렉터리 위치에 그냥 동적라이브러리를 복사해 넣거나 옮긴 후 ldconfig 명령어를 한 번 입력해주면 응용프로그램들이 알아서 라이브러리 위치를 인식한다.

아래는 chatgpt의 설명(ldconfig 명령어는 다른 블로그들에 정리가 너무 잘 되어있어 굳이 따로 설명은 안하겠다)

1. **ldconfig 실행:**
   `/usr/lib`에 새로운 라이브러리를 추가한 경우, `ldconfig` 명령을 실행하여 동적 라이브러리 캐시를 업데이트해야 할 수 있습니다. 다음 명령을 터미널에서 실행하세요:

   ```bash
   sudo ldconfig
   ```

   이 명령은 라이브러리 캐시를 갱신하여 시스템이 새로운 라이브러리를 찾을 수 있게 합니다.

2. **실행 파일에 대한 의존성 확인:**
   실행 파일이 필요로 하는 라이브러리들의 의존성을 확인하세요. `ldd` 명령을 사용하여 실행 파일이 참조하는 라이브러리를 확인할 수 있습니다:

   ```bash
   ldd /path/to/your/executable
   ```

   이 명령은 실행 파일이 어떤 라이브러리들에 의존하는지 나열합니다. 필요한 라이브러리가 없다면, 해당 라이브러리를 설치해야 합니다.

3. **라이브러리 경로 확인:**
   실행 파일이 라이브러리를 찾을 수 있는 경로를 확인하세요. `ldconfig`가 제대로 동작했다면 `/usr/lib`가 이미 캐시에 등록되어 있을 것입니다. 그러나 `/usr/lib` 외의 디렉토리에 라이브러리를 복사했다면, 해당 디렉토리가 라이브러리를 찾을 수 있는 경로에 등록되어 있어야 합니다. 이를 확인하기 위해 `ldconfig -v` 명령을 사용할 수 있습니다.

ldconfig -v | grep /usr/lib

`ldconfig`는 Linux 시스템에서 동적 라이브러리 캐시를 관리하는 유틸리티입니다. 동적 라이브러리는 프로그램이 실행 중에 로드되는 라이브러리로서, 여러 프로그램에서 공유되어 사용됩니다. `ldconfig`는 이러한 동적 라이브러리들을 검색하고 캐시에 등록함으로써 프로그램이 실행될 때 효율적으로 라이브러리를 찾을 수 있게 해줍니다.

기본적으로, `ldconfig`는 `/etc/ld.so.conf` 파일과 `/etc/ld.so.conf.d/` 디렉터리에 정의된 라이브러리 디렉터리 경로를 읽어들여 캐시에 등록합니다. 그리고 `ldconfig` 명령을 실행함으로써 이러한 캐시를 업데이트할 수 있습니다.

간단히 말하면, `ldconfig`는 시스템이 어떤 디렉터리에서 동적 라이브러리를 찾아야 하는지 알 수 있도록 해주는 유틸리티입니다. 새로운 라이브러리를 설치하거나 기존 라이브러리를 업데이트한 경우, `ldconfig`를 실행하여 라이브러리 경로를 새로고침하여 시스템이 업데이트된 라이브러리를 찾을 수 있도록 합니다.

`/lib` 디렉터리는 기본적으로 `ldconfig`에 의해 검색되는 라이브러리 경로 중 하나입니다. 일반적으로 시스템 라이브러리가 위치하는 디렉터리 중 하나이기 때문에 `ldconfig`가 자동으로 해당 디렉터리를 검색하고 캐시에 등록합니다.

따라서 `/lib`에 공유 라이브러리를 추가하고 `sudo ldconfig`를 실행하면, 시스템이 해당 디렉터리를 자동으로 확인하고 라이브러리를 찾을 수 있게 됩니다. 만약 라이브러리가 `/lib`에 위치하는 것이 표준 시스템 라이브러리들과 일치한다면, 별다른 문제 없이 동작할 것입니다.

다만, 주의해야 할 점은 시스템 디렉터리에 직접 라이브러리를 추가하는 것은 피하는 것이 좋습니다. 시스템 라이브러리 디렉터리에 직접 추가하면 다른 패키지들과의 충돌이나 시스템 업데이트 시 문제가 발생할 수 있습니다. 대신, 사용자 정의 라이브러리는 `/usr/local/lib` 또는 `/opt`와 같은 사용자 지정 디렉터리에 설치하는 것이 좋습니다. 그리고 필요한 경우 `ldconfig`를 사용하여 해당 디렉터리를 캐시에 등록하면 됩니다.
 

반응형