コード署名・証明書

iOS開発で頭を悩ます問題のひとつに、コード署名や証明書の問題がある。Code Signing Errorなどのような単語で検索すると、どのように問題を解決するのか、どのような手順で証明書を発行しXcodeに設定するのか、といった情報がたくさん返ってくる。しかし、コード署名とは何か、証明書とは何か、といった根本的な疑問に答えているサイトは少ないように思える。コード署名や証明書はチーム開発において致命的な問題につながることもあり、十分な理解の上で慎重に運用すべきものであると思う。

そこで、僕はこちらの本を読み、署名や証明書といったものを理解した。

暗号技術入門 第3版 秘密の国のアリス

暗号技術入門 第3版 秘密の国のアリス

本書ではiOS開発における署名や証明書についての記述はないが、自分の中でiOS開発におきかえて読んでいた。そこで得られた理解をここに書いておこうと思う。

まずコード署名とは、証明書を使ってアプリケーションにデジタル署名を施すことを指している。デジタル署名とは秘密鍵を使ってメッセージに施された署名のことで、署名は秘密鍵の対となる公開鍵を使って検証することができる。デジタル署名によって、メッセージが署名を施した人物のものであること、またメッセージが改ざんされていないことを保証することができる。

iOSアプリケーション開発の文脈では、開発したアプリケーションがAppleによって認証された開発者によるものであること、そして開発したアプリケーションが改ざんされていないことをコード署名によって保証していることになる。

一方、証明書とは認証局によってデジタル署名が施された公開鍵のことである。証明書を使わずに公開鍵の受け渡しを行う場合、man-in-the-middle攻撃という手法でなりすましされる危険性がある。攻撃者が公開鍵の受け渡しの間に入り、攻撃者の公開鍵を代わりに受け渡すという手口だ。こうした危険性を排除するため、公開鍵自体に認証情報が必要となる。そこで、認証局が電話番号などさまざまな情報を使って公開鍵を発行した主体を認証し、証明書を発行する。

iOSアプリケーション開発の文脈では、キーチェーンアクセス.appでCSRファイルというものを作成している。このファイルはコード署名の検証に利用する公開鍵と公開鍵を発行する主体の認証情報を含んでいる。このファイルをMember CenterにアップロードすることでAppleから証明書をダウンロードすることができる。

アプリケーションをApp Storeにアップロードする際、開発者は自身の秘密鍵を使ってコード署名を行い、Appleはアップロードされたアプリケーションを証明書に含まれる公開鍵で検証する。