개요

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
    BASH

    Mac OSX에서 64bit로 컴파일

    ./Configure darwin-i386-cc shared no-md2 no-mdc2 no-rc5 no-rc4  --prefix=/usr/local
    BASH

    Linux 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.
CODE
  • --prefix 옵션을 주지 않으면 기본적으로 /usr/local/ 밑에 나눠서 들어간다. header (.h)는 /usr/local/include/openssl, openssl 실행 파일은 /usr/local/bin, library 는 /usr/local/lib/openssl 폴더에 설치된다.

    기본적으로 정적 라이브러리(static library)로 컴파일되며 만약 동적 라이브러리(shared library) 로 컴파일할 경우 ./configshared 옵션을 추가한다. (기본값 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 뒤에는 설치될 경로를 입력)
    (info) 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을 만들기 위해 다음 명령어 실행
    (info) 64bit 로 빌드할 경우는 ms\ do_win64a 를 실행한다.

    ms\do_ms.bat
    BASH
  • nmake로 빌드 시작(static 의 경우 ms\nt.mak 를 사용)

    nmake -f ms\ntdll.mak
    BASH
  • test 를 수행하려면 다음 명령어 실행

    nmake -f ms\ntdll.mak test
    BASH
  • prefix로 지정해준 경로에 설치하려면 다음 명령어 실행

    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.

  • 어셈블러 에러가 나면 configno-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용 미리 컴파일 한 바이너리를 다운받을 수 있는 사이트가 정리되어 있다.


같이 보기