레이블이 openssl인 게시물을 표시합니다. 모든 게시물 표시
레이블이 openssl인 게시물을 표시합니다. 모든 게시물 표시

2014년 7월 26일 토요일

공개키 암호 방식, SSL/TLS, Open SSL

[고대? 암호화 방식들]

http://en.wikipedia.org/wiki/Scytale
http://en.wikipedia.org/wiki/Caesar_cipher





[공개키 암호 방식 설명 link 모음]
http://charlie0301.blogspot.kr/2014/07/link-public-key-infrastructure.html

: 디지털 서명 & 메시지 암호화
http://technet.microsoft.com/ko-kr/library/aa998077

* 공개키, 개인키 암호화 방식을 통해 메세지가 송신자에게서 전달된 것임을 확인하는 디지털 서명과 메세지를 암호화, 복호화 하기 위해 서로간 세션키를 전달하는 것이 기본 내용.

* 공개키 암호화/복호화 시 계산의 복잡성으로 다소 큰 비용이 발생하여
   임시 세션키를 사용하여 메세지를 암호화 하고 세션키를 공개키로 암호화 하여 비용 절감.



[X.509]
http://en.wikipedia.org/wiki/X.509
Public Key Infrastructure (PKI)와 Privilege Management Infrastructure (PMI)의 ITU의 표준으로 public key certificates에 대해서도 언급하고 있음.

* 즉 인증서는 공개키와 키의 정보를 함께 포함하고 있음.

$ openssl x509 -in freesoft-certificate.pem -noout -text
Certificate:
   Data:
       Version: 1 (0x0)
       Serial Number: 7829 (0x1e95)
       Signature Algorithm: md5WithRSAEncryption
       Issuer: C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting cc,
               OU=Certification Services Division,
               CN=Thawte Server CA/emailAddress=server-certs@thawte.com
       Validity   
           Not Before: Jul  9 16:04:02 1998 GMT
           Not After : Jul  9 16:04:02 1999 GMT
       Subject: C=US, ST=Maryland, L=Pasadena, O=Brent Baccala,
                OU=FreeSoft, CN=www.freesoft.org/emailAddress=baccala@freesoft.org
       Subject Public Key Info:
           Public Key Algorithm: rsaEncryption
           RSA Public Key: (1024 bit)
               Modulus (1024 bit):
                   00:b4:31:98:0a:c4:bc:62:c1:88:aa:dc:b0:c8:bb:
                   33:35:19:d5:0c:64:b9:3d:41:b2:96:fc:f3:31:e1:
                   66:36:d0:8e:56:12:44:ba:75:eb:e8:1c:9c:5b:66:
                   70:33:52:14:c9:ec:4f:91:51:70:39:de:53:85:17:
                   16:94:6e:ee:f4:d5:6f:d5:ca:b3:47:5e:1b:0c:7b:
                   c5:cc:2b:6b:c1:90:c3:16:31:0d:bf:7a:c7:47:77:
                   8f:a0:21:c7:4c:d0:16:65:00:c1:0f:d7:b8:80:e3:
                   d2:75:6b:c1:ea:9e:5c:5c:ea:7d:c1:a1:10:bc:b8:
                   e8:35:1c:9e:27:52:7e:41:8f
               Exponent: 65537 (0x10001)
   Signature Algorithm: md5WithRSAEncryption
       93:5f:8f:5f:c5:af:bf:0a:ab:a5:6d:fb:24:5f:b6:59:5d:9d:
       92:2e:4a:1b:8b:ac:7d:99:17:5d:cd:19:f6:ad:ef:63:2f:92:
       ab:2f:4b:cf:0a:13:90:ee:2c:0e:43:03:be:f6:ea:8e:9c:67:
       d0:a2:40:03:f7:ef:6a:15:09:79:a9:46:ed:b7:16:1b:41:72:
       0d:19:aa:ad:dd:9a:df:ab:97:50:65:f5:5e:85:a6:ef:19:d1:
       5a:de:9d:ea:63:cd:cb:cc:6d:5d:01:85:b5:6d:c8:f3:d9:f7:
       8f:0e:fc:ba:1f:34:e9:96:6e:6c:cf:f2:ef:9b:bf:de:b5:22:
       68:9f

http://technet.microsoft.com/en-us/library/cc737264(v=ws.10).aspx





[Secure Scokets Layer(SSL)/Transport Layer Security(TLS)]

http://en.wikipedia.org/wiki/Transport_Layer_Security
http://ko.wikipedia.org/wiki/%ED%8A%B8%EB%9E%9C%EC%8A%A4%ED%8F%AC%ED%8A%B8_%EB%A0%88%EC%9D%B4%EC%96%B4_%EB%B3%B4%EC%95%88

인터넷 상에서 server, client간 communication 보안을 위해 설계된 protocol으로
암호화된 연결 및 데이터 무결성을 확보해 줌.

SSL specification은 1994, 1995, 1996년에 Nescape Communications에 의해 개발되었고 TLS는 IETF(Internet Engineering Task Force)에 의해 SSL을 기반하여 정의 됨.

: Authentication flow
https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&cad=rja&uact=8&ved=0CD8QFjAD&url=http%3A%2F%2Fmarcof.tistory.com%2Fattachment%2Fcfile25.uf%40144CA5344DDE672A3331AD.ppt&ei=Bq_DU6HINcLClAW6hoGoDg&usg=AFQjCNFQ3mOybIaplRiShYaYpWdqogYg-A&sig2=Ghmtl1v8oEE-rEk8hlrZkw&bvm=bv.70810081,d.dGI


- 앞장 1,2번을 통해 server, client 서로 random data를 주고 받음
- 서버는 4번을 통해 자신이 가지고 있는 인증서를 전달(CA의 개인키로 암호화 된)
 : client는 일반적으로 CA의 공개키를 가지고 있다.
- Client는 Server, client random data를 사용하여 Master Secret을 생성
- 생성된 Master Secret를 서버 공개키를 사용하여 암호화 후 전달(8번)
- Server, Client는 Master Secret를 사용하여 임시키(Session Key)를 생성함.
- 이후 Server, Client는 Session Key를 사용하여 - 데이터를 암호화/복호화 함. (대칭키 암호화 방식)

* client는 일반적인 서버를 인증하는 CA의 공개키(public key)를 가지고 있고, 서버는 CA로 부터 CA의 개인키(private key)로 암호화된 서버의 인증서를 가지고 있음.
 => 즉 client는 가지고 있는 CA의 공개키로 서버로 부터 받은 인증서를 복호화 하여 서버를 검증 함.

* server, client는 random data를 서로 공유하고 server, client에서 사용할 임시키(Session key)를 만들기 위한 Master Secret를  client에서 생성하여 전달함.
 : random data기반하여 clent가 master secret를 생성하는 공식은 다른 자료 참고


[SSL 관련 참조 링크]

SSL과 인증서
http://opentutorials.org/course/228/4894

암호화 역사 (KISA)
http://seed.kisa.or.kr/iwt/ko/intro/EgovHistory.do



[OpenSSL]

OpenSSL (Wikipedia)
http://en.wikipedia.org/wiki/OpenSSL

OpenSSL 설치 및 사용
http://www.solanara.net/solanara/openssl

OpenSSL 인증서 생성
http://www.embedded101.com/Blogs/PaoloPatierno/tabid/106/entryid/366/MQTT-over-SSL-TLS-with-the-M2Mqtt-library-and-the-Mosquitto-broker.aspx
http://golmong.tistory.com/112


- SSL/TLS protocol을 open-source 기반으로 구현한 software library
- Eric Andrew Young, Tim Hudson이 만든 SSLeay library를 기반으로 1998년 시작되었음.
- License : Dual licensed (Apache License 1.0 + BSD License)

- 지원하는 알고리즘들
 . Ciphers
  > AES, Blowfish, Camellia, SEED, CAST-128, DES, IDEA, RC2, RC4, RC5, Triple DES, GOST 28147-89[7]
 . Cryptographic hash functions
  > MD5, MD4, MD2, SHA-1, SHA-2, RIPEMD-160, MDC-2, GOST R 34.11-94
 . Public-key cryptography
  > RSA, DSA, Diffie–Hellman key exchange, Elliptic curve, GOST R 34.10-2001

- 그외
. libReSSL : Heartbleed 이슈로 OpenBSD 쪽에서 OpenSsl 1.0.1g에서 fork 하여 개발, 불필요 부분 대거 삭제
. BoringSSL : 2014년 Google이 OpenSSL와 libReSSL 개발자와 협력하기 위해 OpenSSL을 fork함.

2014년 7월 14일 월요일

Tizen상에서 MQTT client 컴파일 하기 (with OpenSSL library)

Tizen 상에서 MQTT client들 중에서 C/C++ API들을 제공하는 solution 들을 테스트 하려 함.

대표적인 것은 Eclipse Paho와 libmosquitto 이며  (http://mqtt.org/wiki/doku.php/libraries)
대략 봤을 때는 두 solution들의 feature는 거의 유사하지만
코드 상으로는 libmosquitto가 다소 simple한 것 같아보임
(libmosquitto LOC 대략 7264, Paho LOC 대략 18395)..
(하지만 Paho도 simple한 것은 사실, 하지만 워낙 MQTT protocol 자체가 simple 하니...)

MQTT client를 테스트 해보려면
. 위 client library를 컴파일 해야 하고
. library 컴파일에 필요한 OpenSSL library를 컴파일 해야 하고
. application을 만들어 sample code를 포팅해야 함.



[MQTT client library compile]

1. Paho, libmosquitto를 tizen shared library로 컴파일 하기 위해서는
tizen sdk > File > New > Tizen Native Project > Library > Shared Library 프로젝트를 생성한다.


2. library 파일들을 inc, src 폴더로 복사한다.
 . Paho : sample 을 제외한 library 파일들을 복사
 . libmosquitto : python, js 파일들을 제외하고 복사

3. project setting
 . SSL/TLS 지원을 위해 preprocessor, include path 설정
  : Project properties > C/C++ Build > Settings > C++ Compiler/C Compiler > Preprocessor/Symbols
    >  Paho project : "OPEN_SSL", libmosquitto : "WITH_TLS" 설정
  : Project properties > C/C++ Build > Settings > C++ Compiler/C Compiler > Includes 에 OpenSSL source의 include path 설정 (아래)



[OpenSSL library compile]

Paho, libmosquitto에서 SSL/TLS 설정을 사용하고자 할 경우
Tizen에서 돌아가야할 OpenSSL의 libssl.so, libcrypto.so 가 필요함.
Tizen platform내의 OpenSSL shared library를 사용할 수 있겠지만
방법을 모르는 관계로 so를 만들어서 app과 함께 deploy해서 사용할 생각임.

일단 OpenSSL 최신버전을 다운 받을 수 있겠지만 Tizen용으로 빌드를 해야 하기에 git repository에 있는 것을 다운받아 컴파일 하자.
참고
 - Tizen GBS : https://source.tizen.org/ko/documentation/reference/git-build-system
 - GBS 빌드 방법 (by 서주영님)
    . source code download : http://seoz.egloos.com/3896390
    . GBS 설정 : http://seoz.egloos.com/3900549
 - cocos2d-x 포팅 후기 (by 이재홍님) : http://pyrasis.com/cocos2d-x/2013/05/19/cocos2d-x-tizen-port-post-mortem/


1. gerrit 등록 및 GBS 설정
 . gbs.conf는 는 tizen 홈피에 있는 것을 받아서 계정 정보(id, password) 추가
 . buildconf 주석'#' 처리
 . 서주영님 게시물 GBS 설정 3번 항목에 따라 URL 수정

2. OpenSSL repository clone
 . 일단 framework/security/openssl 를 다운 받았음... 사실 OpenSSL repository는 framework, platform 두개가 있는데 차이를 모르겠고 platform은 dependency가 있어 그냥 framework을 다운 받음.

3. 빌드 (gbs build -A armv7l)

빌드된 결과물은 rpm으로 나오겠지만 일단 so만 필요하므로
.gbs.conf 의 buildroot 경로에서 빌드 결과물 중 libssl.so, libcrypto.so 를
밑의 폴더에서  tizen app의 lib 폴더로 복사

~/GBS-ROOT-profile.tizen/local/BUILD-ROOTS/scratch.armv7l.0/home/abuild/rpmbuild/BUILD/openssl-1.0.0f

* 빌드 option 참고 (위쪽 서주영님 포스팅 발췌)

만약 빌드가 잘 안 되거나 GBS 설정 파일의 url을 바꾼 경우라면 아래와 같이 --clean 옵션을 이용하여 빌드를 하시기 바랍니다.

gbs build -A i586 --clean

만약 다운로드 받은 타이젠 소스코드를 수정하셨다면 아래와 같이 --include-all 옵션을 주어야 합니다.
GBS는 git에 커밋(commit)이 된 소스코드를 이용하여 빌드를 하기 때문에 소스코드를 수정했다면 git에 커밋을 해야 GBS로 빌드할 수 있습니다.
만약 커밋을 하지 않고 소스코드를 빌드하고 싶다면 --include-all 옵션을 주어야 합니다.

gbs build -A i586 --include-all

빌드 시 아키텍처를 선택하지 않았다면 기본적으로 i586으로 빌드가 되며 arm으로 빌드를 하려면 -A 옵션과 함께 armv7l을 인자로 주어야 합니다. (마지막의 l은 L의 소문자입니다.)

$ gbs build -A armv7l


[MQTT sample client app compile & run]

일단 MQTT client sample application을 만들어야 하므로
간단한 Tizen Form-based Application project를 만들어서
client 소스코드를 복사한다.

Paho의 경우 src/samples 내 pubsync.c, MQTTAsync_publish.c, MQTTAsync_subscribe.c 를 사용하고 mosquitto는 소스코드의 client 폴더 내 pub, sub sample를 사용

. 확장자를 cpp로 바꾸고
. main 함수의 이름을 바꾸고 header를 만들어 expose (단 naming mangling 방지를 위해 extern C 사용)
. sample들이 loop을 사용하므로 Tizen thread를 만들어 별도 thread에서 돌아가게 해야 함.
. application event handler에서 thread를 생성해서 실행하도록 코드 작성


그리고 application에서 위에서 만든 libpaho.so, libmosquitto.so 를 사용해야 하므로
application project에서 library project를 reference 하고 include path, library path & library 설정이 필요함 이 부분은 아래 링크에서 잘 설명 되어 있음.

- 오픈소스를 활용한 Tizen 용 web server 포팅 : http://tizenschools.com/?p=40
 . library들이 함께 사용하는 library들 - libdl, libssl, libcrypto

- 또한 SSL/TLS 를 사용하고자 할 경우 CA의 인증서가 필요하므로 이를 App과 함께 배포하고자 shared/data에 복사하고 mosquitto_tls_set, mosquitto_tls_opts_set 설정 함.
 * app과 자동배포가 안되는지 app에서 shared/data에 인증서가 없다. 그냥 public space에 인증서를 sdb pull로 밀어 넣고 해당 path로 접근하게 함.