[파이썬] 보안 인증서 및 인증 기관 설정

보안 인증서 및 인증 기관은 웹 사이트나 애플리케이션에서 안전한 통신을 보장하는 중요한 요소입니다. 이러한 인증서를 설정하는 방법에 대해 Python을 사용하여 알아보겠습니다.

1. 인증서 생성 및 키 쌍 만들기

Python에서 인증서를 생성하고 키 쌍을 만들기 위해서는 cryptography 라이브러리를 사용할 수 있습니다. 먼저, 해당 라이브러리를 설치해야 합니다.

pip install cryptography

아래의 코드를 사용하여 인증서와 키 쌍을 생성할 수 있습니다.

from cryptography import x509
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization

# 키 쌍 생성
from cryptography.hazmat.primitives.asymmetric import rsa

private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048, backend=default_backend())
public_key = private_key.public_key()

# 인증서 생성
from cryptography.x509.oid import NameOID, ExtendedKeyUsageOID

subject = issuer = x509.Name([
    x509.NameAttribute(NameOID.COUNTRY_NAME, u"KR"),
    x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u"Seoul"),
    x509.NameAttribute(NameOID.LOCALITY_NAME, u"Gangnam"),
    x509.NameAttribute(NameOID.ORGANIZATION_NAME, u"MyOrg"),
    x509.NameAttribute(NameOID.COMMON_NAME, u"example.com"),
])

cert_builder = x509.CertificateBuilder().subject_name(subject).issuer_name(issuer).public_key(public_key).serial_number(x509.random_serial_number()).not_valid_before(datetime.utcnow()).not_valid_after(datetime.utcnow() + timedelta(days=365))

# 인증 기관 구성
cert_builder = cert_builder.add_extension(
    x509.BasicConstraints(ca=True, path_length=None), critical=True
).add_extension(
    x509.SubjectKeyIdentifier.from_public_key(public_key), critical=False
).add_extension(
    x509.KeyUsage(
        digital_signature=True,
        key_encipherment=True,
        content_commitment=False,
        data_encipherment=False,
        key_agreement=False,
        key_cert_sign=True,
        crl_sign=True,
        encipher_only=False,
        decipher_only=False,
    ), critical=True
).add_extension(
    x509.ExtendedKeyUsage([ExtendedKeyUsageOID.SERVER_AUTH, ExtendedKeyUsageOID.CLIENT_AUTH]), critical=False
)

cert = cert_builder.sign(private_key=private_key, algorithm=hashes.SHA256(), backend=default_backend())

# 인증서와 개인 키를 파일로 저장
with open("cert.pem", "wb") as f:
    f.write(cert.public_bytes(serialization.Encoding.PEM))

with open("key.pem", "wb") as f:
    f.write(private_key.private_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PrivateFormat.PKCS8,
        encryption_algorithm=serialization.NoEncryption()
    ))

이 코드를 실행하면 “cert.pem” 파일이 인증서, “key.pem” 파일이 개인 키로 생성됩니다.

2. Flask 애플리케이션에 인증서 적용

보안 인증서를 설정한 후, 해당 인증서를 사용하여 Flask 애플리케이션을 보호할 수 있습니다. 아래의 코드를 사용하여 Flask 애플리케이션에 인증서를 적용할 수 있습니다.

from flask import Flask
from flask_sslify import SSLify

app = Flask(__name__)
sslify = SSLify(app)

위의 코드는 Flask 애플리케이션에 SSLify를 사용하여 자동으로 HTTPS로 전환하는 기능을 추가합니다.

3. 웹 서버 설정

마지막으로, 웹 서버에서 SSL/TLS 설정을 해야 합니다. 예를 들어, Nginx 웹 서버를 사용하는 경우 server 블록에 다음과 같이 설정할 수 있습니다.

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;

    location / {
        proxy_pass http://localhost:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

위의 예에서 /path/to/cert.pem/path/to/key.pem은 앞서 생성한 인증서 파일과 개인 키 파일의 경로를 나타냅니다. 설정을 마친 후 웹 서버를 재시작하여 변경사항을 적용해야 합니다.

이제 Python을 사용하여 보안 인증서와 인증 기관을 설정하는 방법을 알게 되었습니다. HTTPS를 통해 애플리케이션을 안전하게 운영할 수 있게 되었습니다.