この記事の要点
- 2 つの新しいオープンソース Swift パッケージ Swift Certificates(swift-certificates)と Swift ASN.1(swift-asn1)が発表されました。TLS のセキュリティを支える X.509 証明書を、より高速かつ安全に扱うための実装を提供します。
- Swift ASN.1 は、ASN.1 の基本的な型と DER のシリアライズ・デシリアライズを、低オーバーヘッドでメモリ安全に実装したパッケージです。X.509 証明書をはじめとする暗号関連のユースケースの土台になります。
- Swift Certificates は X.509 証明書を扱うパッケージで、発表時点では早期段階としてコミュニティからのフィードバックを得るために公開されました。RFC 5280 準拠の証明書のパース、証明書チェーンの構築、検証ポリシーや OCSP 解決の差し替えに対応します。
- いずれもメモリ安全な Swift ネイティブ実装である点が大きな特徴で、信頼できない入力をパースする証明書まわりの攻撃面を、メモリ安全性の問題から守ることを狙っています。
何が発表されたのか
Swift Certificates と Swift ASN.1 は、X.509 証明書を扱うための新しい Swift パッケージです。
X.509 証明書は、システム内のアクター(actor)の身元を暗号的に証明するために広く使われる形式で、公開鍵基盤(PKI: Public Key Infrastructure)を定義する X.509 標準の一部です。Certificate Authority と呼ばれる少数の信頼された主体に身元証明の権限を委ねる仕組みで、私たちが最もよく目にするのは TLS 証明書としての利用ですが、コード署名やトークン交換など用途は多岐にわたります。サーバーサイドアプリケーションでは、ネットワーク接続を保護するための TLS 証明書の読み込みをはじめ、ACME による TLS 証明書の動的なプロビジョニングや x5c による身元検証など、X.509 を扱う場面が頻繁にあります。そのため、機能の揃った X.509 ライブラリはサーバーサイドのエコシステムにとって強力な資産になります。
この X.509 証明書の構造は、ASN.1(Abstract Syntax Notation One) というデータ型定義言語で記述されています。ASN.1 は非常に柔軟で複雑な言語で、型の定義方法とは別に、その型をバイト列へ変換する「encoding rules(符号化規則)」が複数存在します。暗号関連のユースケースの大半は、その中でも DER(Distinguished Encoding Rules) または BER(Basic Encoding Rules)を使います。X.509 証明書は ASN.1 で定義され DER でシリアライズされるため、強力で安全な Swift ネイティブの X.509 ライブラリを提供するには、その土台となる ASN.1 ライブラリも必要になります。これが 2 つのパッケージに分かれている理由です。
何に使えるのか
Swift ASN.1
Swift ASN.1 は、主に次の 2 つの機能を提供します。
- ASN.1 でよく使われる基本的な型(currency types)の実装
- DER のシリアライズとデシリアライズの実装
これだけで、Swift Certificates を含む DER 向けの暗号ユースケースの大半をカバーできます。
ASN.1 パーサーの重要な役割は、信頼できないユーザー入力をパースすることです。この処理におけるメモリ安全性のバグは、しばしば深刻度の高い脆弱性につながります。Swift ASN.1 は、こうしたセキュリティ上重要なパース・シリアライズを、低オーバーヘッドかつ完全にメモリ安全なコードで提供する点に価値があります。
Swift Certificates
Swift Certificates は早期段階で公開されたため、広く使うために必要な機能の一部はまだ揃っていません。発表時点では次のことができます。
- Web PKI で使われ、RFC 5280 に準拠する大半の X.509 証明書のパース
- X.509 のチェーン構築
- 差し替え可能な X.509 検証ポリシーのサポート
- 差し替え可能な OCSP 解決のサポート
バージョン 1.0 は、Web PKI のユースケースを安全に支えられる十分に堅牢な X.509 検証器が用意できた時点でのリリースが予定されています。
導入・今後の位置づけ
中期的な目標として、swift-nio-ssl が使っている BoringSSL ベースの X.509 実装を Swift Certificates に置き換えることが挙げられています。これが実現すれば、TLS を使うすべてのアプリケーションの性能が大きく改善し、広い攻撃面にメモリ安全性がもたらされると期待されています。あわせて、証明書発行サービスとのより自動化されたやり取りを可能にするため、Certificate Signing Request(CSR)のサポートを追加する意向も示されています。これらは将来の構想であり、実現を約束するものではありません。
いずれのパッケージもオープンソースプロジェクトとして GitHub 上で開発されています。リポジトリの issue やプルリクエストを確認し、実際にコードを使ってフィードバックを返すことが呼びかけられています。