PythonでOpenSSL(pyOpenSSL)を使いこなす!基本から応用まで徹底解説

この記事は約5分で読めます。
スポンサーリンク

PythonでOpenSSL(pyOpenSSL)を使いこなすための実践的な解説とサンプルコードを紹介します。この記事では、pyOpenSSLのインストール方法から鍵ペア生成、証明書作成、SSL/TLS通信まで幅広く取り扱い、初心者から中級者まで役立つ内容をまとめました。

pyOpenSSLとは

pyOpenSSLは、PythonからOpenSSLの機能を3利用できる強力なライブラリです。Python標準のsslモジュールよりも柔軟かつ高度な証明書管理やSSL/TLS通信が可能です。

pyOpenSSLのインストール方法

まずはインストールから始めましょう。コマンドラインで以下のコマンドを実行してください。

pip install pyopenssl

インストールが完了したら、Pythonでバージョンを確認します。

import OpenSSL
print(OpenSSL.__version__)

バージョンが表示されればインストール成功です。

鍵ペアの生成と保存

鍵ペア(秘密鍵・公開鍵)を生成し、ファイルに保存する方法です。

from OpenSSL import crypto

key = crypto.PKey()
key.generate_key(crypto.TYPE_RSA, 2048)

with open("private_key.pem", "wb") as f:
    f.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, key))

with open("public_key.pem", "wb") as f:
    f.write(crypto.dump_publickey(crypto.FILETYPE_PEM, key))

print("鍵ペアの生成が完了しました。")

証明書の作成と管理

自己署名証明書を作成し、保存する例です。

from OpenSSL import crypto

key = crypto.PKey()
key.generate_key(crypto.TYPE_RSA, 2048)

cert = crypto.X509()
cert.get_subject().CN = "myserver"
cert.set_serial_number(1000)
cert.gmtime_adj_notBefore(0)
cert.gmtime_adj_notAfter(10*365*24*60*60)
cert.set_issuer(cert.get_subject())
cert.set_pubkey(key)
cert.sign(key, "sha256")

with open("self_signed_cert.pem", "wb") as f:
    f.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert))

証明書の読み込みと情報表示

証明書ファイルを読み込み、情報を表示する方法です。

from OpenSSL import crypto

with open("self_signed_cert.pem", "rb") as f:
    cert_data = f.read()

cert = crypto.load_certificate(crypto.FILETYPE_PEM, cert_data)

print("発行者:", cert.get_issuer().CN)
print("主体者:", cert.get_subject().CN)
print("有効期限:", cert.get_notAfter().decode())

try:
    crypto.X509Store().verify(cert, None)
    print("証明書の署名は有効です。")
except crypto.X509StoreContextError:
    print("証明書の署名が無効です。")

SSL/TLS通信の実装例

pyOpenSSLを使ったSSL/TLS通信のサンプルです。

from OpenSSL import SSL
import socket

context = SSL.Context(SSL.SSLv23_METHOD)
context.set_verify(SSL.VERIFY_PEER, lambda conn, cert, errnum, depth, ok: ok)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conn = SSL.Connection(context, s)
conn.connect(('localhost', 8443))
conn.do_handshake()
conn.send(b"Hello, secure world!")
print(conn.recv(1024))
conn.shutdown()
conn.close()
print("SSLクライアントを終了します。")

応用:証明書から公開鍵を取り出す方法

証明書から公開鍵を抽出する方法です。

from OpenSSL import crypto

def get_pubkey(file_path):
    with open(file_path, "rb") as f:
        cert_data = f.read()
    cert = crypto.load_certificate(crypto.FILETYPE_PEM, cert_data)
    pubkey = crypto.dump_publickey(crypto.FILETYPE_PEM, cert.get_pubkey())
    print(pubkey)

get_pubkey("self_signed_cert.pem")

まとめ

この記事では、PythonでOpenSSLを活用するための基本的な手順と応用例をまとめました。SEO対策として、見出しやキーワード、サンプルコードを活用し、視認性を高める工夫も意識しています。AIや画像生成ツールを活用することで、さらに記事の魅力を引き出すことができます。

コメント

タイトルとURLをコピーしました