목차
- 파이썬 os.remove 파일 삭제하기 이전 포스팅 예제 참고 학습
- 파이썬 datetime.timedelta 활용 날짜 계산 이전 포스팅 예제 참고 학습
- 파이썬 서버 인증서 추출하기 예제 이전 포스팅 참고 학습
- 파이썬 서버 인증서 피닝 예제
- 파이썬 다른 서버 인증서 피닝 후 서버 요청시 문제 예제
파이썬 os.remove 파일 삭제하기 이전 포스팅 예제 참고 학습
이전 포스팅에서는 파이썬에서 로컬에 저장된 파일을 삭제하는 방법과 예제에 대해 알아보았습니다. 파일을 삭제하는 작업은 os.remove 함수를 사용하여 간단하게 수행할 수 있었습니다. 특히 권한 문제로 인해 파일을 삭제할 수 없는 경우가 많습니다. 이런 경우 파이썬 스크립트를 sudo 관리자 권한으로 실행하면 파이썬에서 os.remove() 함수로 관리자 권한으로 모든 파일을 삭제할 수 있습니다. 파이썬에서 파일 삭제 방법이 궁금하시다면 아래 링크를 참고해주세요.
2023.07.04 - [Python/os] - [Python]Python에서 파일을 삭제하는 os.remove() API 활용 방법과 주의사항
파이썬 datetime.timedelta 활용 날짜 계산 이전 포스팅 예제 참고 학습
다음으로 이전 포스팅에서는 datetime.timedelta 클래스를 사용하면 날짜와 시간을 계산하는 방법에 대해 알아보았습니다. 특히 타임스탬프와 시간 문자열, 날짜 문자열 간 변환 방법에 대한 예제가 포함되어있습니다. 파이썬에서 날짜의 년도, 월, 일 값을 따로 분리하여 저장하거나 활용하고 싶으시다면 아래 링크를 통해 datetime.timedelta 에 대해 자세히 알아보세요.
2023.07.13 - [Python/datetime] - [Python] datetime.timedelta 을 활용한 날짜 계산 - 2
파이썬 서버 인증서 추출하기 예제 이전 포스팅 참고 학습
마지막으로 이전 포스팅에서는 특정 서버에 SSL, socket 모듈을 활용하여 요청을 전송하고 응답을 받는 과정에서 서버의 인증서를 다운로드 받는 예제를 알아보았습니다. 이렇게 얻은 서버 인증서를 이용하여 SSL 인증서 Pinning 피닝을 수행할 수 있습니다. 피닝은 내가 설정한 이 외의 인증서를 주는 서버와는 통신을 하지 않겠다는 기술을 의미합니다. 물론 이 반대의 경우도 있습니다만 오늘 예제에서는 서버 SSL 인증서를 파이썬에서 피닝하여 통신하는 예제를 알아보겠습니다. 이를 위해 아직 파이썬에서 서버의 인증서 다운로드 방법을 잘 모르신다면 아래 링크를 참고해주세요.
2023.09.12 - [Python] - [Python] 파이썬 특정 서버 인증서 추출하기 예제(Server Certificate, SSL, Socket)
파이썬 서버 인증서 피닝 예제
서버 인증서 피닝은 서버의 인증서를 미리 알고 있는 것을 확인하여 중간자 공격을 방지하기 위한 보안 기법입니다. 서버 인증서 피닝을 구현하려면 서버의 공식적인 인증서 정보를 프로그램에 내장하고, 클라이언트가 서버와 통신할 때 이를 확인해야 합니다. 아래는 이러한 파이썬 클라이언트에 서버 인증서를 피닝하는 예제입니다.
import ssl
import socket
from OpenSSL import crypto
server_host = "example.com" # 서버 호스트 주소 입력
server_port = 443 # HTTPS 포트
# 로컬 인증서 파일 경로 설정
local_cert_file = "/tmp/example_certificate.pem"
# 소켓 연결 설정
context = ssl.create_default_context()
with socket.create_connection((server_host, server_port)) as sock:
with context.wrap_socket(sock, server_hostname=server_host) as ssock:
# 서버 인증서 가져오기
server_cert_dict = ssock.getpeercert(True)
# 로컬 인증서 파일 읽기
with open(local_cert_file, "rb") as cert_file:
local_cert_pem = cert_file.read()
# 서버 인증서 정보 비교
server_cert = crypto.load_certificate(crypto.FILETYPE_ASN1, server_cert_dict)
local_cert = crypto.load_certificate(crypto.FILETYPE_ASN1, local_cert_pem)
print(local_cert.get_subject())
print(server_cert.get_subject())
# 주체 및 발급 기관 정보 확인
if (
server_cert.get_subject() == local_cert.get_subject()
and server_cert.get_issuer() == local_cert.get_issuer()
):
print("서버 인증서 정보가 로컬 인증서와 일치합니다.")
else:
print("서버 인증서 정보가 로컬 인증서와 일치하지 않습니다.")
파이썬 다른 서버 인증서 피닝 후 서버 요청시 문제 예제
서버 인증서 피닝을 구현한 경우, 서버가 예상한 것과 다른 인증서를 제공하는 경우 SSL/TLS 연결이 실패하고 예외가 발생합니다. 클라이언트는 서버의 인증서가 피닝에 맞는지 확인하고, 일치하지 않는 경우 연결을 종료합니다. 아래는 이러한 문제 발생 예제 코드입니다.
import ssl
import socket
from OpenSSL import crypto
server_host = "example.com" # 서버 호스트 주소 입력
server_port = 443 # HTTPS 포트
# 로컬 인증서 파일 경로 설정
local_cert_file = "/tmp/failed.pem"
# 소켓 연결 설정
context = ssl.create_default_context()
with socket.create_connection((server_host, server_port)) as sock:
with context.wrap_socket(sock, server_hostname=server_host) as ssock:
# 서버 인증서 가져오기
server_cert_dict = ssock.getpeercert(True)
# 로컬 인증서 파일 읽기
with open(local_cert_file, "rb") as cert_file:
local_cert_pem = cert_file.read()
# 서버 인증서 정보 비교
server_cert = crypto.load_certificate(crypto.FILETYPE_ASN1, server_cert_dict)
local_cert = crypto.load_certificate(crypto.FILETYPE_ASN1, local_cert_pem)
print(local_cert.get_subject())
print(server_cert.get_subject())
# 주체 및 발급 기관 정보 확인
if (
server_cert.get_subject() == local_cert.get_subject()
and server_cert.get_issuer() == local_cert.get_issuer()
):
print("서버 인증서 정보가 로컬 인증서와 일치합니다.")
else:
print("서버 인증서 정보가 로컬 인증서와 일치하지 않습니다.")