[파이썬] 보안 인증서 및 인증 기관 설정
보안 인증서 및 인증 기관은 웹 사이트나 애플리케이션에서 안전한 통신을 보장하는 중요한 요소입니다. 이러한 인증서를 설정하는 방법에 대해 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를 통해 애플리케이션을 안전하게 운영할 수 있게 되었습니다.