2015년 6월 24일 수요일

[MFC] OpenSSL


OpenSSL 윈도우에서 컴파일 및 설치하기

OpenSSL 1.0.0 버전을 활용했다.
윈도우에서 컴파일하는 방법은 OpenSSL을 다운로드 받으면
INSTALL.W32 파일에 자세하게 나와있다.

INSTALL.W32파일에 보면 다음 두개의 툴을 요구하는것을 알 수 있다.

http://www.activestate.com/ActivePerl.
http://nasm.sourceforge.net/

perl과 nasm을 다운받아 설치한다.

OpenSSL 빌드시 nasm을 사용하므로 nasm.exe가 존재하는 폴더를 PATH로 잡아줘야한다.

OpenSSL 폴더로 이동해서 설치를 진행한다.

다음절차를 통해 설치될 경로를 설정하여준다. 
> perl Configure VC-WIN32 --prefix=c:\some\openssl\dir

만일 설치될 폴더를 지정해주지 않는다면 현재 openssl폴더의 out32dll위치에 설치된다.

다음과 같이 nasm을 수행한다.

> ms\do_nasm

nmake를 활용하여 빌드한다.

> nmake -f ms\ntdll.mak

정상적으로 빌드되었는지 테스트하고

> nmake -f ms\ntdll.mak test

앞서 설정된 폴더에 설치를 시작한다.

> nmake -f ms\ntdll.mak install



VC++에서 컴파일하기

설치된 폴더에 존재하는 lib파일과 dll파일을 활용한다.

테스트를 위해 다음과 같은 코드를 준비한 뒤 환경을 설정하도록 한다.

SERVER_ADDRESS에 접속하여 SSL을 맺은 후 간단한 메시지 통신을 하는 클라이언트 코드이다.
 #include <stdio.h>
#include <winsock2.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/bio.h>
#include <openssl/err.h>
#include <openssl/rand.h>
#include <openssl/evp.h>
#include <openssl/crypto.h>
#include <openssl/ssl.h>
#define PORT 443
#define SERVER_ADDRESS "202.30.50.88"

int main( ) {
  
  char * server_name= SERVER_ADDRESS;
  unsigned short port = PORT;
  
  unsigned int addr;
  struct sockaddr_in server_add;
  struct hostent *host;
  
  WSADATA wsaData;
  SOCKET  conn_socket;
  int socket_type = SOCK_STREAM;
  int retval;
  // SSL 구조체 생성
  SSL_METHOD *meth;
  SSL_CTX* ctx;
  SSL*     ssl;
  X509*    server_cert;
  BIO * errBIO;
 
  if ((retval = WSAStartup(0x202,&wsaData)) != 0) {
    fprintf(stderr,"WSAStartup 함수에서 에러 발생.");
    WSACleanup();
    exit(1);
  }
  if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 ) {
    WSACleanup();
    exit(1);
  }
   
  if ((errBIO=BIO_new(BIO_s_file())) != NULL)
    BIO_set_fp(errBIO,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
  SSL_load_error_strings();
  SSLeay_add_ssl_algorithms();
  meth = SSLv3_method();
  ctx = SSL_CTX_new(meth);
  if (ctx==NULL) {
    BIO_printf(errBIO,"SSL_CTX 생성 에러");
    ERR_print_errors(errBIO);
    exit(1);
  }
   
  // 서버 이름이 알파벳인DNS로 되어 있을 경우
  if (isalpha(server_name[0])) {    
    host = gethostbyname(server_name);
  }
  // 서버 이름이 IP로 되어 있을 경우
  else  {  
    addr = inet_addr(server_name);
    host = gethostbyaddr((char *)&addr,4,AF_INET);
  }
  if (host == NULL ) {
    fprintf(stderr,"알 수 없는 주소[%s] 입니다, 에러 코드: %d\n",server_name,WSAGetLastError());
    WSACleanup();
    exit(1);
  }
   
  memset(&server_add,0,sizeof(server_add));
  memcpy(&(server_add.sin_addr),host->h_addr,host->h_length);
  server_add.sin_family = host->h_addrtype;
  server_add.sin_port = htons(port);
  conn_socket = socket(AF_INET,socket_type,0);  
  if (conn_socket <0 ) {
    fprintf(stderr,"소켓 생성 에러, 에러 코드:%d\n",WSAGetLastError());
    WSACleanup();
    exit(1);
  }
  printf("[%s] 서버에 연결중..\n",server_name);
  if (connect(conn_socket,(struct sockaddr*)&server_add,sizeof(server_add))== SOCKET_ERROR) {
    fprintf(stderr,"connect 에러, 에러 코드:%d\n",WSAGetLastError());
    WSACleanup();
    exit(1);
  }
     // 세션키를 만들기 위한 랜덤 수 를 위한 Seed공급
  printf("랜덤 수 생성중....");
  RAND_screen();
  printf("랜덤 수 생성 완료.\n");
  ssl = SSL_new(ctx);
  if (ssl == NULL) {
    BIO_printf(errBIO,"SSL 생성 에러");
    ERR_print_errors(errBIO);
    exit(1);
  }
  SSL_set_fd(ssl, conn_socket);
  retval = SSL_connect(ssl);
  if (retval == -1)
  {
    BIO_printf(errBIO,"SSL accept 에러");
    ERR_print_errors(errBIO);
    exit(1);
  }
  const char * currentChipher = SSL_CIPHER_get_name(SSL_get_current_cipher(ssl));
  printf("SSL 연결, 사용 알고리즘 파라메터: [%s]\n",currentChipher);
 
  server_cert = SSL_get_peer_certificate (ssl);
  if (server_cert == NULL) {
    BIO_printf(errBIO,"서버 인증서를 받을 수 없음.");
    ERR_print_errors(errBIO);
    exit(1);
  }
  printf ("Server certificate:\n");
    
  char * retString = NULL;
  // 주체의 DN을 문자열로 얻음
  retString = X509_NAME_oneline (X509_get_subject_name (server_cert),0,0);
  if (retString == NULL) {
    BIO_printf(errBIO,"서버 인증서에서 주체의 DN을 읽을 수 없음.");
    ERR_print_errors(errBIO);
    exit(1);
  }
  printf ("\t subject: %s\n", retString);
//  free (retString);
  // 발급자의 DN을 문자열로 얻음
  retString = X509_NAME_oneline (X509_get_issuer_name  (server_cert),0,0);
  
  if (retString == NULL) {
    BIO_printf(errBIO,"서버 인증서에서 발급자의 DN을 읽을 수 없음.");
    ERR_print_errors(errBIO);
    exit(1);
  }
  printf ("\t issuer: %s\n", retString);
//  free (retString);

  X509_free (server_cert);

  char buffer[1000];
 
  char message[100] = "GET / HTTP1.1\r\n\r\n.";
  retval = SSL_write (ssl, message, strlen(message));
  if (retval == -1)
  {
    BIO_printf(errBIO,"SSL write 에러");
    ERR_print_errors(errBIO);
    exit(1);
  }
    
  retval = SSL_read (ssl, buffer, sizeof(buffer) - 1); 
  if (retval == -1)
  {
    BIO_printf(errBIO,"SSL read 에러");
    ERR_print_errors(errBIO);
    exit(1);
  }
  buffer[retval] = '\0';
  printf ("서버로 부터 데이터 전송 :[%s], 길이:%d\n",buffer,retval);
  SSL_shutdown (ssl); 
  closesocket(conn_socket);
  SSL_free (ssl);
  SSL_CTX_free (ctx);
  WSACleanup();
}

openssl\include 폴더가 아니라
openssl\inc32 폴더를 VC의 도구->옵션->디렉토리의 포함파일에 포함한다.

라이브러리파일은 OpenSSL을 컴파일하면서 생성된 폴더를 지정해준다.
즉 openssl\out32dll 폴더를 VC의 도구->옵션->디렉토리의 라이브러리파일에 포함한다.

다음 코드를 프로젝트에 포함한다.
openssl\ms\applink.c

위 소스코드를 돌리기 위해 프로젝트의 링크옵션에 포함된 라이브러리 파일은 다음과 같다.
ws2_32.lib ssleay32.lib libeay32.lib

dll 오류가 발생한다면, openssl\out32dll위치에 있는 dll파일을 실행파일 위치에 두면 정상적으로 동작할 것이다.

[MFC] 라이브러리 참조

tools > project and solution > vc directory ++ > include library > path
linker > input > file.lib

2015년 5월 19일 화요일

 행위

리눅스 vsftpd 설치 및 설정

리눅스 FTP 서버 설치
vsftpd 설치
vsftpd 설정

확인

[root@zetawiki ~]# rpm -qa vsftpd*
→ vsftpd가 설치되지 않았음

설치

[root@zetawiki ~]# yum install vsftpd -y
... (생략)
Installed:
  vsftpd.i386 0:2.0.5-24.el5_8.1                                                                                                                                          
 
Complete!

재확인

[root@zetawiki ~]# rpm -qa vsftpd*
vsftpd-2.0.5-24.el5_8.1
[root@zetawiki ~]# service vsftpd status
vsftpd is stopped
→ 패키지 설치됨, 서비스 등록됨

vsftpd.conf 설정

 vsftpd.conf 문서를 참고하십시오.
vi /etc/vsftpd/vsftpd.conf
모두 지우고 아래 내용으로 대체
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
chroot_local_user=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

vsftpd 시작

[root@zetawiki ~]# service vsftpd start
Starting vsftpd for vsftpd:                                [  OK  ]
[root@zetawiki ~]# netstat -anp | grep vsftpd
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      24918/vsftpd
→ 서비스 시작됨. 21포트 LISTEN 중.

vsftpd 자동시작

재부팅시 자동시작하도록 설정
[root@zetawiki ~]# chkconfig vsftpd on
[root@zetawiki ~]# chkconfig --list | grep vsftpd
vsftpd          0:off 1:off 2:on 3:on 4:on 5:on 6:off

테스트용 계정/파일 생성

[root@zetawiki ~]# useradd testuser
[root@zetawiki ~]# echo 'P@ssw0rd' | passwd --stdin testuser
Changing password for user testuser.
passwd: all authentication tokens updated successfully.
→ testuser 계정을 생성. 패스워드를 "P@ssw0rd"로 설정
[root@zetawiki ~]# cd /home/testuser
[root@zetawiki testuser]# touch hello
[root@zetawiki testuser]# ll
total 0
-rw-r--r-- 1 root root 0 Nov 29 22:51 hello
→ testuser의 홈에 hello 파일 생성

다른 서버에서 접속 테스트

[root@testserver ~]# ftp 111.222.33.44
Connected to 111.222.33.44.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (111.222.33.44:root):
→ 계정명 testuser 입력
331 Please specify the password.
Password:
→ 패스워드 P@ssw0rd 입력
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Nov 29 13:54 hello
226 Directory send OK.
→ 테스트로 만들어둔 파일이 보인다.
ftp> pwd
257 "/"
→ testuser의 홈폴더가 최상위폴더인 "/"로 나온다. 즉 다른 곳으로 이동할 수 없다.

같이 보기

2015년 4월 14일 화요일

System & Application Software

Dead Lock
Debugging
Linux
Multitasking
Module
RTO : Recovery Time Objective
Booyo Linux
SOA : Service Oriented Architecture
SaaS : Software as a Service
Software Crisis
WBS : Work break down Structure
Operating System
UNIX
Java
Byte Code
JVM : Java Virtural Machine
JIT : Just In Time compiler
Killer Application
Active x
JPEG : Joint Photographic Expert Group
MPEG : Moving Picture Experts Group
Game Rating
Data Modeling Software
Multimedia
Expert System
Code Obfuscation
Code Eye
Hadoop
Time Sharing System
Malware
Compiler
Hijacking
GUI : Graphic User Interface
PDF
BSD
OGSA : Open Grid Service Architecture
Widget

Data Structure

Syntax Analysis
Data Mining
Data Mart
Data Warehouse
Record
Lexical Analyze
Transaction
-Atomicity
-Consistency
-Isolation
-Durabiliy
Parity Check Code(Even, Odd)
Process Scheduling
비선점
-FCFS
-SJF : Shortest Job First
-HRN : Hgihest Response-ratio Next
-Deadline
-Priority
선점
-SRT : Shortest Remaining Time
-RR : Round Robin
-MQ : Multi-level Queue
-MFQ : Multi-level Feedback Queue
RPO : Recovery Point Objective
Big Data
Foraml Method
Loop
Sort
Machine Learning
Cluster Analysis

Computer Composition

LED : Light Emitting Diode - n region, p region
UPnP : Univesal Plug and Play
Viewing Angle
ECU : Electronic Control Unit
SED : Surface-conduction Electron-emiiter Display
Flash Memory
DIVA : Digital Interface for Video and Audio
RAID : Redundant Array of Inexpensive Disk
Hand Vascular Patern Recognition
Steadicam
Sheet Resistance
PEFET : Piezo Electric Field Effect Transistor
Woofer
Electronic Skin
Intelligent Energy Fabric
Miniature
Dual stream 3DTV
RAM : Random Access Memory
Register
Memristor : Meemory + Resister
ASCII Code
Nano Fiber
UAV : Unmanned Aerial Vehicle
Speed Gate
Bipolar Transistor
Positive Hole
Proton Exchange Membrane Fuel Cell, PEM Fuel Cell
Tele-Screen
IMC : In Memory Computing
3 Dimension Audio
Cardioid Microphone
Transparent Display
PA : Public Address