목차
- 파이썬 os.remove 파일 삭제하기 이전 포스팅 예제 참고 학습
- 파이썬 datetime.timedelta 활용 날짜 계산 이전 포스팅 예제 참고 학습
- 파이썬 서버 인증서 추출하기 예제 이전 포스팅 참고 학습
- 파이썬 서버 인증서 피닝 예제
- 파이썬 다른 서버 인증서 피닝 후 서버 요청시 문제 예제
파이썬 os.remove 파일 삭제하기 이전 포스팅 예제 참고 학습
이전 포스팅에서는 파이썬에서 로컬에 저장된 파일을 삭제하는 방법과 예제에 대해 알아보았습니다. 파일을 삭제하는 작업은 os.remove 함수를 사용하여 간단하게 수행할 수 있었습니다. 특히 권한 문제로 인해 파일을 삭제할 수 없는 경우가 많습니다. 이런 경우 파이썬 스크립트를 sudo 관리자 권한으로 실행하면 파이썬에서 os.remove() 함수로 관리자 권한으로 모든 파일을 삭제할 수 있습니다. 파이썬에서 파일 삭제 방법이 궁금하시다면 아래 링크를 참고해주세요.
2023.07.04 - [Python/os] - [Python]Python에서 파일을 삭제하는 os.remove() API 활용 방법과 주의사항
[Python]Python에서 파일을 삭제하는 os.remove() API 활용 방법과 주의사항
파이썬에서 파일 삭제 작업은 프로그래밍에서 자주 수행되는 작업 중 하나입니다. 파일 삭제는 필요 없는 파일을 정리하거나, 프로그램에서 생성한 임시 파일을 제거하는 등 다양한 상황에서
salguworld.tistory.com
파이썬 datetime.timedelta 활용 날짜 계산 이전 포스팅 예제 참고 학습
다음으로 이전 포스팅에서는 datetime.timedelta 클래스를 사용하면 날짜와 시간을 계산하는 방법에 대해 알아보았습니다. 특히 타임스탬프와 시간 문자열, 날짜 문자열 간 변환 방법에 대한 예제가 포함되어있습니다. 파이썬에서 날짜의 년도, 월, 일 값을 따로 분리하여 저장하거나 활용하고 싶으시다면 아래 링크를 통해 datetime.timedelta 에 대해 자세히 알아보세요.
2023.07.13 - [Python/datetime] - [Python] datetime.timedelta 을 활용한 날짜 계산 - 2
[Python] datetime.timedelta 을 활용한 날짜 계산 - 2
오늘은 이전 timedelta 사용 방법 예제 포스팅과 더불어 더 다양한 예제를 알아보도록 하겠습니다. 반복 주기 생성하기 예제 timedelta를 사용하여 오늘 날짜로부터 정해진 기간마다의 반복 주기를
salguworld.tistory.com
파이썬 서버 인증서 추출하기 예제 이전 포스팅 참고 학습
마지막으로 이전 포스팅에서는 특정 서버에 SSL, socket 모듈을 활용하여 요청을 전송하고 응답을 받는 과정에서 서버의 인증서를 다운로드 받는 예제를 알아보았습니다. 이렇게 얻은 서버 인증서를 이용하여 SSL 인증서 Pinning 피닝을 수행할 수 있습니다. 피닝은 내가 설정한 이 외의 인증서를 주는 서버와는 통신을 하지 않겠다는 기술을 의미합니다. 물론 이 반대의 경우도 있습니다만 오늘 예제에서는 서버 SSL 인증서를 파이썬에서 피닝하여 통신하는 예제를 알아보겠습니다. 이를 위해 아직 파이썬에서 서버의 인증서 다운로드 방법을 잘 모르신다면 아래 링크를 참고해주세요.
2023.09.12 - [Python] - [Python] 파이썬 특정 서버 인증서 추출하기 예제(Server Certificate, SSL, Socket)
[Python] 파이썬 특정 서버 인증서 추출하기 예제(Server Certificate, SSL, Socket)
목차 파이썬 http 모듈 활용하여 HTTP GET, POST 통신 이전 포스팅 예제 참고 학습 파이썬 http 모듈 활용하여 HTTPS 통신 이전 포스팅 예제 참고 학습 파이썬 http 모둘 활용하여 Request 헤더 및 파일 업로
salguworld.tistory.com
파이썬 서버 인증서 피닝 예제
서버 인증서 피닝은 서버의 인증서를 미리 알고 있는 것을 확인하여 중간자 공격을 방지하기 위한 보안 기법입니다. 서버 인증서 피닝을 구현하려면 서버의 공식적인 인증서 정보를 프로그램에 내장하고, 클라이언트가 서버와 통신할 때 이를 확인해야 합니다. 아래는 이러한 파이썬 클라이언트에 서버 인증서를 피닝하는 예제입니다.
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("서버 인증서 정보가 로컬 인증서와 일치하지 않습니다.")