키분배(교환) : 암호 통신을 위해 통신 당사자들이 키를 확보하는 과정
대칭 키 분배의 문제 : 기밀성 + 인증이 필요함
=> MITM attack의 경우 인증이 없어서 발생하는 취약점임
키 교환 방법 4가지
1. 키를 생성 후, 직접 전달
2. 믿을 수 있는 제 3자가 직접 전달(TTP, Trusted 3rd-Party)
3. 공유키로 암호화하여 상대방에게 전송
4. 제 3자와 암호화된 연결(Secure channel)이 확립되어 있다면, 제 3자가 암호화된 링크를 통해서 전달(KDC, Key Distribution Center)

1. A가 B와 통신을 원하면 연결 요청 패킷을 KDC에 전송한다.
=> A와 KDC 사이에는 공유키가 존재하고 이를 이용하여 암호화 통신
2. KDC가 연결 요청 후, KDC는 일회용 세션키 K 생성
=> K를 공유키로 암호화하여 A에게 전송(B도 동일하게)
3. 이후, A와 B는 K로 암호화하여 통신
Kerberos protocol에는 3가지 서버가 존재한다.
AS(인증 서버)는 사용자를 검증(Verify)하고, 사용자와 TGS간의 세션키를 발행한다. 또한, TGS를 위한 티켓을 사용자에게 전달해준다.
TGS(티켓 발행 서버)는 data 서버(다른 유저가 존재)를 위한 티켓을 발행한다. 또한, 두 유저(통신을 위한)간에 사용될 세션키를 생성한다.
Real server(실제 서버)는 유저에게 서비스를 제공한다.
Kerberos는 인증(AS)과 실제 데이터를 주고받는 서버(Data server)를 분리했다는 것이 큰 특징이다.
Alice가 딱 한 번만 AS와 인증하면 실제 서버와 통신하기 위한 키를 얻기 위해 TGS와 여러번 접근하여 사용할 수 있다.
Kerberos has separated user verification from the issuing of tickets. In this way, though Alice verifies her ID just once with the AS, she can contact the TGS multiple times to obtain tickets for different real servers.

Kerberos는 왜 쓸까?

공개키 분배의 문제
이 공개키가 그 사람의(공격자의 것이 아닌)것이 맞는가?
만약 공개키가 공격자의 것이라면, 해당 공격자는 자신의 개인키로 메시지를 복호화할 수 있다.
안전한 (소유자가 확인된) 공개키 전달
신뢰 있는 제 3자(TTP, Trusted Third-Party)를 사용하자!!

유저의 ID정보와 공개키, CA(Certificate Authority, 인증기관)의 정보가 들어있는 인증서를 CA가 서명한다.
표준화된 공개키 인증서 규격 표준이다.

각 인증서 버전에 따라 담고 있는 내용의 정보가 다름을 알 수 있다.

인증서는 여러 이유로 Revocation(취소, 폐지)되는데, 그에 대한 인증서 취소 목록 표준은 위 그림과 같다.
CRL (Certificate Revocation List, 인증서 취소 목록)는
어떤 사이트에 접속할 때, 브라우저는 해당 인증서(TLS, HTTPS를 위한)가 CRL에 포함되어있는지 여부를 확인함.
만약, 해당 인증서가 CRL에 포함되어 있다면, 사이트를 신뢰하지 않음으로 간주.

X << Y >> : X 노드가 Y 노드의 인증서를 신뢰한다는 것을 나타낸다.
즉, Y의 인증서가 X의 신뢰 체인에 포함되어 있다는 뜻이다.
이 경우, 상위 기관은 Y.
이 표현은 신뢰 체인에서 X가 Y에 의해 서명되거나, X의 신뢰 관계가 Y를 통해 이어진다는 것을 의미한다. X는 Y의 인증서를 통해 검증될 수 있으며, 이는 인증서 체인에서 상위 CA로부터 신뢰를 전달받는 과정을 나타낸다.
PKI(Public-Key Infrastructure, 공개키 기반 구조)
RFC 2828(Internet Security Glossary)에서 정의
디지털 인증서를 생성, 관리, 저장, 분배, 취소하는데 필요한 인프라(하드웨어, 소프트웨어) + 사람, 정책 및 절차를 통합하여 의미함.

PKIX(Public-Key Infrastructure X.509)는 X.509 기반의 공인 인증서를 사용하기 위한 아키텍처와 프로토콜을 지정하는 IETF 작업 그룹의 이름이다.
PKIX의 목표는 X.509 공개 키 인증서를 다양한 인터넷 애플리케이션에서 사용하고, 다른 구현 간의 상호 운용성을 촉진하는 것이다. PKIX는 인증서 프로필, 운영 및 관리 프로토콜, 인증서 정책 및 CPS에 관한 정보를 포함하는 표준을 제공한다.
CMP(Certificate Management Protocol, 인증서 관리 프로토콜)
CMS(Cryptographic Message Syntax, 암호 메시지 구문)
rootCA, Intermediate CA, user CA의 인증서를 만들고 root CA를 서버에 Install하고 인증서 체인을 검증해라.
openssl은 방대한 암호, 인증서 관련 도구이다.
간단하게 X.509 인증서를 생성 할 수 있다.
$ openssl genrsa -out myCA.key 2048
$ openssl req -x509 -new -nodes -key myCA.key -days 365 -out myCA.pem
$ openssl req -new -key myPri.key -out myCert.csr
$ openssl x509 -req -in myCert.csr -CA myCA.pem -CAkey myCA.key -CAcreateserial -out myCert.crt -days 365
CSR을 이용하여 인증서를 발급한다.
req 커맨드 : PKCS#10 인증서 요청과 인증서 생성 커맨드
x509 커맨드 : 인증서를 보거나 서명하는 다목적 커맨드
-x509 : 해당 옵션은 인증서를 생성하는 옵션이다. -CA 옵션을 사용하면 생략할 수 있다.
-new : 새로운 인증서 요청을 생성한다. 프롬프트에 인증서 필드에 대한 값을 유저에게 보여준다.
-nodes : deprecated in 3.0v
-key : 서명을 위한 키를 지정하는 옵션이다.
-days : 유효기간을 지정한다.



