[Security] TLS-PSK

일단 기본 개념부터.

PSK는 Pre-Shared Key의 줄임말로, 보안이 필요한 통신을 하는 양자 간에 미리 공유된 symmetric 키를 말한다.

TLS는 Transport Layer Security의 줄임말로, SSL이 표준화되면서 쓰이는 이름이다.

TLS-PSK는 PSK를 이용해서 TLS연결을 맺는 것으로 RFC 4279에 문서화되어 있다.

RFC 4279의 내용을 살펴보자.

      Client                                               Server
      ------                                               ------

      ClientHello                  -------->
                                                      ServerHello
                                                    (Certificate)
                                               ServerKeyExchange*
                                             (CertificateRequest)
                                   <--------      ServerHelloDone
      (Certificate)
      ClientKeyExchange
      (CertificateVerify)
      ChangeCipherSpec
      Finished                     -------->
                                                 ChangeCipherSpec
                                   <--------             Finished
      Application Data             <------->     Application Data

위 그림이 TLS handshake과정을 나타낸다.

1. 클라이언트는 ClientHello 메시지에 TLS Version과 하나 이상의 cipher-suite을 실어 보낸다.

2. 서버는 ServerHello 메시지에 사용할 TLS Version과 사용할 cipher-suite를 실어 보낸다. ServerKeyExchange 메시지로 클라이언트가 어떤 PSK를 사용할 지, PSK identity hint를 함께 보낸다. ServerHelloDone도 보낸다.

3. 클라이언트는 ServerKeyExchange에 포함된 PSK identity hint로 사용할 PSK를 고른다. 고른 PSK의 PSK identity를 ClientKeyExchange 메시지에 실어 보낸다. Premaster secret은 PSK가 N octets라면, uint16 타입의 N, N개의 0 octets, 두번째 uint16타입의 N, 그리고 PSK N octets.

OpenSSL에서는 Client 쪽에서는 PSK callback을 SSL_CTX_set_psk_client_callback()이나 SSL_set_psk_client_callback()을 통해 설정하도록 되어있는데, 이 callback을 Server로부터 받은 PSK Identity Hint를 읽어 valid한지를 check하고, 해당 hint에 맞는 PSK를 psk에, PSK identity를 identity argument에 채워주는 역할을 한다. callback은 psk의 length를 return해야 한다. 0이나 그 이하는 error를 나타낸다.

Server쪽에서는 SSL_CTX_use_psk_identity_hint()나 SSL_use_psk_identity_hint()를 통해서 사용할 PSK Identity Hint를 Setting하고, SSL_CTX_set_psk_server_callback()나 SSL_set_psk_server_callback()을 통해 callback을 셋팅한다. 이 callback은 PSK identity가 valid한지를 체크하고, PSK identity가 있다면, pre-shared key를 psk argument에 채우고, PSK의 길이를 return한다.

 

* 참고

RFC 4279 – PSK Ciphersuites for TLS(https://tools.ietf.org/html/rfc4279)

TLS: https://en.wikipedia.org/wiki/Transport_Layer_Security, https://namu.wiki/w/TLS

TLS-PSK: https://en.wikipedia.org/wiki/TLS-PSK

OpenSSL

SSL_CTX_set_psk_client_callback: https://www.openssl.org/docs/manmaster/ssl/SSL_CTX_set_psk_client_callback.html

SSL_CTX_use_psk_identity_hint: https://www.openssl.org/docs/manmaster/ssl/SSL_CTX_use_psk_identity_hint.html

[Linux] git 사용 시 Proxy 환경 아래서 https 인증이 제대로 안될 때

git 사용 시 Proxy 환경 아래서 https 인증이 제대로 안될 때 다음과 같은 에러 발생 시..

error: SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed while accessing https://주소.com/프로젝트.git/info/refs
fatal: HTTP request failed


아래처럼 하고 해보자.
 

$ export GIT_SSL_NO_VERIFY=true

우아한 방법은 아니지만 동작은 한다.
다음처럼 설정도 가능.

$ git config –global http.sslVerify false

참고 :  http://stackoverflow.com/questions/3777075/https-github-access

Using POP3, SMTP with SSL

예전에 회사다닐 때 메일 서버 관리할 때 썼던 글인 듯 하다.
언젠가 도움이 되지 않을까 해서 KLDP에 썼던 글을 블로그에도 옮겨둔다.
——————————————————————————————————-
Using POP3, SMTP with SSL

1. 문서의 목적

이 문서는 OpenSSL 을 이용해서 POP3S 와 SMTP 서비스를 시작한 내 경험을 정리하기 위해 만들어졌다.

2. 문서의 소개

이 문서는 OpenSSL 을 이용해 POP3S 와 SMTP 서비스를 사용하는 절차에 대해 설명한다. 레드햇 8.0 을 기준으로 하며 MTA 로는 Sendmail 을 사용한다. POP3S 서비스는 xinetd 하에서 서비스된다. CA 인증은 자체 인증 방식을 사용한다. 모든 작업은 root 로 수행한다. 이 문서는 양정석(dasomoli (at) gmail.com)이 작성하였다. 🙂

3. 본문

3.1. 인증서 만들기 & 설치

    * CSR 을 만든다.
      # openssl req -new > cert.csr

    * common name 에 도메인 이름 입력(예:jinyangind.com)

    * RSA 키를 만든다.
      # openssl rsa -in privkey.pem -out cert.key

    * CSR 에 자체 서명키로 CA 인증서를 만든다.
      # openssl x509 -in cert.csr -out cacert.crt -req -signkey cert.key -days 365

    * RSA 키와 CA 인증서를 붙여 pem 파일을 생성한다.
      # cat cert.key cacert.crt > cert.pem

    * 생성한 파일을 root 외에 읽을 수 없게 한다.
      # chmod 600 cert.pem cacert.crt cert.key(여기는 cert.pem 빼고는 내 추측)

    * SSL 의 certs 디렉토리에 옮긴다.
      # mv cert.pem /usr/share/ssl/certs

      # mv cacert.crt /usr/share/ssl/certs

      # mv cert.key /usr/share/ssl/certs

    * pop3s 의 pem 파일도 만든 것으로 사용
      # cp /usr/shar/ssl/certs/cert.pem /usr/shar/ssl/certs/ipop3d.pem

    * smtps 의 pem 파일도 만든 것으로 사용
      # cp /usr/shar/ssl/certs/cert.pem /usr/shar/ssl/certs/sendmail.pem

3.2. pop3s 서비스 시작하기.

    * #vi /etc/xinetd.d/pop3s

      service pop3s
      {
          disable         = no
          socket_type     = stream
          wait            = no
          user            = root
          server          = /usr/sbin/ipop3d
          log_on_success  += USERID
          log_on_failure  += USERID
      }
        
    * # /etc/init.d/xinetd.d restart

3.3. sendmail 설정하고 재시작하기.

    * # vi /etc/mail/sendmail.mc, 다음 내용을 추가한다.

      define(`confCACERT_PATH’,`/usr/share/ssl/certs’)dnl
      define(`confCACERT’,`/usr/share/ssl/certs/cacert.crt’)dnl
      define(`confSERVER_CERT’,`/usr/share/ssl/certs/sendmail.pem’)dnl
      define(`confSERVER_KEY’,`/usr/share/ssl/certs/cert.key’)dnl
      DAEMON_OPTIONS(`Port=smtps, Name=TLSMTA, M=s’)dnl
      Cwjinyangind.com

    * # m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
    * # /etc/init.d/sendmail restart

3.4. Client 설정.

    * cacert.crt 배포, 인증기관에 추가.

3.4.1. Outlook

    * 받는 메일 서버, 보내는 메일 서버에 SSL 체크, 보내는 메일서버 포트 : 465, 받는 메일서버 포트 : 995

3.4.2. Thunderbird

    * Outlook 과 거의 같음.