본문 바로가기

tls

Ubuntu 20.04에서 PQ TLS 1.3 handshake 실습

반응형

#Ubuntu 22.04는 절대 안됩니다

##Ubuntu 20.04로 해야합니다

 

저는 도커 환경에서 진행하였습니다. 저번에도 말했듯 서버 클라이언트 컴퓨터 굳이 두개 놓을 필요 없이 한 컴퓨터에서 터미널 두개 띄우고 실험 진행이 가능하기 때문에 정말 좋습니다.

 

첫번째 단계 : openssl version 업데이트 시키기

 

1.docker image pull 해줍니다. 이때 ubuntu:latest로 하지 마세요. 무조건 ubuntu version 20.04이어야 합니다.(제가 버전 때문에 헛짓거리를 한달 째하고 있었던 것 이었습니다.)

docker pull ubuntu:20.04

 

2. docker run -it --name <원하는 컨테이너 이름> ubuntu:20.04 /bin/bash 로 컨테이너를 실행시켜줍니다.

docker run -it --name test-ubuntu ubuntu:20.04 /bin/bash

 

3. docker exec -it <원하는 컨테이너 이름> /bin/bash로 이제 터미널에서 실행시켜봅시다.

docker exec -it test-ubuntu /bin/bash

 

4. sudo가 설치가 안되어있을 것이므로 sudo를 미리 설치합시다.

apt-get update && apt-get install -y sudo

5. 먼저 openssl 설치를 해줍니다.

sudo apt install openssl

openssl version

#버전 확인 :: 예시
OpenSSL 1.1.1o  3 May 2022

 

6. 

cd /usr/local/src/

sudo apt install wget

#openssl version은 원하는 버전으로 하되 PQTLS 실행시키려면 버전이 3.2.0 이상이어야 함
#현재 최신 버전은 3.4.1 이기 때문에 최신 버전으로 다운
sudo wget https://www.openssl.org/source/openssl-3.4.1.tar.gz

sudo tar xvf openssl-3.4.1.tar.gz

 

7.

sudo apt install perl gcc cmake ninja-build

cd openssl-3.4.1

sudo ./config

sudo make

sudo make install

 

8.

openssl version

#결과
openssl: error while loading shared libraries: libssl.so.3: cannot open shared object file: No such file or directory

 

9. library의 종속성을 확인할 때가 없는 것. libssl.so.3, libcrypto.so.3 임

$ ldd /usr/local/bin/openssl
        linux-vdso.so.1 (0x00007fff8bb46000)
        libssl.so.3 => not found
        libcrypto.so.3 => not found
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb693f38000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb693d46000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fb694074000)

 

10. 해당 라이브러리가 어디에 있는지 찾기

$ sudo find /usr/local/ -name libssl.so.3
/usr/local/src/openssl-3.4.1/libssl.so.3
/usr/local/lib64/libssl.so.3

$ sudo find /usr/local/ -name libcrypto.so.3
/usr/local/src/openssl-3.4.1/libcrypto.so.3
/usr/local/lib64/libcrypto.so.3

11. 편집기를 열어 .bashrc를 열어 적절한 행에 export LD_LIBRARY_PATH=/usr/local/lib64 추가 하고 source를 통해 다시 로드시킵니다.

sudo apt install nano

nano ~/.bashrc
source ~/.bashrc

 

 

12.버전을 확인하고 업데이트 완료된 것을 볼 수 있음

 

openssl version

#결과
OpenSSL 3.4.1 11 Feb 2025 (Library: OpenSSL 3.4.1 11 Feb 2025)

 

현재 심볼릭 링크를 생성했음에도 불구하고 openssl 버전이 여전히 1.1.1f로 출력되는 이유는, 시스템에서 호출되는 openssl 바이너리가 여전히 구버전으로 되어 있기 때문입니다.

몇 가지 확인해볼 사항은 다음과 같습니다.

  1. 바이너리 경로 확인
    먼저 어떤 openssl 바이너리가 실행되고 있는지 확인해보세요.만약 /usr/bin/openssl가 출력된다면, 시스템 기본 경로의 구버전 바이너리가 사용되고 있는 것입니다.
  2. which openssl
  3. 새로운 바이너리 설치 여부 확인
    OpenSSL 3.4.1을 컴파일 및 설치한 경우, 보통 /usr/local/bin/openssl 경로에 설치됩니다.로 실행하여 새로운 버전이 출력되는지 확인해보세요.
  4. /usr/local/bin/openssl version
  5. 환경 변수 PATH 업데이트
    새로운 바이너리가 /usr/local/bin에 있다면, PATH에서 /usr/local/bin이 /usr/bin보다 우선순위가 높도록 설정해야 합니다.
    예를 들어, .bashrc 또는 .profile에 아래와 같이 추가합니다.변경 후에는 터미널을 재시작하거나 source ~/.bashrc 명령어로 적용합니다.
  6. export PATH=/usr/local/bin:$PATH
  7. 동적 링커 캐시 갱신
    심볼릭 링크를 생성한 후에도 동적 링커 캐시가 갱신되지 않았다면, 아래 명령어로 갱신해보세요.
  8. sudo ldconfig

이러한 과정을 통해 올바른 openssl 바이너리와 라이브러리가 사용되도록 설정하면, OpenSSL 3.4.1 버전이 출력될 것입니다.

두번째 단계 : oqs-provider라이브러리 openssl에 확장시키기

1. 

cd /usr/local/src

 

2.

sudo apt -y install git build-essential perl cmake autoconf libtool zlib1g-dev

git clone https://github.com/open-quantum-safe/liboqs.git
cd liboqs

#OPTIONAL# git checkout 78e65bf1

mkdir build && cd build

cmake \
  -DCMAKE_INSTALL_PREFIX=/usr/local/src \
  -DBUILD_SHARED_LIBS=ON \
  -DOQS_USE_OPENSSL=OFF \
  -DCMAKE_BUILD_TYPE=Release \
  -DOQS_BUILD_ONLY_LIB=ON \
  -DOQS_DIST_BUILD=ON \
  ..

make -j $(nproc)
make -j $(nproc) install

 

3.

cd /usr/local/src

 

4.

git clone https://github.com/open-quantum-safe/oqs-provider.git
cd oqs-provider


liboqs_DIR=$BUILD_DIR cmake \
  -DCMAKE_INSTALL_PREFIX=$WORKSPACE/oqs-provider \
  -DOPENSSL_ROOT_DIR=/usr/local/src \
  -DCMAKE_BUILD_TYPE=Release \
  -S . \
  -B _build
cmake --build _build

5.

cd oqs-provider
scripts/fullbuild.sh
sudo cmake --install _build
scripts/runtests.sh

6. openssl version -d 를 통해 경로를 확인하고,

OPENSSL configuration file을 nano 명령어를 통해 수정합니다

openssl version -d

#결과
OPENSSLDIR: "/usr/local/ssl"
sudo nano /usr/local/ssl/openssl.cnf

7.이 내용을 추가하거나 수정합니다. 저장은 아시죠?

# PQC via OpenQuantumSafe
[provider_sect]
default = default_sect
oqsprovider = oqsprovider_sect

[default_sect]
activate = 1

[oqsprovider_sect]
activate = 1

 

8. oqs-provider 잘 끌어오는지 봅시다

openssl list -providers

#결과
Providers:
  default
    name: OpenSSL Default Provider
    version: 3.4.1
    status: active
  oqsprovider
    name: OpenSSL OQS Provider
    version: 0.8.1-dev
    status: active

 

세번째 단계 : 서버의 인증서 생성 및 클라이언트와의 연결

 

<서버>

#우선 ifconfig를 통해 서버 ip 확인을 위한 빌드업
sudo apt install net-tools

ifconfig
#서버 ip주소 확인

#mldsa44 꼭 안해도 됩니다. 

#CA (인증 기관) 인증서 생성
openssl req -x509 -new -newkey mldsa44 -keyout mldsa44_CA.key -out mldsa44_CA.crt -nodes -subj "/CN=test CA" -days 365 -config /usr/local/ssl/openssl.cnf

#서버용 개인 키 생성
openssl genpkey -algorithm mldsa44 -out mldsa44_srv.key

#서버의 CSR(인증서 서명 요청, Certificate Signing Request) 생성
openssl req -new -newkey mldsa44 -keyout mldsa44_srv.key -out mldsa44_srv.csr -nodes -subj "/CN=test server" -config /usr/local/ssl/openssl.cnf

#서버의 인증서를 CA로 서명하여 발급
openssl x509 -req -in mldsa44_srv.csr -out mldsa44_srv.crt -CA mldsa44_CA.crt -CAkey mldsa44_CA.key -CAcreateserial -days 365

 

 

#서버 구축, kem은 mlkem768:frodo640shake 클라이언트가 저 두 종류중 하나로 kem 알고리즘으로 사용하면 됩니다.
#포트 번호 443으로 했습니다 원하시는 대로 하면 됩니다
openssl s_server -accept 443 -cert mldsa44_srv.crt -key mldsa44_srv.key -www -tls1_3 -groups mlkem768:frodo640shake

 

<클라이언트>

openssl s_client -connect <서버 ip주소>:<포트번호> -groups frodo640shake

결과

 

 

후 수고많았다 나

반응형