今回の多部構成の記事では、Pythonを使ったLet's Encrypt ACME version 2 APIをSSL証明書に利用する方法を学びます。
本ブログは英語版からの翻訳です。オリジナルはこちらからご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。
この記事について
Let's Encryptは人気のあるトピックであり、それについての多くの情報はすでにオンラインで入手可能です。しかし、この記事は、これらのトピックについてもっと知りたい場合に役立ちます。
1、Let's Encrypt の使用方法とメリット、ACME v2 API の使用方法について説明します。
2、Alibaba Cloud API GatewayとAlibaba Cloud CDNの自動クライアントを作成して、複数の手動方法を使わずにSSL証明書の要求、検証、発行、インストールを行う
3、サービスごとにSSL証明書を購入するとすぐに高額になってしまうため、多数のクラウドサービスを保護するための安価なソリューションを開発。
4、従来の商用証明書の取得に時間がかかっていたのとは異なり、サービス用SSLの設定を迅速に行うことができます。
クラウドサービスが普遍的に受け入れられるようになると、API GatewayやCDNなどの人気サービスでは、SSL証明書の申請・発行・インストールが難しくなります。この記事では、これを簡単かつ正しく行う方法を紹介したいと思います。WebサイトのSSL証明書ではなく、設定が難しいクラウドサービスやRESTエンドポイントなどに焦点を当てています。
これらの記事では、certbot やサードパーティ製品による既存の Let's Encrypt クライアントのサポートがないサービスの SSL 証明書に焦点を当てています。例えば、certbot は Apache Web サーバの SSL 証明書の作成と更新を自動化するための優れたサポートを提供しています。しかし、Windows IIS サーバのサポートはほとんどありません。最後のパートでは、IIS用のSSL証明書を作成し、PKCS#12形式にバンドルしてIISにインポートするデモを行います。
SSL証明書とは?
SSL証明書とは、以下のようなものです。
1、ドメイン名、サーバー名、ホスト名。
2、会社名や所在地などの組織のアイデンティティ。
SSL証明書に結合される詳細は、SSL証明書を発行する前に認証局(CA)が行う検証の種類によって異なります。
SSL証明書は、組織の詳細に暗号鍵をデジタル的に結合する1つ以上の小さなデータファイルのセットです。ウェブサーバにインストールすると、パドロック、httpsプロトコルを有効化し、ウェブサーバからブラウザへの安全な接続を可能にします。API Gateway などのサービスにインストールすると、システム間の通信を保護します。
Let's Encryptとは?
ウィキペディアによると、Let's Encryptは、安全なウェブサイトのための証明書を手動で作成、検証、署名、インストール、更新するというこれまで複雑だったプロセスを排除するために設計された自動化されたプロセスを介して、Transport Layer Security (TLS) 暗号化のためのX.509証明書を無料で提供する証明書局です。2016年4月12日に発売されました。
つまり、Let's Encryptは、WebサイトやAPI Gateway、CDN、ECSなどの多数のクラウドサービスに対応したSSL証明書を無料で提供しています。
認証局 (CA) とは何ですか?
認証局 (CA) とは、SSL 証明書に暗号的に署名し、その真正性を保証する事業体のことです。ブラウザやオペレーティングシステムには、サイトの証明書を検証するために使用する信頼できる認証局のリストがあります。
最近まで、ほとんどの認証局は、その検証と署名サービスにお金を請求する商業的な運営を行っていました。Let's Encrypt は、手順を完全に自動化し、必要なインフラストラクチャに資金を提供するためのスポンサーや寄付に頼ることで、このプロセスをユーザーが無料で利用できるようにしました。
Let's Encryptは、ドメイン検証済みSSL証明書を発行するCAです。Let's Encryptサーバは、ACMEプロトコルを使用して、ACMEクライアントと通信し、SSL証明書の要求、発行、更新、失効を行います。
SSL証明書の種類
SSL 証明書には多くの種類がありますが、最も一般的なのは Domain Validated (DV)、Organization Validated (OV)、Extended Validated (EV)の 3 種類です。
1、Domain Validated (CABF OID 2.23.140.1.2.1) - 最も一般的なタイプで、ドメイン名のみを使用して検証されます。
2、組織検証済み(CABF OID 2.23.140.1.2.2) - 組織名が証明書に添付されるため、DV と比較してより多くの検証を必要とします。
3、Extended Validated (CABF OID 2.23.140.1.1) - 認証局による検証に最も労力を必要とし、訪問者に最大の信頼を提供します(ウェブブラウザ上に緑色のバーが表示される)。
4、自己署名、個人認証、テスト、コード署名などのその他のタイプ。
また、SSL証明書は種類ごとにシングルドメイン、マルチドメイン、ワイルドカードにすることができます。すべてのSSL証明書がワイルドカードドメイン名を含む1つ以上のドメイン名をサポートしているので、これは本当にマーケティングのための機能に過ぎません。
Let's EncryptはDV SSL証明書のみを発行しています。OVまたはEV SSL証明書が必要な場合は、アリババクラウドSSL証明書サービスなどの商用CAを利用する必要があります。証明書に保存されている情報の量や種類以外には、証明書に違いはありません。ドメイン名だけでなく、ドメイン名を管理している組織を検証するためにCAが完了する時間とプロセスです。金融取引を提供するサービスでは、EV SSL証明書を強く検討してください。CDNやAPIゲートウェイなどのサービスでは、DV証明書が最適です。
Webサーバやクラウドサービスにとって、SSL証明書の種類(DV、OV、EV)は全く違いがありません。クライアント(ウェブブラウザや実際の人)は気にしているかもしれません。もし私が銀行に接続していて、銀行がDV SSL証明書しか持っていなかったら、私はなぜなのか疑問に思うでしょう。重要なのは、保護するものの価値と、保護に失敗した場合のコストを評価することです。ウェブサイトのお問い合わせフォームのためのDV SSL証明書はちょうど良いです。クレジットカードを処理するためには、EV証明書が必要になります。送金する人は誰でも、ドメイン検証だけでなく、拡張検証レベルで完全に検証されることを望んでいます。
ACMEとは?
ACMEとは、「ACME」の略です。Automatic Certificate Management Environment(自動証明書管理環境)の略です。ACMEは、クライアントがSSL証明書の管理(発行、更新、失効)のためにCA(認証局)とインターフェースをとるための通信プロトコルです。
ACMEプロトコルは、HTTPS上でJSON形式のメッセージを渡すことに基づいています。リクエストは秘密鍵で署名され、対応する公開鍵で認証されます。このキーペアはアカウントキーと呼ばれます。このキーペアは、CSR (Certificate Signing Request) を作成するために使用されるキーペアとは異なることに注意してください。
アカウントキー
アカウント・キーは、証明書サービスを要求しているアカウントの ID を提供するために使用されます。ログイン/パスワードなどの方法は使用されません。アカウントキーはSSL証明書の発行、更新、失効に使用されるため、アカウントキーのペアを安全な場所に保存しておくことが非常に重要です。アカウントキーを紛失した場合、そのアカウントの下で作成された証明書は保留状態になります。これらの証明書を更新したり失効させたりすることはできません。この場合、新しいアカウントキーを作成して、管理を失った証明書の代わりに新しいSSL証明書を発行する必要があります。悪意のある第三者がアカウントキーへのアクセスを取得した場合、連絡先のメールアドレスを変更し、証明書を失効させることができます。ドメイン名の HTTP または DNS の検証が必要となるため、ドメインの新しい SSL 証明書を発行することはできません。
証明書キー
証明書キーは、CSR(証明書署名要求)に署名するために使用されるキーペアです。両方ともキー・ペアであるにもかかわらず、これはアカウント・キーではありません。セキュリティ上の理由から、アカウント鍵をCSRに署名するのは避けた方が良いでしょう。一般的には、SSL 証明書ごとに新しい証明書キーを作成するのが一般的です。
CSR - 証明書署名要求
CSRとは、SSL証明書を申請するためにCA(Certificate Authority - Let's Encrypt)に送るファイル(メッセージ)のことです。CSRには、SSL証明書を申請する人の会社名、所在地、ドメイン名などの詳細が記載されています。Let's EncryptはDV(Domain Validated)SSL証明書のみを発行しているため、生成されたSSL証明書にはドメイン名のみが検証され、そのドメイン名のみが記載されているほか、連絡先を記載するためのオプションのメールアドレスも記載されています。会社名や所在地などの詳細は含まれません。
ACME API Pythonの例
本記事シリーズでは、ACMEの各APIを、小さくてわかりやすいPythonプログラムで利用する方法をご紹介します。また、Alibaba Cloud APIを使ってDNSレコードの変更を自動化したり、Alibaba Cloudのサービス(API GatewayとCDN)にSSL証明書をインストールして、SSLで保護された各サービスのカスタムドメイン名を持つようにする方法もご紹介します。
必要な環境は以下の通りです。Python 3.6以降(Python 2には対応していません)
プラットフォーム:Windows 10 でテスト済み
Python ライブラリ:(テスト済みのバージョン)
1、暗号化バージョン2.2.2 (2018年3月27日)
2、pyOpenSSL バージョン18.0.0 (2018年5月16日)
3、リクエストバージョン2.19.1 (2018年6月14日)
プログラム:(テストされたバージョン)
1、Windows版Pythonバージョン3.6.5 (2018年3月28日)
2、https://slproweb.com/products/Win32OpenSSL.html">OpenSSL バージョン 1.1.1.0h for Windows (2018年3月27日)
ダウンロード:PythonでのACMEの例 (Zip - 20 KB)
注意: アンチウイルスソフトは、このダウンロードはPythonのソースコードを含むZIPファイルであるため、このダウンロードについての警告を表示します。
ACMEの例を使用する方法。
1、システム上に作業ディレクトリを作成します。
2、上記のパッケージをダウンロードしてください。
3、パッケージを作業ディレクトリに解凍します。
4、Let's Encrypt Account Keyを作成します - python make_account_key.py。
5、アカウント情報を表示する - python get_account-info.py。
6、記事のシリーズを読んで、ソースコードの例を勉強しましょう。
概要
アカウントキー、証明書キー、CSRを作成したら、Let's Encryptを通してSSL証明書を要求するために必要なものはすべて揃っています。Let's EncryptがSSL証明書を発行する前に、Let's Encryptはお客様がHTTP検証ファイルまたはDNS TXTレコードを介してドメイン名を管理していることを検証することで、お客様の証明書要求を検証する必要があります(Let's Encryptの用語ではオーダーと呼ばれています)。API GatewayなどのほとんどのクラウドサービスはHTTPファイルベースの検証をサポートしていないため、この記事シリーズの例ではDNSの検証のみをサポートしています。
今はPythonのセットアップ、必要なPythonパッケージ、ACMEサンプルのソースコードをダウンロードするのに良い時期でしょう。
シリーズのパート2では、アカウントキー、証明書キー、証明書署名要求(CSR)を作成し、Pythonで各ACME APIの作業を開始します。
アリババクラウドは日本に2つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
アリババクラウドジャパン公式ページ