ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù. »ç¼³ SSL ÀÎÁõ¼ ¸¸µé±â
°³ÀÎÀÌ »ç¿ëÇÒ SSL ¼¹öÀÇ ÀÎÁõ¼¸¦ ±»ÀÌ ºñ¿ëÀÌ µé¾î°¡´Â °øÀÎ ÀÎÁõ±â°ü¿¡ ¿äûÇÒ ÇÊ¿ä´Â ¾ø´Ù. ÀÌ·²¶§´Â »ç¼³ SSL ÀÎÁõ¼¸¦ ¸¸µé¾î »ç¿ëÇÏÀÚ. ¸ÕÀú SSL Handshake°úÁ¤À» È®ÀÎÇØ º¸ÀÚ.
SSL ¼¹ö ¸¸µé±â
SSL ¼¹ö¸¦ ¸¸µé·Á°í ÇÑ´Ù. ¼Ò½º´Â Á÷Á¢ ¸¸µé±â ±ÍÂú¾Æ¼ ÀÎÅͳÝÀ» ã¾Æ¼ ±¸Çß´Ù. ÀÌ ¼¹ö ÇÁ·Î±×·¥ÀÌ ÀÛµ¿ÇÏ·Á¸é, ÀÎÁõ¼¿Í ¼¹ö۰¡ ÇÊ¿äÇÏ´Ù. À̵éÀ» ¸¸µé¾î¼ Å×½ºÆ® ÇØº¸±â·Î Çß´Ù. ´ÙÀ½Àº Å×½ºÆ®¿¡ »ç¿ëÇÒ ¼Ò½º´Ù. ÇÁ·Î±×·¥ÀÇ À̸§Àº myserver.c·Î ÇÏÀÚ. /* serv.cpp - Minimal ssleay server for Unix 30.9.1996, Sampo Kellomaki <sampo@iki.fi> */ /* mangled to work with SSLeay-0.9.0b and OpenSSL 0.9.2b Simplified to be even more minimal 12/98 - 4/99 Wade Scholine <wades@mail.cybg.com> */ #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <memory.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <openssl/rsa.h> /* SSLeay stuff */ #include <openssl/crypto.h> #include <openssl/x509.h> #include <openssl/pem.h> #include <openssl/ssl.h> #include <openssl/err.h> /* define HOME to be dir for key and cert files... */ #define HOME "./" /* ¼¹ö ÀÎÁõ¼ */ #define CERTF HOME "server-req.pem" /* ¼¹ö ºñ¹ÐŰ */ #define KEYF HOME "server-key.pem" #define CHK_NULL(x) if ((x)==NULL) exit (1) #define CHK_ERR(err,s) if ((err)==-1) { perror(s); exit(1); } #define CHK_SSL(err) if ((err)==-1) { ERR_print_errors_fp(stderr); exit(2); } // SSL Çڵ彦ÀÌÅ© ¸Þ½ÃÁö±³È¯ °úÁ¤À» ¾Ë·ÁÁÖ´Â Äݺ¤ÇÔ¼ö void ssl_info_callback(const SSL *s, int where, int ret); // ȸ鿡 Ç¥½Ã Çϱâ À§ÇÑ ÆÄÀÏ BIO»ý¼º BIO * errBIO; int main (int argc, char **argv) { int err; int listen_sd; int sd; struct sockaddr_in sa_serv; struct sockaddr_in sa_cli; size_t client_len; SSL_METHOD *meth; SSL_CTX* ctx; SSL* ssl; X509* client_cert; char* str; char buf [4096]; /* SSL preliminaries. We keep the certificate and key with the context. */ // ¸ðµç ¿¡·¯ ½ºÆ®¸µ ·Îµå SSL_load_error_strings(); // ¸ðµç ¾Ë°í¸®Áò ·Îµå SSLeay_add_ssl_algorithms(); // SSL ¹öÀü3 ÇÁ·ÎÅäÄÝ »ç¿ë meth = SSLv3_method(); //meth = TLSv1_server // create a new SSL_CTX object as framework for TLS/SSL enabled functions // SSL ÄÁÅØ½ºÆ® »ý¼º ctx = SSL_CTX_new (meth); if (!ctx) { ERR_print_errors_fp(stderr); exit(2); } // SSL Çڵ彦ÀÌÅ© ¸Þ½ÃÁö±³È¯ °úÁ¤À» ¾Ë·ÁÁÖ´Â Äݺ¤ÇÔ¼ö SSL_CTX_set_info_callback(ctx,ssl_info_callback); // ÀÚ½ÅÀÇ ÀÎÁõ¼¸¦ ÆÄÀÏ¿¡¼ ·ÎµùÇÑ´Ù. if (SSL_CTX_use_certificate_file(ctx, CERTF, SSL_FILETYPE_PEM) <= 0) { ERR_print_errors_fp(stderr); exit(3); } fprintf(stderr, "======== PEM pass phrease confirm here\n"); // ÀÚ½ÅÀÇ °³ÀÎ۸¦ ÆÄÀÏ¿¡¼ ·ÎµùÇÑ´Ù. if (SSL_CTX_use_PrivateKey_file(ctx, KEYF, SSL_FILETYPE_PEM) <= 0) { fprintf(stderr,"======== PEM pass phrase does not match the password\n"); ERR_print_errors_fp(stderr); exit(4); } // ÀÐÀº ÀÎÁõ¼¿Í °³ÀÎ۰¡ ¸Â´ÂÁö È®ÀÎ ÇÑ´Ù. if (!SSL_CTX_check_private_key(ctx)) { fprintf(stderr,"Private key does not match the certificate public key\n"); exit(5); } listen_sd = socket (AF_INET, SOCK_STREAM, 0); CHK_ERR(listen_sd, "socket"); memset (&sa_serv, '\0', sizeof(sa_serv)); sa_serv.sin_family = AF_INET; sa_serv.sin_addr.s_addr = INADDR_ANY; sa_serv.sin_port = htons (1111); /* Server Port number */ err = bind(listen_sd, (struct sockaddr*) &sa_serv, sizeof (sa_serv)); CHK_ERR(err, "bind"); err = listen (listen_sd, 5); CHK_ERR(err, "listen"); client_len = sizeof(sa_cli); sd = accept (listen_sd, (struct sockaddr*) &sa_cli, &client_len); CHK_ERR(sd, "accept"); close (listen_sd); printf ("Connection from %lx, port %d\n", sa_cli.sin_addr.s_addr, sa_cli.sin_port); // TCP connection is ready. Do server side SSL. // create a new SSL structure for a connection // SSL ±¸Á¶Ã¼ »ý¼º ssl = SSL_new (ctx); CHK_NULL(ssl); // connect the SSL object with a file descriptor // ¿¬°áµÈ ¼ÒÄϰú SSL°úÀÇ ¿¬°á SSL_set_fd (ssl, sd); // °¡Àå Áß¿äÇÑ ÇÔ¼ö, Ŭ¶óÀÌ¾ðÆ®¿ÍÀÇ Ãʱâ Çù»ó°úÁ¤, Áï Çڵ彦ÀÌÅ© °úÁ¤À» ¼öÇà printf ("SSL_accept start =========================\n"); err = SSL_accept (ssl); CHK_SSL(err); printf ("SSL_accept end =========================\n"); // Get the cipher - opt // ÇöÀç Ŭ¶óÀÌ¾ðÆ®¿Í Á¤ÀÇµÈ ¾ÏÈ£È ÆÄ¶ó¸ÞÅÍÁ¤º¸¸¦ ¾òÀ½ printf ("SSL connection using %s\n", SSL_get_cipher (ssl)); printf ("SSL connection using %s\n", SSL_CIPHER_get_name(SSL_get_current_cipher(ssl))); // Get client's certificate (note: beware of dynamic allocation) - opt client_cert = SSL_get_peer_certificate (ssl); if (client_cert != NULL) { printf ("Client certificate:\n"); str = X509_NAME_oneline (X509_get_subject_name (client_cert), 0, 0); CHK_NULL(str); printf ("\t subject: %s\n", str); free (str); str = X509_NAME_oneline (X509_get_issuer_name (client_cert), 0, 0); CHK_NULL(str); printf ("\t issuer: %s\n", str); free (str); /* We could do all sorts of certificate verification stuff here before deallocating the certificate. */ X509_free (client_cert); } else { printf ("Client does not have certificate.\n"); } // DATA EXCHANGE - Receive message and send reply. // Ŭ¶óÀÌ¾ðÆ®·Î ºÎÅÍ SSL Åë½ÅÀ» ÅëÇØ ¸Þ½ÃÁö ¹ÞÀ½ err = SSL_read (ssl, buf, sizeof(buf) - 1); CHK_SSL(err); buf[err] = '\0'; // ¹ÞÀº µ¥ÀÌÅ͸¦ ȸ鿡 Ç¥½Ã printf ("Got %d chars:'%s'\n", err, buf); // Ŭ¶óÀÌ¾ðÆ®¿¡°Ô SSL Åë½ÅÀ» ÅëÇØ ¸Þ½ÃÁö º¸³¿ err = SSL_write (ssl, "I hear you.", strlen("I hear you.")); CHK_SSL(err); /* Clean up. */ close (sd); SSL_free (ssl); SSL_CTX_free (ctx); } // SSL Çڵ彦ÀÌÅ© ¸Þ½ÃÁö±³È¯ °úÁ¤À» ¾Ë·ÁÁÖ´Â Äݺ¤ÇÔ¼ö void ssl_info_callback(const SSL *s, int where, int ret) { char * writeString; int w; // ÇöÀç ¾î¶² ¸Þ½ÃÁö ±³È¯ °úÁ¤ÀÎÁö¸¦ ³ªÅ¸³¿ w = where & ~SSL_ST_MASK; // Ŭ¶óÀÌ¾ðÆ®°¡ ¿¬°á ÇßÀ» ¶§ if (w & SSL_ST_CONNECT) writeString="SSL_connect"; // ¼¹ö°¡ ¿¬°áÀ» ¹Þ¾ÒÀ» ¶§ else if (w & SSL_ST_ACCEPT) writeString="SSL_accept"; // ¾Ë ¼ö ¾ø´Â °æ¿ì else writeString="undefined"; fprintf(stderr, "======== writeString = [%s]\n", writeString); // ÀϹÝÀûÀÎ Çڵ彦ÀÌÅ© ÇÁ·ÎÅäÄÝ ¸Þ½ÃÁöÀÏ °æ¿ì if (where & SSL_CB_LOOP) { // SSL_state_string_long(s) ÇÔ¼ö·Î ºÎÅÍ ÇöÀç ÁøÇàµÇ´Â ¸Þ½ÃÁö°¡ ¹«¾ùÀÎÁö Ç¥½Ã BIO_printf(errBIO,"%s:%s\n",writeString,SSL_state_string_long(s)); fprintf(stderr, "======== writeString = [%s], SSL_state_string_long(s) = [%s]\n", writeString, SSL_state_string_long(s)); } else if (where & SSL_CB_ALERT) { // alert ÇÁ·ÎÅäÄÝÀÏ °æ¿ì writeString=(where & SSL_CB_READ)?"read":"write"; BIO_printf(errBIO,"SSL3 alert %s:%s:%s\n",writeString,SSL_alert_type_string_long(ret),SSL_alert_desc_string_long(ret)); fprintf(stderr, "======== writeString = [%s], SSL_alert_type_string_long(ret) = [%s], SSL_alert_desc_string_long(ret) = [%s]\n", writeString, SSL_alert_type_string_long(ret), SSL_alert_desc_string_long(ret)); } else if (where & SSL_CB_EXIT) { // Á¾·á °úÁ¤ÀÏ °æ¿ì if (ret == 0) { BIO_printf(errBIO,"%s:failed in %s\n",writeString,SSL_state_string_long(s)); fprintf(stderr,"======== writeString = [%s], SSL_state_string_long(s) = [%s]\n", writeString, SSL_state_string_long(s)); } else if (ret < 0) { BIO_printf(errBIO,"%s:error in %s\n",writeString,SSL_state_string_long(s)); fprintf(stderr,"======== writeString = [%s], SSL_state_string_long(s) = [%s]\n", writeString, SSL_state_string_long(s)); } } return 1; }
ÀÌÁ¦ ÀÎÁõ¼¿Í ¼¹ö۸¦ ¸¸µé¾î¾ß ÇÑ´Ù. ´ÙÀ½Àº ÀÎÁõ¼¿Í ¼ºñ۸¦ ¸¸µå´Â °£´ÜÇÑ ½© ÇÁ·Î±×·¥ÀÌ´Ù. #!/bin/sh # Generates a self-signed certificate. # Edit dovecot-openssl.cnf before running this. OPENSSL=openssl SSLDIR=/etc/ssl OPENSSLCONFIG=myserv-openssl.cnf CERTDIR=$SSLDIR/certs KEYDIR=$SSLDIR/private CERTFILE=$CERTDIR/myserv.pem KEYFILE=$KEYDIR/myserv.pem if [ ! -d $CERTDIR ]; then echo "$SSLDIR/certs directory doesn't exist" exit 1 fi if [ ! -d $KEYDIR ]; then echo "$SSLDIR/private directory doesn't exist" exit 1 fi if [ -f $CERTFILE ]; then echo "$CERTFILE already exists, won't overwrite" exit 1 fi if [ -f $KEYFILE ]; then echo "$KEYFILE already exists, won't overwrite" exit 1 fi $OPENSSL req -new -x509 -nodes -config $OPENSSLCONFIG -out $CERTFILE -keyout $KEYFILE -days 365 || exit 2 chmod 0600 $KEYFILE echo $OPENSSL x509 -subject -fingerprint -noout -in $CERTFILE || exit 2
´ÙÀ½Àº ÀÎÁõ¼¸¦ ¸¸µé±â À§ÇÑ ¼³Á¤ÆÄÀÏÀÌ´Ù. ¼³Á¤ÆÄÀÏÀÇ À̸§Àº myserv-openssl.cnfÀÌ´Ù. [ req ] default_bits = 1024 encrypt_key = yes distinguished_name = req_dn x509_extensions = cert_type prompt = no [ req_dn ] # country (2 letter code) #C=FI # State or Province Name (full name) #ST= # Locality Name (eg. city) #L=Seoul # Organization (eg. company) #O=Joinc # Organizational Unit Name (eg. section) OU=developer # Common Name (*.example.com is also possible) CN=www.joinc.co.kr # E-mail contact emailAddress=yundream@gmail.com [ cert_type ] nsCertType = server |
|
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|