Network/OpenSSL

OpenSSL provider(oqs provider 예제로 이해)

crypsec 2024. 10. 18. 19:19
반응형

OpenSSL Provider는 OpenSSL 3.0 이상에서 도입된 기능으로, Provider를 사용하면 OpenSSL의 기능을 확장하고, 특정 요구 사항이나 알고리즘을 구현할 수 있다.
 
간단하게 말하자면 기존의 OpenSSL이 제공했던 기능들 외에 다른 기능을 사용하고 싶다면 OpenSSL에서 제공하는 C언어 API로 내가 구현한 코드(or open source 등)를 감싸서 사용하는 거다. 이게 기존에 Engine이라는 기능으로 제공되었다고한다.
 
2023년에 발표한 기능이라 2024년도 기준으로 자료도 별로 없고 OpenSSL 공식 사이트에서 사용법 접하니까 이해가 하나도 안 가더라. 코드 한 줄 짜기 힘들었다.
https://docs.openssl.org/3.0/man7/provider/
 
좀 더 자세한 내용들이 궁금하다면 아래 OpenSSL youtube에서 Provider 관련 영상들을 찾아보길 바란다.
https://youtu.be/mHrB1RKlkYk?si=WU3i2KHXPIjyWhFe

한 18분쯤 후부터 그림들이 나오는데 이걸 보면 조금 이해가 되지 않을까 싶다. 참고로 libcrypto 가 OpenSSL에서 제공하는 암호화 라이브러리 이름이다.


 
근데 내가 다른 Provider를 가져다 쓰거나 아니면 직접 만들어서 제공하고 싶을 때는 공식 문서를 참고해야 하는데, 이게 개인적으로 불편했다. 마치 영단어 뜻 찾기 위해서 영단어 사전을 한 장 한 장 넘겨보는 느낌이었다.

사전

 
이를 해결하기 위해 예제 코드를 열심히 찾아봤으나 찾지 못했고 문득 OQS가 떠올라서 이걸로 분석 및 빌드해서 Provider가 어떻게 동작하는지 해보려 한다. 
 
이제 대충 알겠지만, OQS (Open Quantum Safe) Provider는 OpenSSL에서 제공하는 Provider라는 기능을 이용해서 양자내성암호 알고리즘을 OpenSSL 환경에서 사용할 수 있도록 하는 아주 좋은 기능이다.
 
oqs provider는 여기서 다운로드 가능하다.
https://github.com/open-quantum-safe/oqs-provider
그냥 맘 편하게 설치하려면 script 디렉터리에 있는 fullbuild.sh 파일을 실행하면 된다. 실행 위치는 main directory 여야한다. script 디렉터리 위치에서 실행하는게 아니란걸 기억해야한다.
즉, 간단하게 scripts/fullbuild.sh 를 명령으로 인식시킬 수 있는 위치여야한다.
이러면 알아서 liboqs 다운로드 및 설치, oqs-provider 까지 다 설치 해준다.
 
수동으로 각각 설치해서 사용해 보려면 우선 liboqs 파일이 필요하다. 공식 사이트에서 보고 다운로드하여도 되고 어려우면 이전에 쓴 글이 있으니 봐도 된다. 어차피 똑같다.
https://github.com/open-quantum-safe/liboqs
2024.01.06 - [Network/OpenSSL] - Open Quantum Safe의 liboqs(양자내성암호 라이브러리) 빌드
 
참고로 liboqs 설치 시 ninja install을 해주는 게 편하다. oqs-provider의 main CMakeLists.txt에서 find_package(liboqs REQUIRED)라는 줄이 있는데 이게 있어서 미리 설정된 경로에 필요한 파일을 알아서 찾아준다. 아니면 따로 경로 지정을 해주던가 경로지정 파일을 만들어야 하는 귀찮음이 발생할 수 있다.
 
일단 ninja install을 하지 않고 liboqs 파일만 빌드했다고 가정한다.
 
이후 oqs-provider 디렉터리에서 아래 명령어를 실행한다.

cmake -S . -B _build

 
해당 명령어를 사용하면 CMake(소스 코드 관리 프로젝트라고 생각하면 된다.) 파일을 읽어서 make 파일을 생성한다.(Windows라면 보통 visual studio IDE 사용하니 make 파일 필요 없음, 단 mingw 같은 컴파일러 사용 시에는 필요할 거다)
 
일단 나는 아래와 같이 에러가 떴는데 liboqs를 못 찾겠다는 메시지다. 다시 liboqs 수동 설치로 돌아가서 ninja install을 해주면 빌드한 파일들을 찾을 수 있는 위치에 넣어주면서 쉽게 해결된다. 이게 싫다면 CMakeLists.txt 파일이든 뭐든 경로라던가 수정 및 추가 등을 해주면 된다. cmake는 자료가 많으니 검색해서 쓰는 게 쉽다.

ninja install을 해주면?

이렇게 된다. 참고로 .pc 파일은 pkg-config라는 도구에서 사용하는 파일로, 주로 C/C++ 개발에서 라이브러리의 정보를 제공하는 데 사용된다. pkg-config 도구는 .pc 파일을 읽고, 적절한 컴파일러 및 링커 플래그를 자동으로 생성해 주는데 은근히 모르는 사람이 많아서 남겨둔다. pkg-config는 linux 명령어다. 아래는 liboqs.pc 파일이다. 어디서 본 것 같은 것들이 있으면 gcc 같은 컴파일러의 옵션 등에 대해 아시는 분이라 생각되고 그게 아니더라도 크게 이해하는데 어렵지는 않다.

prefix=/usr/local
libdir=${prefix}/lib
includedir=${prefix}/include

Name: liboqs
Description: Library for quantum-safe cryptographic algorithms
Version: 0.11.1-dev
Requires.private: openssl
Cflags: -I${includedir}
Libs: -L${libdir} -loqs

 

반응형


어쨌건 cmake가 잘 동작했다.

$ make -j8

로 빌드해 준다.
마지막으로 다른 파일들이 .so 파일을 찾기 쉽게 하기 위해 make install을 해준다.

$ sudo make install

 
이러고 끝이 아니라 openssl.cnf 파일을 또 수정해줘야 한다.
https://github.com/open-quantum-safe/oqs-provider/blob/main/USAGE.md
위를 참고하여 진행한다.

 
openssl.cnf 파일은 나의 경우 아래와 같이 되어있다.

# List of providers to load
[provider_sect]
default = default_sect
# The fips section name should match the section name inside the
# included fipsmodule.cnf.
# fips = fips_sect

# If no providers are activated explicitly, the default one is activated implicitly.
# See man 7 OSSL_PROVIDER-default for more details.
#
# If you add a section explicitly activating any other provider(s), you most
# probably need to explicitly activate the default provider, otherwise it
# becomes unavailable in openssl.  As a consequence applications depending on
# OpenSSL may not work correctly which could lead to significant system
# problems including inability to remotely access the system.
[default_sect]
# activate = 1

 
나의 경우 openssl.cnf 파일 위치는 다음과 같았고 수정을 해주었다. 저장하고 reboot 해주는 걸 추천한다.

$ sudo vi /etc/ssl/openssl.cnf
[openssl_init]
providers = provider_sect
ssl_conf = ssl_sect

# List of providers to load
[provider_sect]
default = default_sect
oqsprovider = oqsprovider_sect
# The fips section name should match the section name inside the
# included fipsmodule.cnf.
# fips = fips_sect

# If no providers are activated explicitly, the default one is activated implicitly.
# See man 7 OSSL_PROVIDER-default for more details.
#
# If you add a section explicitly activating any other provider(s), you most
# probably need to explicitly activate the default provider, otherwise it
# becomes unavailable in openssl.  As a consequence applications depending on
# OpenSSL may not work correctly which could lead to significant system
# problems including inability to remotely access the system.
[default_sect]
# activate = 1
[oqsprovider_sect]
activate = 1

 
만약 oqs-provider.so를 openssl에서 못 읽는다면 -provider-path 옵션으로 지정해 주는 것도 가능하다.

$ openssl list -provider-path ~/oqs-provider/_build/lib -signature-algorithms -provider oqsprovider
반응형