ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CA (Certificate Authority) 알아보기
    Security 2023. 11. 28. 06:06
    728x90
    반응형

    - 목차

     

     

    함께 보면 좋은 글.

    https://westlife0615.tistory.com/296

     

    RSA 암호화 수학적 원리 이해하기

    - 목차 함께 보면 좋은 글. https://westlife0615.tistory.com/411 CA (Certificate Authority) 알아보기 - 목차 소개. CA 는 Certificate Authority 의 약자입니다. 흔히 https 프로토콜에서 사용하는 인증서를 통한 인증 기

    westlife0615.tistory.com

    https://westlife0615.tistory.com/45

     

    TCP Socket 알아보기

    - 목차 소개.TCP 소켓에 대해서 가볍게 알아보는 시간을 가지려고 합니다. 소켓은 TCP 소켓과 같은 네트워크 통신 뿐만 아니라 IPC (Inter Process Communication) 에서도 Socket 방식의 통신 기법이 있는데요.

    westlife0615.tistory.com

     

    소개.

    CA 는 Certificate Authority 의 약자입니다.
    흔히 https 프로토콜에서 사용하는 인증서를 통한 인증 기법을 의미하구요.
    이번 소개글에서 CA 가 네트워크 통신에서 어떤 방식으로 적용되는지 알아보려고 합니다.

    Certificate 란?

    CA 에서 Certificate 가 의미하는 것은 전자서명을 의미합니다.
    이는 인증서를 뜻하는데요.
    서버와 클라이언트가 통신을 수행할 때, 해당 인증서를 통해서 클라이언트가 해당 서버가 신뢰할 수 있는 존재임을 판단하게 됩니다.


    Certificate 생성 과정.


    먼저 인증서를 생성하는 과정에 대해서 알아보겠습니다.  

    1. 공개키와 비밀키를 생성합니다.


    보통 인증서는 비대칭키 암호화 방식을 사용합니다.
    “비밀키 - 공개키” 라고 흔히 알려진 방식인데요.
    RSA 방식으로 비대칭키를 생성하곤 합니다.
    인증서를 생성하기 위해서 해당 비밀키와 공개키가 반드시 필요합니다.
    여기서 공개키가 바로 인증서 생성에 사용되구요.
    비밀키는 인증서를 생성하는 주체가 노출되지 않도록 관리하여야합니다.

    2. 인증서 생성.


    인증서는 공개키를 기반으로 생성됩니다.
    그리고 소유자의 정보, 유효기간, 전자 서명 등이 필요합니다.
    요약하자면 인증서의 구성은 아래와 같습니다.
    - 공개키
    - 소유자 정보
    - 인증서 만료기간
    - 전자 서명
    - 발급자 정보


    여기서 중요한 점은 전자 서명과 발급자 정보입니다.
    왜냐하면 인증서를 생성하기 위해서는 발급자라는 외부 요소의 개입이 필요하기 때문입니다.
    그 외 공개키와 소유자 정보 등은 이미 알고 있는 정보이죠.

    Commodo, Geotrust, Go Daddy 등의 CA agent 들이 존재하며,
    이들은 인증서의 전자 서명을 책임지는 신뢰할 수 있는 기관들입니다.

    3. 전자서명은 어떤 방식으로 작성될까?


    인증서의 전자서명은 발급자에 의해서 생성됩니다.
    더 구체적으로 말하면, 인증서는 계층 구조를 가지게 되고 하나의 인증서는 2~3 개의 상위 인증서를 가지게 됩니다.
    상위 인증서일수록 더 신뢰할 수 있는 대상이 되며,
    최상단의 인증서를 루트 인증서라고 합니다.
    이 루트 인증서들이 바로 위에서 언급한 Geotrust, Commodo, go daddy 등 입니다.
    각 인증서가 가지는 전자 서명은 상위 인증서로부터 발급되며, 최상단 인증서인 루트 인증서는 Self-Signed 라고 하여 자신이 자신의 인증서에 서명을 합니다.

    전자서명의 생성 방식은 아래와 같습니다.
    - 인증서의 내용은 hash 방식으로 인코딩합니다.
    - hash 된 인증서의 내용은 상위 인증서의 비밀키로 암호화합니다.

    이렇게 암호화된 내용이 바로 전자 서명이 됩니다.
    반대로 복호화를 할때엔,
    상위 인증서의 공개키로 전자서명을 복호화하면 인증서를 hash 한 값을 얻을 수 있습니다.
    이 과정에서 복호화를 할 수 없다는 해당 인증서는 상위 인증 기관의 인증은 받은 인증서가 아니게 됩니다.


    Certificate 인증 방식.


    보통 PC 나 웹 브라우저들은 자체적으로 Root CA 의 인증서들을 소유하고 있습니다.
    대부분의 신뢰가능한 인증서의 모음을 이미 가지고 있습니다.
    인증서는 상위 인증서의 공개키를 통해서 유효성을 검증하게 되는데,
    이미 신뢰가능한 인증서들의 모음을 가지고 있으니 해당 인증서들을 사용하게 되는 것이죠.

    < 로컬 PC 내부의 인증서 목록 >

    SSL/TLS 통신의 예시.


    TCP 통신을 위해선 여러 시스템 콜이 사용됩니다.
    네트워크 관련 시스템 콜이 사용되며,
    - socket
    - bind
    - listen
    - accept
    - recv
    - send
    등이 사용됩니다.

    socket 부터 listen 까지의 시스템 콜을 통해서 TCP 서버는 클라이언트의 커넥션 요청을 수용할 준비를 합니다.
    그리고 accept 부터 인증서 사용되는데요.
    클라이언트의 커넥션 요청을 accept 시스템 콜로 수용한 이후에 서버는 클라이언트에게 인증서를 전달합니다.
    send 시스템 콜을 통해서 인증서는 클라이언트에게 전달됩니다.
    그럼 클라이언트는 서버에게서 전달받은 인증서를 검증합니다.
    클라이언트가 지니고 있는 신뢰가능한 인증서들을 활용하여 검증을 수행합니다.
    이러한 절차가 완료되면 클라이언트는 서버가 신뢰가능한 인증서를 제공해주었음을 인식하게 되죠.

    < tcp server >

    import socket
    
    # Create a TCP socket
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(("localhost", 8080))
    server_socket.listen(1)
    
    print("Server listening on port 8080...")
    
    # Accept incoming connections
    client_socket, client_addr = server_socket.accept()
    
    # Wrap the socket with a basic encryption layer (not secure for production)
    encrypted_socket = socket.ssl(client_socket, server_side=True, certfile="server.crt", keyfile="server.key")
    
    # Receive and print the data
    data = encrypted_socket.read(1024)
    print("Received data:", data.decode("utf-8"))
    
    # Close the connection
    encrypted_socket.close()
    server_socket.close()
    



    < tcp client >

    import socket
    
    # Create a TCP socket
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect(("localhost", 8080))
    
    # Wrap the socket with a basic encryption layer (not secure for production)
    encrypted_socket = socket.ssl(client_socket, cert_reqs=socket.CERT_NONE)
    
    # Send data to the server
    encrypted_socket.write("Hello, Server!".encode("utf-8"))
    
    # Close the connection
    encrypted_socket.close()
    client_socket.close()
    

    반응형

    'Security' 카테고리의 다른 글

    RSA 암호화 수학적 원리 이해하기  (0) 2023.09.24
    json web token (JWT)  (0) 2023.03.24
Designed by Tistory.