このトピックでは、Python Flask 開発サーバーに SSL 証明書をインストールする方法を説明します。証明書ファイルのダウンロードとアップロード、Flask アプリケーションでの設定、インストールの確認方法について説明します。
設定中にご質問がある場合は、アカウントマネージャーにお問い合わせください。
使用上の注意
開始する前に、次の要件を満たしていることを確認してください。
証明書のステータス: SSL 証明書が信頼できる認証局 (CA) によって発行されていること。証明書が まもなく期限切れ または 期限切れ の場合は、まずSSL 証明書を更新してください。
ドメイン名の一致: 証明書が保護しようとするすべてのドメイン名と一致していることを確認してください。そうでない場合、訪問者が HTTPS 経由で一致しないドメインにアクセスすると、セキュリティ警告が表示されます。ドメインを追加または変更するには、「ドメイン名の追加と置換」をご参照ください。
完全一致ドメイン名: 指定されたドメインにのみ適用されます。
example.comはexample.comのみを保護します。www.example.comはwww.example.comのみを保護します。
ワイルドカードドメイン名: 第 1 レベルのサブドメインにのみ適用されます。
*.example.comは、www.example.comやa.example.comなどの第 1 レベルのサブドメインに適用されます。*.example.comは、ルートドメインexample.comやa.b.example.comなどの複数レベルのサブドメインを保護しません。
説明複数レベルのサブドメインを保護するには、ドメイン名のバインド フィールドに、
a.b.example.comなどの正確なドメイン、または*.b.example.comなどの対応するワイルドカードドメインが含まれている必要があります。サーバー権限:
rootアカウント、またはsudo権限を持つアカウントが必要です。DNS 解決: ドメインの DNS レコードが設定され、サーバーのパブリック IP アドレスに解決されること。
環境の依存関係: サーバーに Python と Flask がインストールされていること。このトピックでは、Linux オペレーティングシステム、Python 3.6、および Flask 2.0.3 を例として使用します。
手順
ステップ 1: SSL 証明書を準備する
SSL 証明書管理 ページに移動します。対象の証明書を見つけ、操作 列の 証明書のダウンロード をクリックします。ダウンロード タブで、サーバータイプ が [その他] の証明書をダウンロードします。
ダウンロードした証明書パッケージを解凍します。
パッケージに証明書ファイル (.pem) と秘密鍵ファイル (.key) が含まれている場合は、両方のファイルを保存します。これらはデプロイメントに必要です。
パッケージに証明書ファイル (.pem) のみが含まれ、秘密鍵ファイル (.key) が含まれていない場合は、ローカルに保存した秘密鍵ファイルを使用して証明書をデプロイする必要があります。
説明証明書を申請する際に OpenSSL や Keytool などのツールを使用して証明書署名リクエスト (CSR) ファイルを生成した場合、秘密鍵ファイルはローカルにのみ保存されます。ダウンロードした証明書パッケージには秘密鍵は含まれません。秘密鍵を紛失した場合、証明書は使用できなくなります。再度公式証明書を購入し、新しい CSR と秘密鍵を生成する必要があります。
ステップ 2: システムとネットワーク環境を設定する
このステップでは、アプリケーションが指定されたポートでリッスンする権限を持ち、セキュリティグループとファイアウォールが外部トラフィックの到達を許可するようにします。
サーバーターミナルで次のコマンドを実行して、ポート 443 が開いているかどうかを確認します。
RHEL/CentOS
command -v nc > /dev/null 2>&1 || sudo yum install -y nc # <your_server_public_ip> をサーバーの実際のパブリック IP アドレスに置き換えます。 sudo ss -tlnp | grep -q ':443 ' || sudo nc -l 443 & sleep 1; nc -w 3 -vz <your_server_public_ip> 443出力が
Ncat: Connected to <The public IP address of the current server>:443の場合、ポート 443 は開いています。そうでない場合は、セキュリティグループとファイアウォールでポート 443 を開きます。Debian/Ubuntu
command -v nc > /dev/null 2>&1 || sudo apt-get install -y netcat # <your_server_public_ip> をサーバーの実際のパブリック IP アドレスに置き換えます。 sudo ss -tlnp | grep -q ':443 ' || sudo nc -l -p 443 & sleep 1; nc -w 3 -vz <your_server_public_ip> 443出力が
Connection to <public IP address of the current server> port [tcp/https] succeeded!または[<public IP address of the current server>] 443 (https) openの場合、ポート 443 は開いています。そうでない場合は、セキュリティグループとファイアウォールでポート 443 を開きます。セキュリティグループの設定でポート 443 を開きます。
重要サーバーがクラウドプラットフォームにデプロイされている場合は、そのセキュリティグループが TCP ポート 443 でのインバウンドトラフィックを許可していることを確認してください。そうでない場合、サービスにアクセスできなくなります。以下の手順では、Alibaba Cloud Elastic Compute Service (ECS) を例として使用します。他のクラウドプラットフォームについては、公式ドキュメントをご参照ください。
Elastic Compute Service インスタンス ページに移動し、対象のインスタンス名をクリックしてインスタンス詳細ページに移動します。詳細については、「セキュリティグループルールを追加する」をご参照ください。[セキュリティグループ] で、[アクション] を [許可]、[プロトコルタイプ] を [カスタム TCP]、[宛先ポート範囲] を [HTTPS(443)]、[認証オブジェクト] を [すべての IPv4 アドレス] に設定して新しいルールを追加します。
ファイアウォールでポート 443 を開きます。
次のコマンドを実行して、システムでアクティブなファイアウォールサービスを特定します。
if command -v systemctl >/dev/null 2>&1 && systemctl is-active --quiet firewalld; then echo "firewalld" elif command -v ufw >/dev/null 2>&1 && sudo ufw status | grep -qw active; then echo "ufw" elif command -v nft >/dev/null 2>&1 && sudo nft list ruleset 2>/dev/null | grep -q 'table'; then echo "nftables" elif command -v systemctl >/dev/null 2>&1 && systemctl is-active --quiet iptables; then echo "iptables" elif command -v iptables >/dev/null 2>&1 && sudo iptables -L 2>/dev/null | grep -qE 'REJECT|DROP|ACCEPT'; then echo "iptables" else echo "none" fi出力が
noneの場合、これ以上の操作は必要ありません。そうでない場合は、出力 (firewalld、ufw、nftables、またはiptables) に基づいて以下の対応するコマンドを実行して、ポート 443 を開きます。firewalld
sudo firewall-cmd --permanent --add-port=443/tcp && sudo firewall-cmd --reloadufw
sudo ufw allow 443/tcpnftables
sudo nft add table inet filter 2>/dev/null sudo nft add chain inet filter input '{ type filter hook input priority 0; }' 2>/dev/null sudo nft add rule inet filter input tcp dport 443 counter accept 2>/dev/nulliptables
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPTシステムの再起動後も iptables ルールが維持されるようにするには、次のコマンドを実行します。
RHEL/CentOS
sudo yum install -y iptables-services sudo service iptables saveDebian/Ubuntu
sudo apt-get install -y iptables-persistent sudo iptables-save | sudo tee /etc/iptables/rules.v4 >/dev/null
ステップ 3: Flask アプリケーションに証明書をインストールする
次のコマンドを実行して、サーバーのルート (
/) ディレクトリに証明書を保存するディレクトリを作成します。mkdir /ssl # ssl という名前の証明書ディレクトリを作成します。証明書ファイルと秘密鍵ファイルを証明書ディレクトリ (
/ssl) にアップロードします。説明PuTTY、XShell、WinSCP などのリモートログインツールのローカルファイルアップロード機能を使用してファイルをアップロードできます。Alibaba Cloud Elastic Compute Service インスタンスを使用している場合、ファイルのアップロード方法の詳細については、「ファイルのアップロードまたはダウンロード」をご参照ください。
Flask アプリケーションファイルを開き、次のサンプルコードを使用して証明書を設定します。
以下は、完全な Flask アプリケーションコードの例です。コードをコピーし、証明書のパスを変更して
test.pyとして保存し、テストを実行できます。# Flask Web フレームワークをインポートします from flask import Flask app = Flask(__name__) @app.route("/") def main(): return "<p>Hello, World!</p>" # SSL 証明書を設定します # HTTPS のデフォルトポートは 443 です。 # ポートを 443 に設定し、証明書とキーファイルへの絶対パスを指定します。 # '/ssl/cert.pem' を証明書ファイルの絶対パスに置き換えます。 # '/ssl/cert.key' を秘密鍵ファイルの絶対パスに置き換えます。 context = (r'/ssl/cert.pem', r'/ssl/cert.key') app.run(host="0.0.0.0", port=443, ssl_context=context)test.pyファイルが含まれているディレクトリに移動し、次のコマンドを実行して Flask サービスを再起動します。# test.py は例として使用されています。実際のファイル名に置き換えてください。 python test.py
ステップ 4: インストールを検証する
Web ブラウザで HTTPS 経由でドメインにアクセスします。例:
https://yourdomain.com。yourdomain.comを実際のドメインに置き換えます。ブラウザのアドレスバーにロックアイコンが表示された場合、証明書は正常にデプロイされています。アクセスエラーが発生した場合やロックアイコンが表示されない場合は、ブラウザのキャッシュをクリアするか、シークレット (プライバシー) モードで再試行してください。

バージョン 117 以降、Chrome のアドレスバーの
アイコンは新しい
アイコンに置き換えられました。このアイコンをクリックすると、ロック情報が表示されます。
問題が解決しない場合は、トラブルシューティングについて「よくある質問」をご参照ください。
本番稼働
本番環境にデプロイする際は、セキュリティ、安定性、保守性を向上させるために、以下のベストプラクティスに従ってください。
非管理者ユーザーとして実行:
アプリケーション専用の低権限のシステムユーザーを作成します。管理者権限を持つアカウントでアプリケーションを実行しないでください。
説明推奨されるアプローチは、ゲートウェイレイヤーで SSL を設定することです。これには、Server Load Balancer (SLB) や Nginx などのリバースプロキシに証明書をデプロイすることが含まれます。ゲートウェイは HTTPS トラフィックを終端し、復号化された HTTP トラフィックをバックエンドアプリケーションに転送します。
認証情報管理の外部化:
コードや設定ファイルにパスワードやその他の機密情報をハードコーディングしないでください。環境変数、Vault、またはクラウドプロバイダーのキー管理サービスを使用して認証情報を注入します。
HTTP から HTTPS へのリダイレクトを強制する:
中間者攻撃を防ぐために、すべての HTTP トラフィックを HTTPS にリダイレクトします。
最新の TLS プロトコルを設定する:
サーバー設定で古い安全でないプロトコル (SSLv3、TLSv1.0、TLSv1.1 など) を無効にします。TLSv1.2 と TLSv1.3 のみを有効にします。
証明書の監視と更新の自動化:
証明書をデプロイした後、ドメイン監視を有効にします。Alibaba Cloud は証明書の有効期間を自動的にチェックし、有効期限が切れる前に更新リマインダーを送信して、サービスの中断を回避するのに役立ちます。詳細については、「パブリックドメイン名監視の購入と有効化」をご参照ください。
よくある質問
インストールまたは更新後に証明書が機能しない、または HTTPS にアクセスできないのはなぜですか?
一般的な原因は次のとおりです。
サーバーのセキュリティグループまたはファイアウォールがポート 443 でのトラフィックを許可していません。「システムとネットワーク環境を設定する」をご参照ください。
アクセスしているドメインが証明書の ドメイン名のバインド に含まれていません。「ドメイン名の一致」をご参照ください。
Flask アプリケーションファイルが変更された後、Flask サービスが再起動されていません。手順については、「Flask サービスを停止して再起動する」をご参照ください。
証明書ファイルが正しく置き換えられていないか、Flask 設定の証明書パスが正しくありません。Flask アプリケーションファイルの証明書設定を確認し、最新の有効な証明書ファイルを使用していることを確認してください。
ドメインのトラフィックは、コンテンツ配信ネットワーク (CDN)、SLB、Web アプリケーションファイアウォール (WAF) などのクラウド製品を経由してルーティングされますが、そのサービスに証明書がインストールされていません。「複数の Alibaba Cloud サービスを通過するトラフィックの証明書デプロイメント場所」を参照して設定を完了してください。
ドメインの DNS は複数のサーバーに解決されますが、証明書はその一部にしかインストールされていません。各サーバーに証明書をインストールしてください。
さらなるトラブルシューティングについては、「ブラウザのエラーメッセージに基づく証明書デプロイメントの問題の解決」および「SSL 証明書デプロイメントのトラブルシューティングガイド」をご参照ください。
Flask にインストールされている SSL 証明書を更新 (置換) するにはどうすればよいですか?
まず、サーバー上の既存の証明書ファイル (.pem および .key) をバックアップします。次に、Certificate Management Service コンソールにログインし、新しい証明書ファイルをダウンロードして、ターゲットサーバーにアップロードして古いファイルを上書きします。パスとファイル名が同じであることを確認してください。最後に、変更を適用するために Flask サービスを再起動します。
Flask アプリケーションの起動時に FileNotFoundError エラーが発生する
このエラーは通常、ファイルパスが正しくないことを示します。ssl_context で指定された証明書と秘密鍵ファイルのパスが正しいかどうかを確認してください。パスは python <your-app-file>.py コマンドを実行するディレクトリからの相対パスであるか、絶対パスを使用する必要があります。
ブラウザに「ERR_SSL_PROTOCOL_ERROR」と表示されるか、接続がリセットされる
以下を確認してください。
証明書ファイルと秘密鍵ファイルが一致していることを確認してください。
証明書ファイルが完全な証明書チェーン (通常は
.pemファイル) であることを確認してください。Alibaba Cloud からダウンロードした証明書ファイルには、すでに完全なチェーンが含まれています。サーバーの セキュリティグループ または ファイアウォール が HTTPS ポート (この例ではポート
443) でのトラフィックを許可していることを確認してください。