💭

trust anchor コマンドと update-ca-trust コマンドの違いについて

2023/11/03に公開

Fedora38 Server に証明書を追加する際、trust コマンドまたは update-ca-trust コマンドを使いますが、それぞれの役割や機能について理解できていなかったので調査しました。

統合されたシステム全体のトラストストア

RHEL のドキュメントを参考にすると、システム全体のトラストストアは以下の2つ存在することが分かります。

  • /etc/pki/ca-trust/
  • /usr/share/pki/ca-trust-source/

証明書は、上記のディレクトリにインストールされる様です。

まずは優先順位の高い /etc の方から内容を確認してみます。extractedsource というディレクトリがあります。

ls -l /etc/pki/ca-trust/
#-rw-r--r--. 1 root root 980 Aug  1 09:00 ca-legacy.conf
#drwxr-xr-x. 6 root root  70 Nov  3 14:26 extracted
#-rw-r--r--. 1 root root 166 Aug  1 09:00 README
#drwxr-xr-x. 5 root root  97 Nov  3 14:27 source

次に、優先順位の低い /usr の方を見てみます。/etc の配下と同じ役割のディレクトリであるにも関わらず、内容物は全く異なります。

ls -l /usr/share/pki/ca-trust-source/
#drwxr-xr-x. 2 root root       6 Aug  1 09:00 anchors
#drwxr-xr-x. 2 root root       6 Aug  1 09:00 blacklist
#drwxr-xr-x. 2 root root       6 Aug  1 09:00 blocklist
#-rw-r--r--. 1 root root 2339585 Aug  1 09:00 ca-bundle.trust.p11-kit
#-rw-r--r--. 1 root root     937 Aug  1 09:00 README

実は /etc/ の配下にも同様の構成がありました。source ディレクトリが共通している様です。

ls -l /etc/pki/ca-trust/source/
#drwxr-xr-x. 2 root root   6 Aug  1 09:00 anchors
#drwxr-xr-x. 2 root root   6 Aug  1 09:00 blacklist
#drwxr-xr-x. 2 root root   6 Aug  1 09:00 blocklist
#lrwxrwxrwx. 1 root root  59 Nov  3 14:27 ca-bundle.legacy.crt -> /usr/share/pki/ca-trust-legacy/ca-bundle.legacy.default.crt
#-rw-r--r--. 1 root root 932 Aug  1 09:00 README

自己署名証明書の作成

動作を確認するための証明書を作成します。検証なので自己署名で作成します。いくつか質問されますが、適当に回答します。

openssl genrsa 2048 > private.key
openssl req -new -x509 -days 3650 -key private.key -sha512 -out server.crt
#You are about to be asked to enter information that will be incorporated
#into your certificate request.
#What you are about to enter is what is called a Distinguished Name or a DN.
#There are quite a few fields but you can leave some blank
#For some fields there will be a default value,
#If you enter '.', the field will be left blank.
#-----
#Country Name (2 letter code) [XX]:JA
#State or Province Name (full name) []:osaka
#Locality Name (eg, city) [Default City]:osaka
#Organization Name (eg, company) [Default Company Ltd]:asterisk
#Organizational Unit Name (eg, section) []:home
#Common Name (eg, your name or your server's hostname) []:www
#Email Address []:

作成した証明書を確認します。PEM 形式の証明書データです。

file server.crt
#server.crt: PEM certificate
cat server.crt
#-----BEGIN CERTIFICATE-----
#MIIDmzCCAoOgAwIBAgIUT/QClhntGlbKSKXvplivexmEOzIwDQYJKoZIhvcNAQEN
#BQAwXTELMAkGA1UEBhMCSkExDjAMBgNVBAgMBW9zYWthMQ4wDAYDVQQHDAVvc2Fr
#YTERMA8GA1UECgwIYXN0ZXJpc2sxDTALBgNVBAsMBGhvbWUxDDAKBgNVBAMMA3d3
#dzAeFw0yMzExMDMwNjAzNDZaFw0zMzEwMzEwNjAzNDZaMF0xCzAJBgNVBAYTAkpB
#MQ4wDAYDVQQIDAVvc2FrYTEOMAwGA1UEBwwFb3Nha2ExETAPBgNVBAoMCGFzdGVy
#aXNrMQ0wCwYDVQQLDARob21lMQwwCgYDVQQDDAN3d3cwggEiMA0GCSqGSIb3DQEB
#AQUAA4IBDwAwggEKAoIBAQCgm2ImezVrDle27BmrzaTK6a0Ucgx00nqLj/wlkcsb
#Iykt7020DVmCiQ0eaxslWcDKkCzB4OTC7VrvvX2jzffy6lPGI9Qzo2D787akSTB6
#q9kI2q8aSvHovU8AGBwjDDxz9JRXP7Jf4RhLlxczCrFI9FuG3N5t19s8iig4n/VO
#EzB3M2WfQoAo2zzayArbeY0e61AYLkTM8rYlWQRYy9ctSnvglcBrhtnQUaw1HAZg
#rrt4YpeXgOkm5DjRiHKCP0G09jL3qRu+OVqBm8iKXmnenzTjv5dbeYVivWxL+c/M
#xy7EnMZExQ6uML8Ub6dSMq0HgqdNKhpOYWzzbUeBaLPrAgMBAAGjUzBRMB0GA1Ud
#DgQWBBTsUjWKPrTfXmqkkOFq2cV2H3e0TTAfBgNVHSMEGDAWgBTsUjWKPrTfXmqk
#kOFq2cV2H3e0TTAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDQUAA4IBAQBl
#fjvu7+vQDt7LJcE4WDqDLU8HR5oCcDWVK0JOWdKTfM6Sfhr+MEJtW9DMy4cj/WK3
#aWuGx4otTvunR3YDlVSGksJfzzKbun/+NzYx20H4q9Q4tdA9QCzeGpf9LV/9ykup
#GvOF0Uxg1Abroi3AfYaQbD1/uT/GJInb3cBKKWbNF7Y3nuqMHu7WVbPvcG8IW2CR
#+YIruJz18kr531kiCDviSbAJZOVUWTIsaPUwZB/3JrS+f1XNkXFhC0E9NCjlDxXD
#B+iD6iXnchYHyhWkSg2UCmNU6LPnxNO+n0iPkHAcstg/2EeUj36xST0vNNeDm6Zh
#EEpQBuYZ8CC/O5XgNXIc
#-----END CERTIFICATE-----

証明書の内容は以下のように確認できます。証明書の有効期限(Not BeforeNot After)などは気になることが多いです。何も指定しないと 10 年になるんですね。

openssl x509 -in server.crt -noout -text
#Certificate:
#    Data:
#        Version: 3 (0x2)
#        Serial Number:
#            4f:f4:02:96:19:ed:1a:56:ca:48:a5:ef:a6:58:af:7b:19:84:3b:32
#        Signature Algorithm: sha512WithRSAEncryption
#        Issuer: C = JA, ST = osaka, L = osaka, O = asterisk, OU = home, CN = www
#        Validity
#            Not Before: Nov  3 06:03:46 2023 GMT
#            Not After : Oct 31 06:03:46 2033 GMT
#        Subject: C = JA, ST = osaka, L = osaka, O = asterisk, OU = home, CN = www
#        Subject Public Key Info:
#            Public Key Algorithm: rsaEncryption
#                Public-Key: (2048 bit)
#                Modulus:
#                    00:a0:9b:62:26:7b:35:6b:0e:57:b6:ec:19:ab:cd:
#                    a4:ca:e9:ad:14:72:0c:74:d2:7a:8b:8f:fc:25:91:
#                    cb:1b:23:29:2d:ef:4d:b4:0d:59:82:89:0d:1e:6b:
#                    1b:25:59:c0:ca:90:2c:c1:e0:e4:c2:ed:5a:ef:bd:
#                    7d:a3:cd:f7:f2:ea:53:c6:23:d4:33:a3:60:fb:f3:
#                    b6:a4:49:30:7a:ab:d9:08:da:af:1a:4a:f1:e8:bd:
#                    4f:00:18:1c:23:0c:3c:73:f4:94:57:3f:b2:5f:e1:
#                    18:4b:97:17:33:0a:b1:48:f4:5b:86:dc:de:6d:d7:
#                    db:3c:8a:28:38:9f:f5:4e:13:30:77:33:65:9f:42:
#                    80:28:db:3c:da:c8:0a:db:79:8d:1e:eb:50:18:2e:
#                    44:cc:f2:b6:25:59:04:58:cb:d7:2d:4a:7b:e0:95:
#                    c0:6b:86:d9:d0:51:ac:35:1c:06:60:ae:bb:78:62:
#                    97:97:80:e9:26:e4:38:d1:88:72:82:3f:41:b4:f6:
#                    32:f7:a9:1b:be:39:5a:81:9b:c8:8a:5e:69:de:9f:
#                    34:e3:bf:97:5b:79:85:62:bd:6c:4b:f9:cf:cc:c7:
#                    2e:c4:9c:c6:44:c5:0e:ae:30:bf:14:6f:a7:52:32:
#                    ad:07:82:a7:4d:2a:1a:4e:61:6c:f3:6d:47:81:68:
#                    b3:eb
#                Exponent: 65537 (0x10001)
#        X509v3 extensions:
#            X509v3 Subject Key Identifier:
#                EC:52:35:8A:3E:B4:DF:5E:6A:A4:90:E1:6A:D9:C5:76:1F:77:B4:4D
#            X509v3 Authority Key Identifier:
#                EC:52:35:8A:3E:B4:DF:5E:6A:A4:90:E1:6A:D9:C5:76:1F:77:B4:4D
#            X509v3 Basic Constraints: critical
#                CA:TRUE
#    Signature Algorithm: sha512WithRSAEncryption
#    Signature Value:
#        65:7e:3b:ee:ef:eb:d0:0e:de:cb:25:c1:38:58:3a:83:2d:4f:
#        07:47:9a:02:70:35:95:2b:42:4e:59:d2:93:7c:ce:92:7e:1a:
#        fe:30:42:6d:5b:d0:cc:cb:87:23:fd:62:b7:69:6b:86:c7:8a:
#        2d:4e:fb:a7:47:76:03:95:54:86:92:c2:5f:cf:32:9b:ba:7f:
#        fe:37:36:31:db:41:f8:ab:d4:38:b5:d0:3d:40:2c:de:1a:97:
#        fd:2d:5f:fd:ca:4b:a9:1a:f3:85:d1:4c:60:d4:06:eb:a2:2d:
#        c0:7d:86:90:6c:3d:7f:b9:3f:c6:24:89:db:dd:c0:4a:29:66:
#        cd:17:b6:37:9e:ea:8c:1e:ee:d6:55:b3:ef:70:6f:08:5b:60:
#        91:f9:82:2b:b8:9c:f5:f2:4a:f9:df:59:22:08:3b:e2:49:b0:
#        09:64:e5:54:59:32:2c:68:f5:30:64:1f:f7:26:b4:be:7f:55:
#        cd:91:71:61:0b:41:3d:34:28:e5:0f:15:c3:07:e8:83:ea:25:
#        e7:72:16:07:ca:15:a4:4a:0d:94:0a:63:54:e8:b3:e7:c4:d3:
#        be:9f:48:8f:90:70:1c:b2:d8:3f:d8:47:94:8f:7e:b1:49:3d:
#        2f:34:d7:83:9b:a6:61:10:4a:50:06:e6:19:f0:20:bf:3b:95:
#        e0:35:72:1c

trust コマンド

trust list でシステムにインストールされている証明書一覧が参照できます。

trust list
#pkcs11:id=%42%3D%2B%24%A6%C1%45%CE;type=cert
#    type: certificate
#    label: A-Trust-Qual-02
#    trust: anchor
#    category: authority
#
#pkcs11:id=%46%06%DF%37%F2%C2%37%10;type=cert
#    type: certificate
#    label: A-Trust-Qual-03
#    trust: anchor
#    category: authority
#
#pkcs11:id=%40%F9%B9%67%BE%03%D2%08;type=cert
#    type: certificate
#    label: A-Trust-Root-05
#    trust: anchor
#    category: authority
#
#...

詳細が確認したければ trust dump で詳細な一覧が参照できます。インストールされている証明書が PEM 形式で出力されます。付随するメタデータも表示されます。

trust dump
## pkcs11:
#[p11-kit-object-v1]
#class: nss-builtin-root-list
#private: false
#label: "Trust Anchor Roots"
#modifiable: false
#
#
## pkcs11:
#[p11-kit-object-v1]
#class: nss-builtin-root-list
#private: false
#label: "Trust Anchor Roots"
#modifiable: false
#
#
## pkcs11:id=%57%38%74%BE%5C%36%85%F4%C8%A9%A5%93%87%D5%90%36%2B%A5%93%19
#[p11-kit-object-v1]
#class: x-certificate-extension
#private: false
#label: "A-Trust-Qual-02"
#value: "0%16%06%03U%1D%25%01%01%FF%04%0C0%0A%06%08%2B%06%01%05%05%07%03%03"
#object-id: 2.5.29.37
#id: "W8t%BE%5C6%85%F4%C8%A9%A5%93%87%D5%906%2B%A5%93%19"
#modifiable: false
#-----BEGIN PUBLIC KEY-----
#MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlpGr146wWbgBvbQerZn9
#ofzqDJZrjy5JSNjp5CSC4di6zOveB1xIxhmCAUdCCeF8uZ+uj/buXmuoqFaIOFaz
#5v7JnU80OFE8nL7zrJwcyD1cmoSu95QsFLJkN2COFLA7Ks2JtSKv9+R/7iwrM/mO
#PK1MolcP+4LFjh8B31OMwRWk3e6akhLSKOliFyVgMe/PMZTzffPkPCGrkPxtz2On
#xhIAcUnXHMig7WOafeOPKN1g+djmFqsm0dAvvecNCd9u1OzlOFP0ZAu6WsyAtThZ
#7IBZZYQxal9VkUwk5SSag4R6voDx7l8gB6p3F2wL4lWqlngIAp6X8CuuWPWAUD/+
#OwIDAQAB
#-----END PUBLIC KEY-----
#
#...

証明書をインストールするには trust anchor コマンドを使います。

trust anchor server.crt

証明書がインストールされたことを確認します。

trust list | grep -C 3 www
#pkcs11:id=%EC%52%35%8A%3E%B4%DF%5E%6A%A4%90%E1%6A%D9%C5%76%1F%77%B4%4D;#type=cert
#    type: certificate
#    label: www
#    trust: anchor
#    category: authority

trust dump | grep -A 10 "pkcs11:id=%EC%52%35%8A%3E%B4%DF%5E%6A%A4%90%E1%6A%D9%C5%76%1F%77%B4%4D;type=cert"
## pkcs11:id=%EC%52%35%8A%3E%B4%DF%5E%6A%A4%90%E1%6A%D9%C5%76%1F%77%B4%4D;#type=cert
#[p11-kit-object-v1]
#private: false
#label: "www"
#issuer: #"0%5D1%0B0%09%06%03U%04%06%13%02JA1%0E0%0C%06%03U%04%08%0C%05osaka1%0E0%0C%06#%03U%04%07%0C%05osaka1%110%0F%06%03U%04%0A%0C%08asterisk1%0D0%0B%06%03U%04%0B#%0C%04home1%0C0%0A%06%03U%04%03%0C%03www"
#serial-number: "%02%14O%F4%02%96%19%ED%1AV%CAH%A5%EF%A6X%AF%7B%19%84%3B2"
#trusted: true
#certificate-category: authority
#java-midp-security-domain: 0
#url: ""
#hash-of-subject-public-key: #"%D7%3DF%0EA%24%E7%C9%90%80Q%A4%8A%FC%09%3C%10I%F2%06"

/etc/ 配下の source ディレクトリに、.p11-kit ファイルが追加されていることが分かります。

ls -l /etc/pki/ca-trust/source/
#drwxr-xr-x. 2 root root    6 Aug  1 09:00 anchors
#drwxr-xr-x. 2 root root    6 Aug  1 09:00 blacklist
#drwxr-xr-x. 2 root root    6 Aug  1 09:00 blocklist
#lrwxrwxrwx. 1 root root   59 Nov  3 14:27 ca-bundle.legacy.crt -> /usr/share/pki/ca-trust-legacy/ca-bundle.legacy.default.crt
#-rw-r--r--. 1 root root  932 Aug  1 09:00 README
#-r--r--r--. 1 root root 2582 Nov  3 15:20 www.p11-kit

内容を確認すると trust dump と似たような形式になっています。下の方には PEM ファイルの内容がそのまま残っており、PEM ファイルにヘッダ情報が付加された形式のように見えます。

cat /etc/pki/ca-trust/source/www.p11-kit
#[p11-kit-object-v1]
#trusted: true
#x-distrusted: false
#private: false
#modifiable: false
#label: "www"
#url: ""
#hash-of-issuer-public-key: ""
#hash-of-subject-public-key: "%D7%3DF%0EA%24%E7%C9%90%80Q%A4%8A%FC%09%3C%10I%F2%06"
#java-midp-security-domain: 0
#check-value: "2N%AC"
#start-date: "20231103"
#end-date: "20331031"
#id: "%ECR5%8A%3E%B4%DF%5Ej%A4%90%E1j%D9%C5v%1Fw%B4M"
#subject: #"0%5D1%0B0%09%06%03U%04%06%13%02JA1%0E0%0C%06%03U%04%08%0C%05osaka1%0E0%0C%06%03U%04%07%0C%05osaka1%110%0F%06%03U%04%0A%0C%08asterisk1%0D0%0B%06%03U%04%0B%0C%04home1%0C0%0A%#06%03U%04%03%0C%03www"
#issuer: #"0%5D1%0B0%09%06%03U%04%06%13%02JA1%0E0%0C%06%03U%04%08%0C%05osaka1%0E0%0C%06%03U%04%07%0C%05osaka1%110%0F%06%03U%04%0A%0C%08asterisk1%0D0%0B%06%03U%04%0B%0C%04home1%0C0%0A%#06%03U%04%03%0C%03www"
#serial-number: "%02%14O%F4%02%96%19%ED%1AV%CAH%A5%EF%A6X%AF%7B%19%84%3B2"
#certificate-category: authority
#-----BEGIN CERTIFICATE-----
#MIIDmzCCAoOgAwIBAgIUT/QClhntGlbKSKXvplivexmEOzIwDQYJKoZIhvcNAQEN
#BQAwXTELMAkGA1UEBhMCSkExDjAMBgNVBAgMBW9zYWthMQ4wDAYDVQQHDAVvc2Fr
#YTERMA8GA1UECgwIYXN0ZXJpc2sxDTALBgNVBAsMBGhvbWUxDDAKBgNVBAMMA3d3
#dzAeFw0yMzExMDMwNjAzNDZaFw0zMzEwMzEwNjAzNDZaMF0xCzAJBgNVBAYTAkpB
#MQ4wDAYDVQQIDAVvc2FrYTEOMAwGA1UEBwwFb3Nha2ExETAPBgNVBAoMCGFzdGVy
#aXNrMQ0wCwYDVQQLDARob21lMQwwCgYDVQQDDAN3d3cwggEiMA0GCSqGSIb3DQEB
#AQUAA4IBDwAwggEKAoIBAQCgm2ImezVrDle27BmrzaTK6a0Ucgx00nqLj/wlkcsb
#Iykt7020DVmCiQ0eaxslWcDKkCzB4OTC7VrvvX2jzffy6lPGI9Qzo2D787akSTB6
#q9kI2q8aSvHovU8AGBwjDDxz9JRXP7Jf4RhLlxczCrFI9FuG3N5t19s8iig4n/VO
#EzB3M2WfQoAo2zzayArbeY0e61AYLkTM8rYlWQRYy9ctSnvglcBrhtnQUaw1HAZg
#rrt4YpeXgOkm5DjRiHKCP0G09jL3qRu+OVqBm8iKXmnenzTjv5dbeYVivWxL+c/M
#xy7EnMZExQ6uML8Ub6dSMq0HgqdNKhpOYWzzbUeBaLPrAgMBAAGjUzBRMB0GA1Ud
#DgQWBBTsUjWKPrTfXmqkkOFq2cV2H3e0TTAfBgNVHSMEGDAWgBTsUjWKPrTfXmqk
#kOFq2cV2H3e0TTAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDQUAA4IBAQBl
#fjvu7+vQDt7LJcE4WDqDLU8HR5oCcDWVK0JOWdKTfM6Sfhr+MEJtW9DMy4cj/WK3
#aWuGx4otTvunR3YDlVSGksJfzzKbun/+NzYx20H4q9Q4tdA9QCzeGpf9LV/9ykup
#GvOF0Uxg1Abroi3AfYaQbD1/uT/GJInb3cBKKWbNF7Y3nuqMHu7WVbPvcG8IW2CR
#+YIruJz18kr531kiCDviSbAJZOVUWTIsaPUwZB/3JrS+f1XNkXFhC0E9NCjlDxXD
#B+iD6iXnchYHyhWkSg2UCmNU6LPnxNO+n0iPkHAcstg/2EeUj36xST0vNNeDm6Zh
#EEpQBuYZ8CC/O5XgNXIc
#-----END CERTIFICATE-----

このとき、extracted ディレクトリも更新されていることが分かります(先程追加された .p11-kit ファイルと更新日時が同じ)。trust コマンドで証明書を追加する際に、source ディレクトリ(システム全体のトラストストア)を元に再構成されていると思われます。ディレクトリ名がアプリケーションの名前になっているので、各アプリケーションから参照される証明書ストアと、システム全体のトラストストアと同期するための仕組みだと思われます。

ls -l /etc/pki/ca-trust/extracted/
#drwxr-xr-x. 2 root root  39 Nov  3 15:20 edk2
#drwxr-xr-x. 2 root root  35 Nov  3 15:20 java
#drwxr-xr-x. 2 root root  47 Nov  3 15:20 openssl
#drwxr-xr-x. 3 root root 123 Nov  3 15:20 pem
#-rw-r--r--. 1 root root 560 Aug  1 09:00 README

ls -l /etc/pki/ca-trust/extracted/edk2/
#-r--r--r--. 1 root root 162230 Nov  3 15:20 cacerts.bin
#-rw-r--r--. 1 root root    566 Aug  1 09:00 README

ls -l /etc/pki/ca-trust/extracted/java/
#-r--r--r--. 1 root root 162772 Nov  3 15:20 cacerts
#-rw-r--r--. 1 root root    726 Aug  1 09:00 README

ls -l /etc/pki/ca-trust/extracted/openssl/
#-r--r--r--. 1 root root 624816 Nov  3 15:20 ca-bundle.trust.crt
#-rw-r--r--. 1 root root    787 Aug  1 09:00 README

ls -l /etc/pki/ca-trust/extracted/pem/
#dr-xr-xr-x. 2 root root  16384 Nov  3 15:20 directory-hash
#-r--r--r--. 1 root root 171543 Nov  3 15:20 email-ca-bundle.pem
#-r--r--r--. 1 root root 496846 Nov  3 15:20 objsign-ca-bundle.pem
#-rw-r--r--. 1 root root    898 Aug  1 09:00 README
#-r--r--r--. 1 root root 223399 Nov  3 15:20 tls-ca-bundle.pem

証明書をアンインストールするには以下のコマンドを使います。

trust anchor --remove server.crt

trust list および trust dump コマンドの結果および .p11-kit ファイルも削除されました。

trust list | grep -C 3 www
trust dump | grep -A 10 "pkcs11:id=%EC%52%35%8A%3E%B4%DF%5E%6A%A4%90%E1%6A%D9%C5%76%1F%77%B4%4D;type=cert"
ls -l /etc/pki/ca-trust/source/
#drwxr-xr-x. 2 root root   6 Aug  1 09:00 anchors
#drwxr-xr-x. 2 root root   6 Aug  1 09:00 blacklist
#drwxr-xr-x. 2 root root   6 Aug  1 09:00 blocklist
#lrwxrwxrwx. 1 root root  59 Nov  3 14:27 ca-bundle.legacy.crt -> /usr/share/pki/ca-trust-legacy/ca-bundle.legacy.default.crt
#-rw-r--r--. 1 root root 932 Aug  1 09:00 README

extracted ディレクトリも更新されています(結果は省略)

ls -l /etc/pki/ca-trust/extracted/edk2/
ls -l /etc/pki/ca-trust/extracted/java/
ls -l /etc/pki/ca-trust/extracted/openssl/
ls -l /etc/pki/ca-trust/extracted/pem/

update-ca-trust コマンド

証明書のインストール方法として、source/anchors ディレクトリに手動で証明書を配置する方法があると説明されています。

cp -p server.crt /etc/pki/ca-trust/source/anchors/

この結果、trust コマンドは証明書を認識します。

trust list | grep -C 3 www
#pkcs11:id=%EC%52%35%8A%3E%B4%DF%5E%6A%A4%90%E1%6A%D9%C5%76%1F%77%B4%4D;#type=cert
#    type: certificate
#    label: www
#    trust: anchor
#    category: authority

trust dump | grep -A 10 "pkcs11:id=%EC%52%35%8A%3E%B4%DF%5E%6A%A4%90%E1%6A%D9%C5%76%1F%77%B4%4D;type=cert"
## pkcs11:id=%EC%52%35%8A%3E%B4%DF%5E%6A%A4%90%E1%6A%D9%C5%76%1F%77%B4%4D;#type=cert
#[p11-kit-object-v1]
#private: false
#label: "www"
#issuer: #"0%5D1%0B0%09%06%03U%04%06%13%02JA1%0E0%0C%06%03U%04%08%0C%05osaka1%0E0%0C%06#%03U%04%07%0C%05osaka1%110%0F%06%03U%04%0A%0C%08asterisk1%0D0%0B%06%03U%04%0B#%0C%04home1%0C0%0A%06%03U%04%03%0C%03www"
#serial-number: "%02%14O%F4%02%96%19%ED%1AV%CAH%A5%EF%A6X%AF%7B%19%84%3B2"
#trusted: true
#certificate-category: authority
#java-midp-security-domain: 0
#url: ""
#hash-of-subject-public-key: #"%D7%3DF%0EA%24%E7%C9%90%80Q%A4%8A%FC%09%3C%10I%F2%06"

しかし、extracted ディレクトリは更新されていません(結果は省略)

ls -l /etc/pki/ca-trust/extracted/edk2/
ls -l /etc/pki/ca-trust/extracted/java/
ls -l /etc/pki/ca-trust/extracted/openssl/
ls -l /etc/pki/ca-trust/extracted/pem/

そこで update-ca-trust を実行します。

update-ca-trust

extracted ディレクトリが更新されました(結果は省略)

ls -l /etc/pki/ca-trust/extracted/edk2/
ls -l /etc/pki/ca-trust/extracted/java/
ls -l /etc/pki/ca-trust/extracted/openssl/
ls -l /etc/pki/ca-trust/extracted/pem/

update-ca-trust コマンドの内容を確認してみます。

cat $(which update-ca-trust)

extracted ディレクトリのファイルを単純に上書きしているだけのシェルスクリプトでした。

#!/usr/bin/sh

#set -vx

# At this time, while this script is trivial, we ignore any parameters given.
# However, for backwards compatibility reasons, future versions of this script must
# support the syntax "update-ca-trust extract" trigger the generation of output
# files in $DEST.

DEST=/etc/pki/ca-trust/extracted

# Prevent p11-kit from reading user configuration files.
export P11_KIT_NO_USER_CONFIG=1

# OpenSSL PEM bundle that includes trust flags
# (BEGIN TRUSTED CERTIFICATE)
/usr/bin/p11-kit extract --format=openssl-bundle --filter=certificates --overwrite --comment $DEST/openssl/ca-bundle.trust.crt
/usr/bin/p11-kit extract --format=pem-bundle --filter=ca-anchors --overwrite --comment --purpose server-auth $DEST/pem/tls-ca-bundle.pem
/usr/bin/p11-kit extract --format=pem-bundle --filter=ca-anchors --overwrite --comment --purpose email $DEST/pem/email-ca-bundle.pem
/usr/bin/p11-kit extract --format=pem-bundle --filter=ca-anchors --overwrite --comment --purpose code-signing $DEST/pem/objsign-ca-bundle.pem
/usr/bin/p11-kit extract --format=java-cacerts --filter=ca-anchors --overwrite --purpose server-auth $DEST/java/cacerts
/usr/bin/p11-kit extract --format=edk2-cacerts --filter=ca-anchors --overwrite --purpose=server-auth $DEST/edk2/cacerts.bin
# Hashed directory of BEGIN TRUSTED-style certs (usable as OpenSSL CApath and
# by GnuTLS)
/usr/bin/p11-kit extract --format=pem-directory-hash --filter=ca-anchors --overwrite --purpose server-auth $DEST/pem/directory-hash
# Debian compatibility: their /etc/ssl/certs has this bundle
/usr/bin/ln -s ../tls-ca-bundle.pem $DEST/pem/directory-hash/ca-certificates.crt
# Backwards compatibility: RHEL/Fedora provided a /etc/ssl/certs/ca-bundle.crt
# since https://bugzilla.redhat.com/show_bug.cgi?id=572725
/usr/bin/ln -s ../tls-ca-bundle.pem $DEST/pem/directory-hash/ca-bundle.crt

p11-kit コマンドについて少しだけ

update-ca-trust コマンドには extracted ディレクトリは記載されているものの、source にあたる部分が見当たりません。

そこで、主要な機能と思われる p11-kit コマンドについて調べてみると、PKCS#11モジュールをロードし、列挙する方法を提供する と説明されていました。

以下のコマンドで、モジュールの一覧が表示できる様です。

p11-kit list-modules
#module: p11-kit-trust
#    path: /usr/lib64/pkcs11/p11-kit-trust.so
#    uri: pkcs11:library-description=PKCS%2311%20Kit%20Trust%20Module;library-manufacturer=PKCS%2311%20Kit
#    library-description: PKCS#11 Kit Trust Module
#    library-manufacturer: PKCS#11 Kit
#    library-version: 0.25
#    token: System Trust
#        uri: pkcs11:model=p11-kit-trust;manufacturer=PKCS%2311%20Kit;serial=1;token=System%20Trust
#        manufacturer: PKCS#11 Kit
#        model: p11-kit-trust
#        serial-number: 1
#        hardware-version: 0.25
#        flags:
#              token-initialized
#    token: Default Trust
#        uri: pkcs11:model=p11-kit-trust;manufacturer=PKCS%2311%20Kit;serial=1;token=Default%20Trust
#        manufacturer: PKCS#11 Kit
#        model: p11-kit-trust
#        serial-number: 1
#        hardware-version: 0.25
#        flags:
#              write-protected
#              token-initialized
#module: opensc
#    path: /usr/lib64/pkcs11/opensc-pkcs11.so
#    uri: pkcs11:library-description=OpenSC%20smartcard%20framework;library-manufacturer=OpenSC%20Project
#    library-description: OpenSC smartcard framework
#    library-manufacturer: OpenSC Project
#    library-version: 0.23

p11-kit-trustopensc というモジュールを認識している様です。おそらく前者のモジュールが、source ディレクトリ(/etc/usr の配下)の .p11-kit ファイルや anchors/*.crt を列挙する機能を提供しているものと思われます。

確認

確認のためにトラストストアを破壊してみます。

まず extracted を破壊します。

rm -f /etc/pki/ca-trust/extracted/edk2/cacerts.bin
rm -f /etc/pki/ca-trust/extracted/java/cacerts
rm -f /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
rm -f /etc/pki/ca-trust/extracted/pem/*.pem
rm -f /etc/pki/ca-trust/extracted/pem/directory-hash/*
find /etc/pki/ca-trust/extracted/

しかし、source ディレクトリは存在するため、update-ca-trust コマンドで復活できるはずです。

update-ca-trust
find /etc/pki/ca-trust/extracted/

一方で、デフォルトでインストールされている証明書を削除してみます。

rm -f /usr/share/pki/ca-trust-source/ca-bundle.trust.p11-kit

trust コマンドの結果が寂しくなりました。

trust list
#pkcs11:id=%EC%52%35%8A%3E%B4%DF%5E%6A%A4%90%E1%6A%D9%C5%76%1F%77%B4%4D;type=cert
#    type: certificate
#    label: www
#    trust: anchor
#    category: authority

trust dump
## pkcs11:id=%EC%52%35%8A%3E%B4%DF%5E%6A%A4%90%E1%6A%D9%C5%76%1F%77%B4%4D;type=cert
#[p11-kit-object-v1]
#private: false
#label: "www"
#issuer: #"0%5D1%0B0%09%06%03U%04%06%13%02JA1%0E0%0C%06%03U%04%08%0C%05osaka1%0E0%0C%06%03U%04%07%0C%05osaka1%110%0F%06%03U%04%0A%0C%08asterisk1%0D0%0B%06%03U%04%0B%0C%04home1%0C0%0A%#06%03U%04%03%0C%03www"
#serial-number: "%02%14O%F4%02%96%19%ED%1AV%CAH%A5%EF%A6X%AF%7B%19%84%3B2"
#trusted: true
#certificate-category: authority
#java-midp-security-domain: 0
#url: ""
#hash-of-subject-public-key: "%D7%3DF%0EA%24%E7%C9%90%80Q%A4%8A%FC%09%3C%10I%F2%06"
#hash-of-issuer-public-key: ""
#check-value: "2N%AC"
#subject: #"0%5D1%0B0%09%06%03U%04%06%13%02JA1%0E0%0C%06%03U%04%08%0C%05osaka1%0E0%0C%06%03U%04%07%0C%05osaka1%110%0F%06%03U%04%0A%0C%08asterisk1%0D0%0B%06%03U%04%0B%0C%04home1%0C0%0A%#06%03U%04%03%0C%03www"
#id: "%ECR5%8A%3E%B4%DF%5Ej%A4%90%E1j%D9%C5v%1Fw%B4M"
#start-date: "20231103"
#end-date: "20331031"
#modifiable: false
#x-distrusted: false
#-----BEGIN CERTIFICATE-----
#MIIDmzCCAoOgAwIBAgIUT/QClhntGlbKSKXvplivexmEOzIwDQYJKoZIhvcNAQEN
#BQAwXTELMAkGA1UEBhMCSkExDjAMBgNVBAgMBW9zYWthMQ4wDAYDVQQHDAVvc2Fr
#YTERMA8GA1UECgwIYXN0ZXJpc2sxDTALBgNVBAsMBGhvbWUxDDAKBgNVBAMMA3d3
#dzAeFw0yMzExMDMwNjAzNDZaFw0zMzEwMzEwNjAzNDZaMF0xCzAJBgNVBAYTAkpB
#MQ4wDAYDVQQIDAVvc2FrYTEOMAwGA1UEBwwFb3Nha2ExETAPBgNVBAoMCGFzdGVy
#aXNrMQ0wCwYDVQQLDARob21lMQwwCgYDVQQDDAN3d3cwggEiMA0GCSqGSIb3DQEB
#AQUAA4IBDwAwggEKAoIBAQCgm2ImezVrDle27BmrzaTK6a0Ucgx00nqLj/wlkcsb
#Iykt7020DVmCiQ0eaxslWcDKkCzB4OTC7VrvvX2jzffy6lPGI9Qzo2D787akSTB6
#q9kI2q8aSvHovU8AGBwjDDxz9JRXP7Jf4RhLlxczCrFI9FuG3N5t19s8iig4n/VO
#EzB3M2WfQoAo2zzayArbeY0e61AYLkTM8rYlWQRYy9ctSnvglcBrhtnQUaw1HAZg
#rrt4YpeXgOkm5DjRiHKCP0G09jL3qRu+OVqBm8iKXmnenzTjv5dbeYVivWxL+c/M
#xy7EnMZExQ6uML8Ub6dSMq0HgqdNKhpOYWzzbUeBaLPrAgMBAAGjUzBRMB0GA1Ud
#DgQWBBTsUjWKPrTfXmqkkOFq2cV2H3e0TTAfBgNVHSMEGDAWgBTsUjWKPrTfXmqk
#kOFq2cV2H3e0TTAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDQUAA4IBAQBl
#fjvu7+vQDt7LJcE4WDqDLU8HR5oCcDWVK0JOWdKTfM6Sfhr+MEJtW9DMy4cj/WK3
#aWuGx4otTvunR3YDlVSGksJfzzKbun/+NzYx20H4q9Q4tdA9QCzeGpf9LV/9ykup
#GvOF0Uxg1Abroi3AfYaQbD1/uT/GJInb3cBKKWbNF7Y3nuqMHu7WVbPvcG8IW2CR
#+YIruJz18kr531kiCDviSbAJZOVUWTIsaPUwZB/3JrS+f1XNkXFhC0E9NCjlDxXD
#B+iD6iXnchYHyhWkSg2UCmNU6LPnxNO+n0iPkHAcstg/2EeUj36xST0vNNeDm6Zh
#EEpQBuYZ8CC/O5XgNXIc
#-----END CERTIFICATE-----
#
#...

デフォルトの証明書は、以下のコマンドで再インストールできます。

dnf -y reinstall ca-certificates

以上

GitHubで編集を提案

Discussion