apt-key/add-apt-repositoryを使わずにパッケージをインストール


# 背景
`apt-key` が deprecated になったので 、今後推奨となる方法を示す。

# 概要
- 手順概要
    - `/etc/apt/keyrings/` にレポジトリの公開鍵 (asc や gpg) を保存する。
    - `/etc/sources.list.d/` にレポジトリの参照先情報を保存する。
        - このとき、`signed-by` で保存した公開鍵を指定する。
- 今回は [ppa:nginx/stable](https://launchpad.net/~nginx/+archive/ubuntu/stable) をインストールする。
    - ppa 以外のレポジトリでも、公開鍵と参照先情報があれば同じ手順が使える。
- ppa のサイトから必要な情報をメモ (画像参照)
    - 接続先情報: `deb https://ppa.launchpadcontent.net/nginx/stable/ubuntu focal main 
`
    - fingerprint: `8B3981E7A6852F782CC4951600A6F0A3C300EE8C`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101023/b5e90629-cc4b-53c9-4369-6e2e2da3b116.png)

# 手順
## `/etc/apt/keyrings/` にレポジトリの公開鍵 (asc や gpg) を保存
```
sudo mkdir /etc/apt/keyrings/
sudo curl 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x8b3981e7a6852f782cc4951600a6f0a3c300ee8c' -o /etc/apt/keyrings/nginx-ubuntu-stable-focal.asc
```
- fingerprint:
    - `8B3981E7A6852F782CC4951600A6F0A3C300EE8C`
- 公開鍵の url:
    - `https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x8b3981e7a6852f782cc4951600a6f0a3c300ee8c`
- 公開鍵の保存先:
    - `/etc/apt/keyrings/nginx-ubuntu-stable-focal.asc`

## `/etc/apt/sources.list.d/` にレポジトリの参照先を保存
```
echo deb [signed-by=/etc/apt/keyrings/nginx-ubuntu-stable-focal.asc] https://ppa.launchpadcontent.net/nginx/stable/ubuntu focal main | sudo tee /etc/apt/sources.list.d/nginx-ubuntu-stable-focal.list >/dev/null
```
- 公開鍵の場所:
    - `/etc/apt/keyrings/nginx-ubuntu-stable-focal.asc`
- 接続先情報:
    - `deb https://ppa.launchpadcontent.net/nginx/stable/ubuntu focal main`
- 接続先情報の保存先:
    - `/etc/apt/sources.list.d/nginx-ubuntu-stable-focal.list`

## インストール
```
sudo apt update && sudo apt install -y nginx
```

:::note info
ポイント
apt update で失敗する場合、ファイル/ディレクトリの owner/group/permission を確認する。
以下以外では動かない可能性がある。
- owner/group: `root:root`
- permission: dir=755, file=644
- 対象: 公開鍵、参照先情報、それらの親ディレクトリ
また、後述のメモの情報を使ってデバッグしてみる。
:::

# その他メモ
```:apt update (nginx-ubuntu-stable-focal.list のみ)
$ sudo apt-get update -o APT::Get::List-Cleanup=0 -o Dir::Etc::sourceparts=- -o Dir::Etc::sourcelist=sources.list.d/nginx-ubuntu-stable-focal.list
Hit:1 https://ppa.launchpadcontent.net/nginx/stable/ubuntu focal InRelease
Reading package lists... Done
```

```:my.asc を my.gpg に変換
$ gpg --no-default-keyring --keyring ./my.gpg --import ./my.asc
gpg: keybox './my.gpg' created
gpg: key 00A6F0A3C300EE8C: 1 signature not checked due to a missing key
gpg: key 00A6F0A3C300EE8C: public key "Launchpad Stable" imported
gpg: Total number processed: 1
gpg:               imported: 1
gpg: no ultimately trusted keys found
```

```:my.gpg を確認
$ gpg --no-default-keyring --keyring ./my.gpg --list-keys
./my.gpg
--------
pub   rsa1024 2010-07-21 [SC]
      8B3981E7A6852F782CC4951600A6F0A3C300EE8C
uid           [ unknown] Launchpad Stable
```

```:my.gpg で apt update 時の鍵検証を手動でやる
$ wget -q https://ppa.launchpadcontent.net/nginx/stable/ubuntu/dists/focal/InRelease
$ gpgv --keyring ./my.gpg ./InRelease
gpgv: can't allocate lock for './my.gpg'
gpgv: Signature made Wed 21 Oct 2020 12:51:01 PM UTC
gpgv:                using RSA key 00A6F0A3C300EE8C
gpgv: Good signature from "Launchpad Stable"
```

# 参考
- 第675回　apt-keyはなぜ廃止予定となったのか | gihyo.jp
    - https://gihyo.jp/admin/serial/01/ubuntu-recipe/0675
 - apt-key が非推奨になったので
    - https://zenn.dev/spiegel/articles/20220508-apt-key-is-deprecated