티스토리 뷰

gnuTLS


네트워크를 통한 데이터 통신에 쓰이는 프로토콜인 TLS와 SSL의 오픈 소스 구현판C 언어로 작성되어 있는 중심 라이브러리 안에는, 기본적인 암호화 기능 및 여러 유틸리티 함수들이 구현되어 있다.


(OpenSSL의 위키피디아 설명이지만, gnuTLS도 마찬가지이므로....가져왔습니다)



말그대로, openSSL과 같은 보안 라이브러리인데 openSSL보다 조금 더 무겁고 조금 더 많은 기능을 지원한다고 합니다...


그렇다고 gnuTLS를 사용하기엔 너무 설명도 부족하고 사용하는 사람들도 적긴 하지만...ㅠㅠ


여튼 gnuTLS를 사용하게 되었습니다.




얼마나 많은 분들이 gnuTLS를 사용하시게 될지 모르겠지만, 저처럼 처음부터 멘붕에 빠지는 일은 없도록


기본적인 설치법과 예제 실행하는 법을 알려드리겠습니다.



먼저 gnuTLS는 리눅스 기반에서 실행됩니다.


다운받는 곳에 

GnuTLS for Windows

라는 글자가 있는 걸로 보아 윈도우도 지원하나 싶긴 하지만, 안그래도 구글링이 힘든 gnuTLS에 


더 찾기도 힘든 윈도우 버전 보다는 깔끔하게 리눅스 버전을 사용하도록 합시다.



저는 vmware를 사용하였습니당.





1. 필요한 파일 다운로드




1) gnuTLS 다운



우분투에서 


http://gnutls.org/download.html


에 접속해 gnutls를 내려받습니다.


웬만하면 가장 최신버전을 받기를 추천드립니다. Document가 최신 버전 기준입니다.


2016/8/19일 기준 3.5.3버전이 제일 최신 버전입니다.



2) gmplib 다운 



https://gmplib.org/


에 접속해서 gmplib.tar.lz 파일을 내려받습니다.




3) libnettle 다운


http://www.lysator.liu.se/~nisse/nettle/


에 접속해서 libnettle.tar.gz 파일을 내려받습니다.




2. 내려받은 파일 install하기



libnettle과 gmplib 파일의 압축을 풀어주고


sudo apt-get install build-essential nettle-dev gmplib-dev


명령어를 터미널 창에 입력해주세요



3. gnutls 파일 압축 풀기



gnuTLS 압축파일이 저장된 폴더(아마 지정 안했다면 Downloads 폴더) 내에서 터미널에


unxz gnutls-3.5.3.tar.xz


tar -xvf gnutls-3.5.3.tar


를 차례로 입력해주세요.



4. 디렉토리 이동



cd gnutls-3.5.3으로 디렉토리를 이동해주세요.



5. 컴파일 및 설치



./configure


make


make install


명령어를 차례로 입력해주세요



6. symbolic link 생성


ln -s /usr/local/lib/libgnutls.so.28 /usr/lib/libgnutls.so.28


의 명령어를 터미널에 입력해주세요





여기까지 잘 실행되었다면, 터미널에 gnutls-cli -v 명령어를 입력했을때



gnutls-cli 3.5.3

Copyright (C) 2000-2016 Free Software Foundation, and others, all rights reserved.

This is free software. It is licensed for use, modification and

redistribution under the terms of the GNU General Public License,

version 3 or later <http://gnu.org/licenses/gpl.html>



Please send bug reports to:  <bugs@gnutls.org>




요런식으로 나올겁니다


이제 설치는 끝났습니다.


( 혹시 gnutls-cli -v가 제대로 나오지 않는다면,

sudo apt-get install gnutls-bin 을 입력하고 한번더 해보시길 바랍니다)





찬찬히 gnutls-3.5.3 폴더 내부를 둘러보시면 생각보다 많은 것들이 저장되 있는것을 확인할 수 있습니다...!!


먼저, 제가 필요한 것은 서버 클라이언트간의 handshake 과정이었습니다.

예제 파일은

gnutls-3.5.3/doc/examples 내부에 저장되어있습니다.


그러나, 예제 파일을 돌려보기 전에, 

gnuTLS의 CA 인증서를 리눅스 서버의 인증서체인에 등록하는 과정이 필요합니다.

gnuTLS의 CA 인증서는 doc/credentials/x509 폴더의 ca.pem ca-key.pem 요 두개의 파일입니다.

ca.pem이 인증서파일,

ca-key.pem은 ca의 개인 키 파일입니다.


여기서 ca.pem 파일만 /usr/local/share/ca-certificates 폴더로 옮겨줍니다.

그리고 ca.pem 파일의 확장자를 .crt로 바꾸어줍니다.


그리고 터미널에

sudo update-ca-certificates

명령어를 입력해줍니다.

뭐라뭐라 나오는데 1 added, 라는 말이 있으면 인증서가 추가 되었다는 말입니다.


인증서가 추가됐는지 확인 하기 위해서는

/etc/ssl/certs/ca-certificate.crt 파일을 열어보았을때, 

스크롤 제일 아랫부분에 gnutls test CA가 등록되어 있으면 성공입니다.


이제 gnuTLS의 CA가 인증서체인에 등록되었으므로, gnutls의 Test CA로 인증된 인증서들이 모두 신뢰할 수 있는 인증서가 되었습니다.


이제, 별 어려움 없이 예제 파일을 돌려주면 됩니다.


코드는 많이 고칠 필요는 없습니다.

ex-serv-x509파일과

ex-client-x509 파일을 기준으로,

ex-serv-x509.c 파일내에서는 KEYFILE과 CERTFILE의 path를 key파일과 cert파일이 있는 곳으로 수정해주시면 됩니다.

귀찮으시면 그냥 key파일과 cert파일을 gnutls-3.5.3/doc/examples 폴더로 가져오셔도 됩니다.


ex-client-x509.c 파일내에서는 my_host_name 대신 localhost를 적어주시면 됩니다.

혹은 127.0.0.1도 괜찮습니다.

그것만 수정하고

컴파일 한 뒤, 돌려주시면 됩니다....

컴파일은


gcc -o ex-serv-x509 ex-serv-x509.c `pkg-config gnutls --cflags --libs` -lgnutls

gcc -o ex-client-x509 ex-client-x509.c tcp.c`pkg-config gnutls --cflags --libs` -lgnutls


로 컴파일 해주시면 됩니다.

클라이언트는 자동으로 tcp.c에 링크가 되지 않아 같이 컴파일 해주셔야 오류가 나지 않습니다.


컴파일 한 뒤 터미널 하나를 열어

./ex-serv-x509

다른 터미널에서 

./ex-client-x509를 실행하면


이렇게만...하신다면...

handshake completed 라는 말을 보실수 있을겁니다.



그림도 없이 너무 말로 풀어써서 이해가 힘드실 수도 있지만,

이까지 과정에서 잘 안되는 부분이 생기시면 제가 아는 성의껏 도와드리겠습니다.



영어는 어렵고

gnuTLS의 자료는 찾기 힘듭니다...


댓글