OpenSSL 컴파일(compile) & 빌드(build)
개요
OpenSSL 은 Eric A. Young 이 만든 SSLeay 라이브러리를 기반으로 상용수준의 데이타암복호/SSL/TLS 라이브러리를 만들기 위한 프로젝트이다.
Linux 라면 apt-get이나 yum 으로 한방에 설치 가능하지만 Un*x 나 Windows 에서는 컴파일 할 일이 가끔 생겨서 빌드 방법을 정리해 본다.
빌드 사전 준비
- C/C++ Compiler가 필요하다. Windows 에서는 Visual Studio 2010 Express 버전을 사용하였고 HP-UX 에서는 aCC compiler 를 사용하였다.
- perl 이 필요하므로 Windows는 ActivePerl 이나 Strawberry Perl 을 미리 설치해 놓는다. (대개의 Unix 는 미리 설치되어 있다.)
빌드
- openssl 홈페이지에서 라이브러리를 다운받는다.
- 압축을 풀고 나온 Install로 시작되는 파일들을 읽어 본다. 플랫폼별로 존재하며 확장자에는 플랫폼명이 있다.
예로 Win32 에서 빌드할 경우 Install.w32, Win64는 Install.w64를 참고하며 Unix는 Install 를 읽어 본다 - perl 로 작성된 ./Configure 스크립트를 수행하여 Makefile 을 생성하고 build 환경을 구성하게 된다.
기본적으로 static library 로 빌드되므로 dynamic library 로 빌드할 경우 shared 옵션을 추가한다.
openssl 에는 특허가 걸려있는 알고리즘이 있다. 오래되서 취약하고 쓸 일도 없는 알고리즘들이므로 다음 옵션을 꼭 추가해서 build 시 제외시키자.
no-idea no-md2 no-mdc2 no-rc5 no-rc4
Unix / Linux 빌드 방법
./Configure os-cpu-compiler 추가 옵션을 수행하면 된다. 다음은 HP-UX 에서 64bit 로 dynamic library 로 컴파일 하기 위한 설정이다.
PARISC HP-UX 에서 64bit로 컴파일
./Configure hpux64-parisc2-cc shared no-md2 no-mdc2 no-rc5 no-rc4 no-asm --prefix=/usr/local
BASHMac OSX에서 64bit로 컴파일
./Configure darwin-i386-cc shared no-md2 no-mdc2 no-rc5 no-rc4 --prefix=/usr/local
BASHLinux 64bit로 컴파일
./Configure linux-x86_64 shared no-md2 no-mdc2 no-rc5 no-rc4 --prefix=/usr/local
BASH- OS와 compiler를 잘 모를경우 다음과 같이 ./config 를 수행하면 해당 시스템에 맞게 자동으로 진행한다.(보통 32bit 로 build 하므로 64bit 가 필요할 경우 수동으로 os/compiler 주어야 한다.)
bash-4.2$ ./config
Operating system: 9000/800-hp-hpux1x
WARNING! If you wish to build 64-bit library then you have to
invoke './Configure hpux64-parisc2-cc' *manually*.
You have about 5 seconds to press Ctrl-C to abort.
--prefix 옵션을 주지 않으면 기본적으로 /usr/local/ 밑에 나눠서 들어간다. header (.h)는 /usr/local/include/openssl, openssl 실행 파일은 /usr/local/bin, library 는 /usr/local/lib/openssl 폴더에 설치된다.
기본적으로 정적 라이브러리(static library)로 컴파일되며 만약 동적 라이브러리(shared library) 로 컴파일할 경우 ./config 시 shared 옵션을 추가한다. (기본값 no-shared)
./config no-asm enable-seed enable-cms no-idea no-md2 no-md4 no-mdc2 no-rc2 no-rc4 no-rc5 no-zlib-dynamic
CODE설정이 완료되었으면 make 명령어로 컴파일한다.
make depend && make make test
CODE컴파일된 프로그램과 라이브러리/헤더를 설치한다. --prefix 로 경로를 지정했으므로 설치 경로는 /usr/local/ssl 이 된다.
make install
CODE
Windows 용 빌드 방법
- cmd를 열고 Visual Studio 에 포함되어 있는 vcvars32.bat를 실행해서 cmd에서 Visual C++ Compiler를 사용할 수 있게 환경 변수를 설정한다.
다음 명령어를 수행한다.(--prefix 뒤에는 설치될 경로를 입력)
64bit 로 빌드할 경우는 VC-WIN32 대신 VC-WIN64A 를 사용한다.32bit 로 빌드
perl Configure VC-WIN32 no-idea no-md2 no-mdc2 no-rc5 no-rc4 no-asm --prefix=d:\devel\openssl\openssl-1.0.0d_vc2010
BASH- enable-static-engine 를 Configure 시 입력하면 engine 을 libeay32.dll 에 포함시킬수 있다.(기본은 별도의 dll)
- Debugging symbol로 빌드하려면 VC-WIN32 대신 debug-VC-WIN32 를 입력한다.
Makefile을 만들기 위해 다음 명령어 실행
64bit 로 빌드할 경우는 ms\ do_win64a 를 실행한다.ms\do_ms.bat
BASHnmake로 빌드 시작(static 의 경우 ms\nt.mak 를 사용)
nmake -f ms\ntdll.mak
BASHtest 를 수행하려면 다음 명령어 실행
nmake -f ms\ntdll.mak test
BASHprefix로 지정해준 경로에 설치하려면 다음 명령어 실행
nmake -f ms\ntdll.mak install
BASH
TroubleShooting
Windows에서 빌드시 다음 같은 오류가 나면 해당 소스 파일을 에디터에서 열어서 UTF-8 형식으로 저장하거나 소스의 처음 부분에 ''#pragma warning(disable: 4819)'' 를 추가해 준다.
현재 코드 페이지(number)에서 표시할 수 없는 문자가 파일에 들어 있습니다. 데이터가 손실되지 않게 하려면 해당 파일을 유니코드 형식으로 저장하십시오.
The file contains a character that cannot be represented in the current code page (number). Save the file in Unicode format to prevent data loss.어셈블러 에러가 나면 config 에 no-asm 옵션을 추가한다.
md5-x86_64.s: Assembler messages: md5-x86_64.s:41: Error: 0xd76aa478 out range of signed 32bit displacement
CODE
Pre Compiled Binary
OpenSSL Wiki 에 Windows용 미리 컴파일 한 바이너리를 다운받을 수 있는 사이트가 정리되어 있다.
- 실행 파일과 DLL만 배포 - https://indy.fulgan.com/SSL/openssl-1.0.2h-i386-win32.zip
- header 와 library 포함 배포판 - https://slproweb.com/download/Win32OpenSSL-1_0_2h.exe