apt-keyを使わないサードパーティーリポジトリからのパッケージのインストール方法

`apt-key`が廃止予定なのでその代替方法をまとめました。また、それに基づいたchromeのインストール方法と注意する点もメモしました。間違いや指摘あればコメントください。    

以下の記事を参考に情報をまとめました。

[第675回　apt-keyはなぜ廃止予定となったのか：Ubuntu Weekly Recipe｜gihyo.jp … 技術評論社](https://gihyo.jp/admin/serial/01/ubuntu-recipe/0675)  
[apt-key が非推奨になったので | Zenn](https://zenn.dev/spiegel/articles/20220508-apt-key-is-deprecated)  
[Dockerfile: 非推奨化されたapt-keyを置き換える｜TechRacho by BPS株式会社](https://techracho.bpsinc.jp/hachi8833/2022_01_11/114803)

今までサードパーティーリポジトリからパッケージをインストールする際は、`apt-key add`を用いてそのサードパーティーリポジトリの公開鍵を`/etc/apt/trusted.gpg`ファイルに追加していました。

これからは`/usr/local/share/keyrings`などに公開鍵をダウンロードし、検証することにするようです。

## apt-keyを使った今までのやり方

例えば、公式サイトや古い記事で、サードパーティーリポジトリからのインストール方法の案内にapt-keyを使った今までのやり方が次のように書いてあったとします。

まず、次のコマンドによって`/etc/apt/trusted.gpg`ファイルに公開鍵を追加します。

```shell-session
$ curl -sS [リポジトリの公開鍵ファイルのURL] | sudo apt-key add -
```

または`curl -sS`は`wget -qO -`で代替できるので次のコマンドでもいいようです。

```shell-session
$ wget -qO - [リポジトリの公開鍵ファイルのURL] | sudo apt-key add -
```

そしてリポジトリ情報を`/etc/apt/sources.list.d/`以下に保存します。

```shell-session
$ sudo echo "deb リポジトリのURI オプション" > /etc/apt/sources.list.d/パッケージ名.list
```

オプションにはリポジトリの構成に応じたオプションします。この部分はインストール方法の案内に書いてあります。よくあるのは`stable main`などです。

そして、次のコマンドでパッケージをインストールします。

```shell-session
$ sudo apt-get update
$ sudo apt-get install パッケージ名
```

具体例を挙げると、[yarnのインストール方法](https://classic.yarnpkg.com/lang/en/docs/install/#debian-stable)は2022/6/16現在、次のように書かれています。

```shell-session
$ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
$ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
$ sudo apt update
$ sudo apt install yarn
```

## apt-keyを使わないやり方

まず、`/usr/local/share/keyrings`ディレクトリを作成します。

```shell-session
$ mkdir /usr/local/share/keyrings
```

そしてサードパーティーリポジトリの公開鍵をダウンロードして、`gpg`でバイナリ形式に変換し、↑で作成したディレクトリに格納します。

```shell-session
$ curl -sS [リポジトリの公開鍵ファイルのURL] | sudo gpg --dearmor -o /usr/local/share/keyrings/パッケージ名-archive-keyring.gpg
```

そしてリポジトリ情報を`/etc/apt/sources.list.d/`以下に保存します。その際`deb`とリポジトリのURIの間に、↑でダウンロードしたgpgファイルの場所を`[signed-by=/usr/local/share/keyrings/パッケージ名-archive-keyring.gpg]`のように指定します。

```shell-session
$ sudo echo "deb [signed-by=/usr/local/share/keyrings/パッケージ名-archive-keyring.gpg] リポジトリのURI オプション" > /etc/apt/sources.list.d/パッケージ名.list
```

そして、次のコマンドでパッケージをインストールします。

```shell-session
$ sudo apt-get update
$ sudo apt-get install パッケージ名
```

例えば、先ほどのyarnのインストール方法は次のようになります。

```shell-session
$ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo gpg --dearmor -o /usr/local/share/keyrings/yarn-archive-keyring.gpg
$ echo "deb [signed-by=/usr/local/share/keyrings/yarn-archive-keyring.gpg] https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
$ sudo apt update
$ sudo apt install yarn
```
## Google Chromeのインストールについて
またapt-keyを使わずにGoogle Chromeインストールする方法は次のようになります。

```shell-session
$ curl -sS https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo gpg --dearmor -o /usr/local/share/keyrings/chrome-archive-keyring.gpg
$ echo "deb [signed-by=/usr/local/share/keyrings/chrome-archive-keyring.gpg] http://dl.google.com/linux/chrome/deb/ stable main" | sudo tee /etc/apt/sources.list.d/chrome.list
$ sudo apt update
$ sudo apt install google-chrome-stable
```

ただ、この方法でchromeをインストールすると、インストール後、chromeのリポジトリの公開鍵が`/etc/apt/trusted.gpg.d/google-chrome.gpg`として、リポジトリ情報が`/etc/apt/sources.list.d/google-chrome.list`としてファイルが勝手に新規作成され保存されます。このせいで、↑で自分で保存した公開鍵`/usr/local/share/keyrings/chrome-archive-keyring.gpg`とリポジトリ情報`/etc/apt/sources.list.d/chrome.list`と情報が競合し、次のように`apt-get update`や`apt list`など`apt`関係のコマンドがエラーになってしまいます。

```shell-session
$ apt-get update
E: Conflicting values set for option Signed-By regarding source http://dl.google.com/linux/chrome/deb/ stable: /usr/local/share/keyrings/chrome-archive-keyring.gpg != 
E: The list of sources could not be read
```

なので、Google Chromeをインストールしたら、次のように自分で保存した公開鍵とリポジトリ情報は削除しておきます。

```shell-session
$ sudo rm /usr/local/share/keyrings/chrome-archive-keyring.gpg
$ sudo rm /etc/apt/sources.list.d/chrome.list
```

↓のDbianのWikiによると、サードパーティリポジトリの公開鍵を保存するのに`/etc/apt/trusted.gpg.d/`は使ってはならないと書いてあるので、今後この動作は修正されるかもしれません。  
[DebianRepository/UseThirdParty - Debian Wiki](https://wiki.debian.org/DebianRepository/UseThirdParty#OpenPGP_Key_distribution)

# 補足メモ

## Ubuntuのリポジトリの基礎知識

APTについて理解を深めるためにUbuntuのリポジトリのWikiが参考になりました。  
[Repositories - Community Help Wiki](https://help.ubuntu.com/community/Repositories)  
[Repositories/CommandLine - Community Help Wiki](https://help.ubuntu.com/community/Repositories/CommandLine)

読んでみると、Ubuntu開発者としては、できるだけサードパーティーリポジトリを使ってほしくないことが分かります。サードパーティーリポジトリはスパイウェアだらけだとも言っています。  

>It's important to know that most of the tools you'll want to use in Ubuntu are already in Ubuntu's repositories. You can go search the internet for packages, or even source code, for others, but these will be more difficult to install and won't, most of the time, integrate as well with your system.  
>
>So now you know: no more endless searching looking for spyware-infested shareware and freeware. The vast majority of useful software available for Linux is pre-packaged for you.

## 手動で検証してみる。

[第675回　apt-keyはなぜ廃止予定となったのか：Ubuntu Weekly Recipe｜gihyo.jp … 技術評論社](https://gihyo.jp/admin/serial/01/ubuntu-recipe/0675)

↑の記事にあるようにAPTはGPGを用いて公開鍵でリポジトリを検証しています。この記事では`gpgv`コマンドを使って、手動で検証する方法も紹介しています。

ただ、その際使用する`InRelease`ファイルの場所が載っていませんでした。

調べてみると、`InRelease`ファイルの場所は下記記事に載っていました。

[DebianRepository/Format - Debian Wiki](https://wiki.debian.org/DebianRepository/Format?action=show&redirect=RepositoryFormat)  
日本語解説が
[メモ：Debianレポジトリのフォーマット - Technically, technophobic.](https://notchained.hatenablog.com/entry/2016/06/10/234449)にあります。

つまり、`source.list`の記載が

```
deb http://example.com ubuntu main
```
であれば、`InRelease`ファイルは`http://example.com/dists/ubuntu/InRelease`にあります。

```
deb http://example.com main
```

であれば、`InRelease`ファイルは`http://example.com/InRelease`にあります。

つまり、`InRelease`ファイルは、yarnであれば`https://dl.yarnpkg.com/debian/dists/stable/InRelease`で、google-chromeであれば`http://dl.google.com/linux/chrome/deb/dists/stable/InRelease`です。

なので、下記コマンドで`InReleas`ファイルをダウンロードすることができます。

```shell-session
$ wget https://dl.yarnpkg.com/debian/dists/stable/InRelease
```

## debファイルでの直接インストール

例えばchromeであれば、`https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb`をダウンロードして`apt install debファイル`で直接インストールできますが、依存するパッケージは自動的にはインストールしてくれないようです。

↑のgpgで公開鍵を保存して、aptでインストールする方法であれば依存するパッケージも自動的にダウンロードしてくれるようです。  
(または、`gdebi`というパッケージを使えば依存関係を解決できるようです。)