Recommanded Free YOUTUBE Lecture: Dockerizing with Spring Boot Hello World

사설 SSL 인증서 만들기

개인이 사용할 SSL 서버의 인증서를 굳이 비용이 들어가는 공인 인증기관에 요청할 필요는 없다. 이럴때는 사설 SSL 인증서를 만들어 사용하자. 먼저 SSL Handshake과정을 확인해 보자.
  1. 클라이언트가 서버에 연결하면, 먼저 인증서를 요청하게 된다. 인증서는 유저가 선택한 사이트를 신뢰할수 인증한다는 것이다. 엄격히 신뢰있다는 걸 인증하려면 공인된 기관이 개입해야 할 것이다. 우리는 사설 SSL 인증서를 사용할 것이고, 때문에 유저 브라우저에서는 신뢰할 수 없는 인증서를 포함한 사이트라는 경고 메시지가 출력될 것이다. 내부적으로 사용할 것이니 무시해도 상관 없다.
  2. 이제 데이터의 기밀성을 유지하기 위해서 데이터 암/복호와 과정을 거친다. 서버에서 클라이언트로 서버의 공개키를 이용해서 클라이언트는 생성된 세션키를 암호화해서 서버로 전달한다. 이 세션키를 이용해서 서버는 데이터를 암호화해서 전송하고, 클라이언트는 받은 데이터를 복호화 한다.
  1. 클라이언트는 서버에 Hello Message를 전달한다.
  2. 서버는 클라이언트에 Hello Message와 (서버의 공개키로 인증한)서버 인증서를 전송한다. 필요에 따라 서버가 클라이언트의 인증서를 요청하기도 한다.
  3. 클라이언트는 인증서를 검토한 후, 서버의 공개키를 추출한다. 데이터 암호화에 사용할 session-key와 클라이언트가 사용할 수 있는 암호화 알고리즘 세트 즉 Chiper suite를 서버로 전달한다. 이때 session-key는 공개키로 암호화 한다.
  4. 서버는 Chiper suite를 받은 다음 클라이언트로 Finished message를 전송한다. 서버는 자신의 비밀키로 세션키를 복호화한다. 이제 서버와 클라이언트 모두 session-key를 공유하게 되었고, 이 session-key를 이용해서 비밀 통신을 한다.
  5. 이제 데이터 전송 단계로 넘어가면, 상호 협의한 암호화 방식을 이용해서 데이터를 교환한다.

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)
 
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

이제 인증서와 서버키를 만들어야 한다. 다음은 인증서와 서비키를 만드는 간단한 쉘(:12) 프로그램이다.
#!/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
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

다음은 인증서를 만들기 위한 설정파일이다. 설정파일의 이름은 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
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

이 스크립트를 실행하면 /etc/ssl/private/myserv.pem 과 /etc/ssl/certs/myserv.pem 파일이 만들어진다. 전자는 인증서이고, 후자는 서버키다. 컴파일 후 실행하고 나서 https를 지원하는 웹브라우저로 테스트 할 수 있다.

관련글