Microsoft 社는 2022년 6월 15일 Internet Explorer 11의 지원을 종료했습니다.

gnutls-3.7.10 on CentOS 5.8

제목

gnutls-3.7.10 on CentOS 5.8

공식 홈페이지 : https://www.gnutls.org/

0. 주의사항

2003년 8월 현재 CentOS 5.8 에서 주의사항은 다음과 같다.

  • gcc는 4.8.2 로 upgrade 해야 한다(gcc 4.4 안된다).
  • gnutls-3.8.1 및 gnutls-3.6.16 은 (소스코드를 수정하지 않는다면) 컴파일 할 수 없다.

1. 준비작업

1.1. 다운로드

https://www.gnutls.org/download.html 에서 다운로드 한다.

wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.7/gnutls-3.7.10.tar.xz

gnu 패키지들은 ftp 다운로드 경로를 제공하므로, CentOS 순정 wget 으로 다운로드 받을 수 있다.

1.2. make 및 xz 설치

yum install make xz -y

1.3. gcc 4.8.2 설치

이에 대해서는 필자가 작성한 다른 글을 참조한다.

1.4. gmp-6.3.0 설치

이에 대해서는 필자가 작성한 다른 글을 참조한다.

1.5. nettle-3.6 설치

이에 대해서는 필자가 작성한 다른 글을 참조한다.

1.6. p11-kit-0.25.0 설치

p11-kit 은 PKCS #11 을 위한 것으로 필수는 아니다.

p11-kit-0.25.0 설치와 다음과 같이 의존성 있는 프로그램의 설치에 관해서는 필자가 작성한 다른 글을 참조한다.

  • libtasn1-4.19.0
  • libffi-3.4.4

2. 컴파일 및 설치

설치 디렉토리(--prefix) 는 알아서 변경한다.

대부분의 Linux 배포판들은 /usr 이 설치 디렉토리(--prefix)이지만, 컴파일해서 설치하는 것들은 /usr/local 이나 /opt 아래에 두는 경우가 많다.

2.1. p11-kit 없이 설치

$ mkdir -p logs/gnutls-3.7.10
$ unxz -k gnutls-3.7.10.tar.xz
$ tar xvf gnutls-3.7.10.tar > logs/gnutls-3.7.10/tar.`date +%Y%m%d.%H%M%S`.log 2>&1
$ cd gnutls-3.7.10
$ CC=/opt/rh/devtoolset-2/root/usr/bin/gcc \
GMP_CFLAGS="-I/opt/gmp-6.3.0/include" \
GMP_LIBS="-L/opt/gmp-6.3.0/lib" \
HOGWEED_CFLAGS="-I/opt/nettle-3.6/include" \
HOGWEED_LIBS="-L/opt/nettle-3.6/lib64 -lhogweed" \
NETTLE_CFLAGS="-I/opt/nettle-3.6/include" \
NETTLE_LIBS="-L/opt/nettle-3.6/lib64 -lnettle" \
./configure \
--with-included-unistring \
--without-p11-kit \
--with-included-libtasn1 \
--prefix=/opt/gnutls-3.7.10 > ../logs/gnutls-3.7.10/config.`date +%Y%m%d.%H%M%S`.log 2>&1
$ make > ../logs/gnutls-3.7.10/make.`date +%Y%m%d.%H%M%S`.log 2>&1
$ make install > ../logs/gnutls-3.7.10/install.`date +%Y%m%d.%H%M%S`.log 2>&1

2.2. p11-kit 포함해서 설치

$ mkdir -p logs/gnutls-3.7.10
$ unxz -k gnutls-3.7.10.tar.xz
$ tar xvf gnutls-3.7.10.tar > logs/gnutls-3.7.10/tar.`date +%Y%m%d.%H%M%S`.log 2>&1
$ cd gnutls-3.7.10
$ CC=/opt/rh/devtoolset-2/root/usr/bin/gcc \
GMP_CFLAGS="-I/opt/gmp-6.3.0/include" \
GMP_LIBS="-L/opt/gmp-6.3.0/lib" \
HOGWEED_CFLAGS="-I/opt/nettle-3.6/include" \
HOGWEED_LIBS="-L/opt/nettle-3.6/lib64 -lhogweed" \
NETTLE_CFLAGS="-I/opt/nettle-3.6/include" \
NETTLE_LIBS="-L/opt/nettle-3.6/lib64 -lnettle" \
P11_KIT_CFLAGS="-I/opt/p11-kit-0.25.0/include/p11-kit-1" \
P11_KIT_LIBS="-L/opt/p11-kit-0.25.0/lib -lp11-kit" \
LIBTASN1_CFLAGS="-I/opt/libtasn1-4.19.0/include" \
LIBTASN1_LIBS="-L/opt/libtasn1-4.19.0/lib -ltasn1" \
CFLAGS="-I/opt/libtasn1-4.19.0/include" \
./configure \
--with-included-unistring \
--prefix=/opt/gnutls-3.7.10 > ../logs/gnutls-3.7.10/config.`date +%Y%m%d.%H%M%S`.log 2>&1
$ make > ../logs/gnutls-3.7.10/make.`date +%Y%m%d.%H%M%S`.log 2>&1
$ make install > ../logs/gnutls-3.7.10/install.`date +%Y%m%d.%H%M%S`.log 2>&1

3. 적용

3.1. 현재 환경에 적용

현재 환경에서는 다음과 같이 적용한다.

$ export PATH=/opt/gnutls-3.7.10/bin:${PATH}
$ export LD_LIBRARY_PATH=/opt/gnutls-3.7.10/lib:${LD_LIBRARY_PATH}

만약 libnettle.so.8 파일을 열수 없다는 에러가 발생한다면,

$ export LD_LIBRARY_PATH=/opt/nettle-3.6/lib64:/opt/gnutls-3.7.10/lib:${LD_LIBRARY_PATH}

pkg-config 를 사용하는 경우 다음의 내용도 추가할 수 있다.

export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:/opt/gnutls-3.7.10/lib/pkgconfig

3.2. 현재 로그인한 사용자에게 적용

현재 로그인한 사용자에게 적용하려면, ".bash_profile" 파일의 끝에 위의 내용을 추가한다.

3.3. 시스템 전체에 적용

3.3.1. 환경변수 변경

"/etc/bashrc" 파일의 끝에 위의 내용을 추가한다.

LD_LIBRARY_PATH 는 다음과 같이 ld.so.conf 를 변경하는 방법도 있다.

3.3.2. ld.so.conf 변경

"/etc/ld.so.conf.d/gnutls.conf" 파일을 편집(추가)한다.

$ vi /etc/ld.so.conf.d/gnutls.conf

다음의 내용으로 교체(추가)한다.

/opt/gnutls-3.7.10/lib

만약 libnettle 도 필요하다면, /etc/ld.so.conf.d/gnutls.conf 파일에 다음 내용을 추가한다.

/opt/nettle-3.6/lib64

변경사항을 적용한다.

$ ldconfig

4. 문제해결

4.1. p11-kit/pkcs11.h 파일 등이 없다는 에러

./../pkcs11_int.h:27:28: error: p11-kit/pkcs11.h: No such file or directory
./../pkcs11_int.h:39:29: error: p11-kit/p11-kit.h: No such file or directory
./../pkcs11_int.h:40:25: error: p11-kit/pin.h: No such file or directory
./../pkcs11_int.h:41:25: error: p11-kit/uri.h: No such file or directory

${P11_KIT_CFLAGS}/p11-kit/pkcs11.h 파일이 없다.

P11_KIT_CFLAGS 환경변수가 잘못되었다. 마지막에 p11-kit-1 이 붙어 있음에 주의한다.

P11_KIT_CFLAGS="-I/opt/p11-kit-0.25.0/include/p11-kit-1"

4.2. Libnettle 3.6 이 없다는 에러

configure: error:
***
*** Libnettle 3.6 was not found.

Libnettle 을 컴파일 해서 설치한 다음, 다음 2개의 환경변수를 추가한다.

  • NETTLE_CFLAGS="-I/opt/nettle-3.6/include"
  • NETTLE_LIBS="-L/opt/nettle-3.6/lib64 -lnettle"

4.3. Libhogweed 3.6 이 없다는 에러

configure: error:
***
*** Libhogweed (nettle's companion library) 3.6 was not found. Note that you must compile nettle with gmp support.

Libhogweed 는 Libnettle 에 포함되어 있다.

Libnettle 을 컴파일 할 때, gmp 경로를 추가했는지 확인할 필요가 있다.

다음 2개의 환경변수를 추가한다.

  • HOGWEED_CFLAGS="-I/opt/nettle-3.6/include"
  • HOGWEED_LIBS="-L/opt/nettle-3.6/lib64 -lhogweed"

NETTLE_CFLAGS 내지 NETTLE_LIBS 와 동일한 경로이지만, 이를 추가하지 않으면 에러가 해결되지 않는다.

4.4. gmp 가 없다는 에러

configure: error:
***
*** gmp was not found.

gmp 를 컴파일 해서 설치한 다음, 다음 2개의 환경변수를 추가한다.

  • GMP_CFLAGS="-I/opt/gmp-6.3.0/include"
  • GMP_LIBS="-L/opt/gmp-6.3.0/lib"

4.5. Libtasn1 4.9 가 없다는 에러

configure: error:
***
*** Libtasn1 4.9 was not found. To use the included one, use --with-included-libtasn1

configure 에 --with-included-libtasn1 옵션을 추가하거나, Libtasn1을 컴파일 해서 설치한 다음, 다음 2개의 환경변수를 추가한다.

  • LIBTASN1_CFLAGS="-I/opt/libtasn1-4.19.0/include"
  • LIBTASN1_LIBS="-L/opt/libtasn1-4.19.0/lib -ltasn1"

4.6. Libunistring 이 없다는 에러

configure: error:
***
*** Libunistring was not found. To use the included one, use --with-included-unistring

configure 에 --with-included-unistring 를 추가한다.

4.7. rsa_sec_decrypt 함수가 필요하다는 에러

configure: error: Nettle lacks the required rsa_sec_decrypt function

NETTLE_LIBS 환경변수에 -lnettle 이 누락된 경우 발생하는 에러이다.

4.8. P11_KIT 이 없다는 에러

checking for P11_KIT... no
configure: error:
***
*** p11-kit >= 0.23.1 was not found. To disable PKCS #11 support
*** use --without-p11-kit, otherwise you may get p11-kit from
*** https://p11-glue.freedesktop.org/p11-kit.html
***

configure 에 --without-p11-kit 옵션을 추가하거나, p11-kit을 컴파일 해서 설치한 다음, 다음 2개의 환경변수를 추가한다.

  • P11_KIT_CFLAGS="-I/opt/p11-kit-0.25.0/include/p11-kit-1"
  • P11_KIT_LIBS="-L/opt/p11-kit-0.25.0/lib -lp11-kit"

4.9. CK_ULONG 관련 에러

/opt/p11-kit-0.25.0/include/p11-kit-1/p11-kit/uri.h:89: error: redefinition of typedef 'CK_ULONG'
/opt/p11-kit-0.25.0/include/p11-kit-1/p11-kit/p11-kit.h:47: error: previous declaration of 'CK_ULONG' was here
make[5]: *** [verify.lo] Error 1

gcc 4.1.2 혹은 gcc 4.4 에서 발생하는 에러이다.

gcc를 4.8.2 로 upgrade 해야 한다

4.10. gettime 함수 선언이 잘못되었다는 에러

In file included from cli.c:65:0:
benchmark.h:38:20: error: static declaration of 'gettime' follows non-static declaration
inline static void gettime(struct timespec *ts)
^
In file included from benchmark.h:32:0,
from cli.c:65:
./gl/timespec.h:93:6: note: previous declaration of 'gettime' was here
void gettime (struct timespec *) _GL_ARG_NONNULL ((1));

gnutls-3.8.1 에서 발생하는 에러이다.

(소스코드를 수정하지 않는다면) gnutls-3.8.1 는 CentOS 5.8 에서 컴파일 할 수 없다.

4.10. typedef struct _IO_FILE FILE; 관련 에러

In file included from ./stdio.h:33:0,
from fopen.c:26:
/usr/include/stdio.h:46:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'typedef'
typedef struct _IO_FILE FILE;
^
fopen.c:29:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'static'
static FILE *
^
fopen.c:29:1: error: unknown type name 'FILE'

gnutls-3.6.16 에서 발생하는 에러이다.

(소스코드를 수정하지 않는다면) gnutls-3.6.16 는 CentOS 5.8 에서 컴파일 할 수 없다.

제목

첨부파일