トランスポート層セキュリティ
Wikipedia より:
- Transport Layer Security (TLS) およびその前身の Secure Sockets Layer (SSL) はコンピュータネットワークにおいてセキュリティを要求される通信を行うためのプロトコルである。ウェブブラウザやメール、インスタントメッセージ、voice over IP (VoIP) などのアプリケーションで幅広く使われているプロトコルとなっている。ウェブサイトは TLS によってサーバーとウェブブラウザ間の通信を暗号化できる。
目次
実装
TLS の実装は 5 種類あり、公式リポジトリで公開されています。OpenSSL は base メタパッケージの間接的な依存関係であるため、すでにシステムにインストールされているはずです(base > coreutils > openssl)。GnuTLS は多くのパッケージで必要とされているため、すでにシステムにインストールされている可能性があります。
- OpenSSL — 堅牢・商業品質・フル機能の TLS と SSL プロトコルのツールキット。汎用の暗号ライブラリでもあります。
- GnuTLS — TLS, SSL, DTLS プロトコルのフリーソフトウェア実装。X.509, PKCS #12, OpenPGP などの API を提供します。
- Network Security Services (NSS) — TLS/SSL と S/MIME をサポートする暗号ライブラリの実装。TLS アクセラレーションとスマートカードもサポート。
- mbed TLS — ポータブルな SSL/TLS 実装。別名 PolarSSL。
- LibreSSL — OpenBSD プロジェクトによって2014年に OpenSSL からフォークされた TLS/crypto スタック。コードベースを近代的に改修してセキュリティを向上させることを目標としています。
認証局
TLS では、一連の認証局(CA)の 1 つが、サーバーからの公開鍵証明書の信頼性をチェックし、署名します。TLS でサーバーに接続するクライアントは、CA の電子署名に依存して、その証明書の信頼性を確認することができます。電子署名を確認するために、クライアントは別の経路で取得し、自己署名証明書として保存された CA の公開鍵を持っている必要があります。Arch Linux では CA 証明書のデフォルトセットは ca-certificates パッケージで提供されています。
Arch Linux は CA 証明書を管理するために、システム全体の集中化されたインターフェースを提供します。このインターフェースは libp11-kit パッケージの /usr/lib/pkcs11/p11-kit-trust.so
というライブラリで、証明書のための PKCS #11 API を提供し、/usr/share/ca-certificates/trust-source/
("Default Trust" トークン) と /etc/ca-certificates/trust-source/
("System Trust" トークン) に格納されています。
コマンドラインからインターフェースを使用するために、p11-kit パッケージは trust(1) ユーティリティを提供します。
PKCS #11 に移植されておらず,CA 証明書の管理に独自の論理を使用している ライブラリのために、ca-certificates-utils パッケージは update-ca-trust(8) スクリプトを提供し, 集中管理インタフェースを通して得られた CA 証明書を /etc/ca-certificates/extracted/
と /etc/ssl/certs/
にコピーします。
CA 証明書のデフォルトセットをロードするためのメカニズムの概要
実装 | メカニズム | Arch Linux 設定 |
---|---|---|
OpenSSL | ハードコードされたディレクトリまたはファイルから証明書をロードする API 関数を提供するSSL_CTX_set_default_verify_paths(3)。 | デフォルトファイルは /etc/ssl/cert.pem です。デフォルトディレクトリは /etc/ssl/certs/ です。
|
GnuTLS | ハードコードされたディレクトリ、ファイル、または設定された PKCS #11 モジュールから証明書をロードする API 関数を提供する。最後のケースでは、ハードコードされた URL によって、任意の信頼できる証明書、または trust-policy: yes とマークされたモジュール上の信頼できる CA 証明書、オプションで追加のフィルタリング基準を持つ証明書をロードすることができます[1], [2]。
|
設定された PKCS #11 モジュールから、trust-policy: yes でマークされた、信頼できるすべての CA 証明書をロードします。
|
Network Security Services | 専用の API で管理されている PKCS#11 モジュールの動的に構成されたリストから証明書を自動的にロードします。構成は、ユーザーが指定した任意のディレクトリに保存できます。 [3], modutil(1). | |
mbed TLS | ユーザーは証明書をロードする必要があります。 [4]. | |
LibreSSL | ハードコードされたディレクトリまたはファイルから証明書をロードする API 関数を提供します。 libressl-SSL_CTX_load_verify_locations(3) | デフォルトのファイルは /etc/libressl/cert.pem で、デフォルトのディレクトリは /etc/libressl/certs/ です。
|
信頼管理
認証局のブラックリストを管理する方法はセキュリティ#SSL 証明書の管理を見てください。
システム全体で認証局を信頼
# trust anchor certificate.crt
上記は HTTPS MITM プロキシで通信を傍受するのに必要です。
証明書を取得
最初に RSA 秘密鍵を生成してください。鍵を生成する前に、umask でファイルモード作成マスクを制限的に (例えば 077
) 設定してください。
証明書は 証明書署名要求 (CSR) を使って認証局から取得するか、あるいは 自己署名 することができます。自己署名証明書は簡単に生成できますが、クライアントはデフォルトでは拒否するため、自己署名証明書を信頼するようにクライアントを設定する必要があります。
実際の生成コマンドは以下の実装の記事を見てください:
サーバーサイドの推奨事項
TLS に対する攻撃 は多数存在するため、ベストプラクティスに注意してください:
- SSLv3 を無効化 することで POODLE 攻撃を防ぐ。
- weakdh.org の TLS の Diffie-Hellman デプロイガイド
- Mozilla による Server Side TLS の記事
- SSL Labs の SSL と TLS デプロイベストプラクティス
- Cipherli.st
TLS のチェック
TLS をチェックするプログラム:
TLS をチェックするウェブサイト:
- https://dev.ssllabs.com/ssltest/ (HTTPS のみ)
- https://www.checktls.com/ (メールのみ)
- https://www.htbridge.com/ssl/ (任意ポート)
- https://tls.imirhil.fr/tls (任意ポート)
その他
ACME クライアント
Automated Certificate Management Environment (ACME) プロトコルは Let's Encrypt などの 認証局 から X.509 証明書をリクエストできるプロトコルです。
ACME クライアントの一覧 も参照してください。
- acme-client — C で書かれたセキュアな Let's Encrypt クライアント。
- https://kristaps.bsd.lv/acme-client/ || acme-clientAUR[リンク切れ: パッケージが存在しません]
- acme-tiny — Let's Encrypt から TLS 証明書を作成・更新するための200行の Python スクリプト。
- acme.sh — Unix シェルスクリプトだけで作られた ACME クライアント。
- acmetool — Go で書かれた使いやすい ACME CLI。
- Certbot — Python で書かれた、Let's Encrypt によって推奨されている ACME クライアント。
- dehydrated — Bash で書かれた ACME クライアント。
- getssl — Bash で書かれた ACME クライアント。
- https://github.com/srvrco/getssl || getsslAUR, getssl-gitAUR
- lego — Go で書かれた Lets Encrypt クライアントと ACME ライブラリ。
- letsencrypt-cli — もうひとつの Letsencrypt (ACME) クライアント。Ruby を使用。
- manuale — 完全手動の Let's Encrypt クライアント。Python で書かれています。
- ruby-acme-client — letsencrypt の ACME プロトコルの Ruby クライアント。
- simp_le — シンプルな Let's Encrypt クライアント。Python で書かれています。
オンラインのインタラクティブな、https://gethttpsforfree.com クライアントでは、ウェブページからシェルコマンドラインにコピーペーストして、10 回ほどやり直す必要があります。その間に推奨されるコマンドを実行します。また、おそらくそのページで手動更新をしなければならないでしょう。あるいは、他の方法で更新を行う必要があります。一方、あなたは、それが成功したかどうか、すべてのステップで見ることができます。証明書を要求するためだけにソフトウェアをインストールする必要はありません。そして、秘密鍵やサーバー・ソフトウェアを、完全に意識的にしか触れないようにすることができるようになります。
OCSP
Online Certificate Status Protocol (OCSP) は Firefox によってサポートされています。Chromium は独自のメカニズムを備えています [5]。
GnuTLS の ocsptool(1) や OpenSSL の ocsp(1ssl) も参照。
HSTS
HTTP Strict Transport Security (HSTS) メカニズムは Firefox, Chromium, wget (~/.wget-hsts
) によってサポートされています。
DNS CAA
See Wikipedia:DNS Certification Authority Authorization.