콘텐츠로 이동

2021 06 16

2021-06-16

https

  • 참고 1: https://www.youtube.com/watch?v=H6lpFRpyl14
  • 참고 2: https://coding-start.tistory.com/208
  • 참고 3: https://opentutorials.org/course/228/4894
  • https가 필요한 이유? - http의 약점 - http만 가지고는 도청이 너무 쉬움. 중요한 내용 그대로 노출됨 - 통신 상대 확인 안하기에, 위장이 가능 - 완전성 증명 X, 변조 가능 - 다음과 같은 기능이 필요하기에 http+ssl 도입 1. 다른 사람들이 네트워크를 통해 전송한 내용을 훔쳐보더라도 못 알아 듣게 하기 위해 2. 클라이언트 입장에서 접속한 사이트가 믿을 만한 곳인지를 보장하기 위해
  • https? - ssl이라는 보안 프로토콜 위에서 동작하는 http - [SSL(Secure Socket Layer)] - 인터넷 상에서 데이터를 안전하게 전송하기 위한 인터넷 암호화 통신 프로토콜 - SMTP, Telnet에서도 사용가능 - 응용 계층과 전송 계층 사이에서 동작하는 독립적인 프로토콜 - 참고: https://security.stackexchange.com/questions/19681/where-does-ssl-encryption-take-place - HTTP 통신을 하는 소켓 부분을 SSL/TLS 프로토콜로 대체 - HTTPS는 직접 TCP와 통신하지 않고, SSL과 통신하게 됨 - 응용 계층의 http 프로토콜에서 사용자의 데이터 받고, "전송계층으로 캡슐화 되기 이전"에 SSL 프로토콜에 의해 사용자의 데이터 암호화 - 서버에서는 전송계층에서 세그먼트 받아 ssl 계층에서 데이터 복호화 한 후 응용계층에 보냄
  • 대칭키 방식 vs 비대칭키 방식 - 대칭키 - 수신과 송신에 같은 암호화-복호화 적용 - 둘이 같은 키를 가지고 있기에 이를 통해 암호화-복호화 가능 - 하지만 같은 키를 "누군가 한 번" 한쪽에서 다른쪽에게 넘겨줘야 하기에 보안상 문제가 있음 - openssl을 통한 실습
    # tiltext.txt를 tiltext.bin으로 암호화 (이때 대칭키를 직접 입력해줌)
    $ openssl enc -e -des3 -salt -in tiltext.txt -out tiltext.bin
    enter des-ede3-cbc encryption password: 대칭키
    Verifying - enter des-ede3-cbc encryption password: 대칭키
    
    #tiltext.bin을 decryptedtiltext.txt로 복호화 (이때 대칭키 입력해줘야함)
    $ openssl enc -d -des3 -in tiltext.bin -out decryptedtiltext.txt;
    enter des-ede3-cbc decryption password: 대칭키
    

    - 비대칭키 - 공개키와 개인키로 구성 - 공개키는 그냥 누구나 볼 수 있도록 대중에 공개 - 다음과 같은 방식으로 네트워크를 통해 전송할 내용을 암호/복호화 가능 - Text --공개키로 암호화--> 암호화 된 Text --개인키로 복호화--> Text - Text --개인키로 암호화--> 암호화 된 Text --공개키로 복호화--> Text - 다음과 같은 방식으로 믿을만한 사이트인지 판별 - Client가 Server에 사이트 요청 - Server의 개인키로 암호화 된 내용 Client에게 전송 - Client는 공개키로 Server의 내용을 복호화해서 볼 수 있음 - openssl을 통한 실습

    # 개인키 생성
    $ openssl genrsa -out privatetil.pem 1024;
    Generating RSA private key, 1024 bit long modulus (2 primes)
    .........................+++++
    .........+++++
    e is 65537 (0x010001)
    $ cat privatetil.pem
    -----BEGIN RSA PRIVATE KEY-----
    MIICXgIBAAKBgQDTf62Rubp2uSIaCibESRZT25JQ0Du8baz6vD8bi1Vpc7NYCOx7
    5yFWNUUYA7b0MskbEnuOeKYVeJiYa7jIPblWkFKNAtl7lyFi2C8ogYkVuRX0xXYV
    nJoIIdfoGiwSnR44ASAsPTWeMQVqmg7cpa7838HVNtV3XKncRmHL78z8LQIDAQAB
    AoGBALzvNO2WPeVrEvSyFtmH9OMqpfV9X6+/RiSi37lKah2O1yqQpjk1S0mIwtVm
    FBzn9VEy3J90VeGeXqriqCpxQUtb/B8QQeM6vCmn26YF0NYrhatzV8XnemXi3ak9
    4Iy7CVls4LcprsO1SFR6VIJZ8SkrpuFfLCnKckJB0JcVxoxhAkEA8s17LFvr/oCr
    4eP6OaCKjNzqwU/c7JHWVi1LRBlyKxzIMABjap/EeiDQg8rJVVs2oYwW7vSQfjPy
    L2h0PbB/uQJBAN7+nPimdyeI6ZAcaS3fuDbjdyVPmEqVfPYSD8ZYVXARcpaT0GK5
    H5OxSgzr59aftvPVmbvFNavULrbzN4LTkhUCQQDEHF/ullho+fjavU7wmNEPsagT
    d7QTiD+831y5pmvmkprG2qlyB5WkpziEGpi/zqqzlPk5DGRg6wgkbpPk99hRAkEA
    18qUpJqSnBOF0gtsTRQ98//TAKwxt5tJveZklZBNvZFkzgpkkeSLhiT+f9qaE7uj
    E/sUNfz1nz5Jpoleop+SsQJAa8VY+ybF6NOgjoFEHJ/4wkjt4mrx3fve3hgExYjT
    IrNmnxRHq3SdCTn6UQJHkBaf/xlZuWWW21cyDw5u/BcnwQ==
    -----END RSA PRIVATE KEY-----
    
    # 공개키 생성
    $ openssl rsa -in privatetil.pem -out publictil.pem -outform PEM -pubout;
    writing RSA key
    $ cat publictil.pem
    -----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDTf62Rubp2uSIaCibESRZT25JQ
    0Du8baz6vD8bi1Vpc7NYCOx75yFWNUUYA7b0MskbEnuOeKYVeJiYa7jIPblWkFKN
    Atl7lyFi2C8ogYkVuRX0xXYVnJoIIdfoGiwSnR44ASAsPTWeMQVqmg7cpa7838HV
    NtV3XKncRmHL78z8LQIDAQAB
    -----END PUBLIC KEY-----
    
    # 공개키를 통해 텍스트 파일을 암호화, 이를 개인키를 가진 소유자에게 전달하면 됨
    $ openssl rsautl  -encrypt -inkey publictil.pem -pubin -in tiltext.txt -out tiltext.ssl;
    $ cat tiltext.ssl
    t�(�s��6�0V�a��İZ"6�C�-���3.�%��6E�r�ns�%
    a�e|o)f�)no��;T
    咜�5�+m���i7ΐZ�0�E�݌�!�4�D�I���֖����#J�U;C��H��~
    
    # 개인키를 가진 소유자가 tiltext.ssl을 복호하 한 것을 볼 수 있음
    $ openssl rsautl -decrypt -inkey privatetil.pem -in tiltext.ssl -out decrypted.txt;
    $ cat decrypted.txt
    tiltil
    

  • SSL - CA라는 SSL 공인 인증 기관이 있음. 여기서 SSL 발급 및 관리 - 브라우저는 CA들의 목록을 가지고 있음
  • https 인증 과정 1. Client는 "ClientRandomData"를 만들어 Server에게 전송 2. Server는 "ServerRandomData"를 만들어 "CA의 개인키로 암호화 된 SSL 인증서"와 함께 Client에게 전송 3. Client는 Server로 부터 받은 "CA의 개인키로 암호화 된 SSL 인증서"를 CA의 공개키로 복호화 함 4. 복호화한 SSL 인증서에는 "Server의 공개키"가 있음 5. Client는 "ClientRandomData + ServerRandomData"를 묶어 Client와 Server 사이의 "대칭키"를 생성함 6. Client는 "대칭키"를 "Server의 공개키"로 암호화하여 Server에게 전송 7. Server는 이를 "Server의 개인키로" 복호화 하여 Client가 만든 "대칭키"를 확인 8. 앞으로 둘 간의 통신에서 해당 대칭키를 사용 9. 데이터 전송이 끝난 후, 대칭키 폐지!
  • 와이어샤크로 살펴보기 - - 참고: https://ask.wireshark.org/question/2745/why-wireshark-is-not-showing-http-or-https-packets-in-the-view/ - https 패킷 같은 건 없나봐...? - https == http over tls - 와이어샤크로 암호화된 컨텐츠를 해부할 수 없어 - 따라서 가장 높은 Layer의 패킷은 TLS의 패킷임 - - 3-way-handshake를 통한 TCP 연결 수립 확인 - 클라이언트 측 HTTP 요청 - 서버 측 TCP로 ACK(확인했다) 응답 - 서버 측 HTTP로 요청한 자료 전달

TCP/UDP

  • 참고: https://www.youtube.com/watch?v=ikDVGYp5dhg
  • Transport Layer - 신뢰성: 데이터를 순차적, 안정적으로 전달 - 전송: 포트 번호에 해당하는 프로세스에 데이터를 전달
  • TCP - 신뢰성 있는 데이터 통신을 가능하게 해주는 프로토콜 - Connection 연결을 통한 양방향 통신 - 데이터의 순차 전송 보장 - 특징 - Flow Controll (흐름 제어) - Congestion Controll (혼잡 제어) - Error Detection (오류 감지) - Application Layer에서 내려온 정보를 잘라 TCP Segment로 바꿈 - 조금 짤라 앞에 TCP Header 붙임 - 3-way-handshake로 연결 수립 - 연결 수립 후 패킷 전송, 성공 전달 시 ACK, 유실 시 재전송 - 4-way-handshake로 빠이빠이