これにより数時間忙しかった。他の記事とStackexchangeの質問をたくさん読んで、別の方法を試しましたが、これまで肯定的な結果はありません。
Ubuntu20/Nginx/Openssl v1.1.1を実行します。
通常のWebリソースでwget、openssl s_client、またはカールを使用すると、「認証リターンコード:20(ローカル発行者証明書を取得できません)」またはそれに対応するメッセージが表示されます。
$ openssl s_client -connect google.com:443
CONNECTED(00000003)
depth=2 C = US, O = Google Trust Services LLC, CN = GTS Root R1
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=1 C = US, O = Google Trust Services LLC, CN = GTS CA 1C3
verify return:1
depth=0 CN = *.google.com
verify return:1
---
Certificate chain
0 s:CN = *.google.com
i:C = US, O = Google Trust Services LLC, CN = GTS CA 1C3
1 s:C = US, O = Google Trust Services LLC, CN = GTS CA 1C3
i:C = US, O = Google Trust Services LLC, CN = GTS Root R1
2 s:C = US, O = Google Trust Services LLC, CN = GTS Root R1
i:C = BE, O = GlobalSign nv-sa, OU = Root CA, CN = GlobalSign Root CA
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIN...
少し背景。これらの一般的なWebリソースに対して機能するために使用されるSSLハンドシェイク。ただし、信頼できるCA証明書ストアに自己署名証明書を追加する必要があるアプリケーションがあります。私はこの仕事を20時間し、多くのことを試みました。最後に、「再起動」し、信頼できる証明書ストア全体を削除することにしました。/etc/ssl/証明書/そして/usr/(ローカル/)共有/ca-証明書/)とこれらのフォルダにある一般的なCA証明書のバックアップを復元し、バックアップを復元します。/etc/ca-certificates.conf。それから逃げた。CA証明書の更新。さらに:OpenSSLをv1.1.1から1.0.2にダウングレードしてから、1.0.2から1.1.1に再アップグレードしました。
以下の出力は問題がないことを証明しています。
$ update-ca-certificates -f
Clearing symlinks in /etc/ssl/certs...
done.
Updating certificates in /etc/ssl/certs...
129 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
私が知っている限り、私の信頼できる証明書ストアは問題ないようです。チェーンに要求されたルート証明書が含まれています。上記の例では、2 つのルート証明書があります。 (1)C = 米国、O = Google Trust Services LLC、CN = GTS ルート R1(2)C = BE、O = GlobalSign nv-sa、OU = ルート CA、CN = GlobalSign ルート CA。
これら2つのルート証明書が信頼できるCAストアにあることを確認してください。以下は、提案された技術の出力の一部です。マロン存在する「発行者証明書を取得できませんでした」というメッセージで、NginX クライアント証明書認証は失敗します。
$ awk -v cmd='openssl x509 -noout -subject' ' /BEGIN/{close(cmd)};{print | cmd}' < /etc/ssl/certs/ca-certificates.crt
...
subject=OU = GlobalSign ECC Root CA - R4, O = GlobalSign, CN = GlobalSign
subject=OU = GlobalSign ECC Root CA - R5, O = GlobalSign, CN = GlobalSign
subject=C = BE, O = GlobalSign nv-sa, OU = Root CA, CN = GlobalSign Root CA
subject=OU = GlobalSign Root CA - R2, O = GlobalSign, CN = GlobalSign
subject=OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
subject=OU = GlobalSign Root CA - R6, O = GlobalSign, CN = GlobalSign
...
subject=C = US, O = Google Trust Services LLC, CN = GTS Root R1
subject=C = US, O = Google Trust Services LLC, CN = GTS Root R2
subject=C = US, O = Google Trust Services LLC, CN = GTS Root R3
subject=C = US, O = Google Trust Services LLC, CN = GTS Root R4
したがって、私の例のホスト(google.com)は信頼できるCAストアにあるルート証明書を使用します。 「検証エラー:ローカル発行者証明書を取得できません」というメッセージが表示されるのはなぜですか?
また、信頼できるCA証明書ストアへのパスを明示的に定義するときに出力を追加します。 SSLハンドシェイク成功!私は何を見落としていますか?
$ openssl s_client -CApath /etc/ssl/certs -connect google.com:443
CONNECTED(00000003)
depth=2 C = US, O = Google Trust Services LLC, CN = GTS Root R1
verify return:1
depth=1 C = US, O = Google Trust Services LLC, CN = GTS CA 1C3
verify return:1
depth=0 CN = *.google.com
verify return:1
---
Certificate chain
0 s:CN = *.google.com
i:C = US, O = Google Trust Services LLC, CN = GTS CA 1C3
1 s:C = US, O = Google Trust Services LLC, CN = GTS CA 1C3
i:C = US, O = Google Trust Services LLC, CN = GTS Root R1
2 s:C = US, O = Google Trust Services LLC, CN = GTS Root R1
i:C = BE, O = GlobalSign nv-sa, OU = Root CA, CN = GlobalSign Root CA
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIN...
...
-----END CERTIFICATE-----
subject=CN = *.google.com
issuer=C = US, O = Google Trust Services LLC, CN = GTS CA 1C3
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: ECDSA
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 6523 bytes and written 392 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 256 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
結論:リセットされた可能性のある設定やパラメータを見落としたか、システムパッチで何かが正しく設定されていない可能性があります。しかし、私はそれを見ることができず、これまで読んでみたソースには、信頼できるCA証明書ストアが完全であることを確認するものがほとんど記載されています。私は何を見落としていますか?この問題を解決するには、どこで確認する必要がありますか?それともどうすればいいですか?
答え1
私の問題を解決し、ここで解決策を共有します。信頼できるCAストアの証明書は実際には大丈夫です。私の問題は、OpenSSLを削除して再構築することで発生しました。
「新しい」OpenSSLインストールディレクトリには、とりわけ次のものが含まれています。/資格そして/プライベートフォルダとopenssl.cnfファイル。
$ ll
total 68
drwxr-xr-x 9 root root 4096 Jul 28 12:10 ./
drwxr-xr-x 11 root root 4096 Jul 26 21:58 ../
drwxr-xr-x 2 root root 4096 Jul 26 21:59 bin/
drwxr-xr-x 2 root root 4096 Jul 26 21:59 certs/
-rw-r--r-- 1 root root 412 Jul 28 12:10 ct_log_list.cnf
-rw-r--r-- 1 root root 412 Jul 28 12:10 ct_log_list.cnf.dist
drwxr-xr-x 3 root root 4096 Jul 26 21:59 include/
drwxr-xr-x 4 root root 4096 Jul 26 21:59 lib/
drwxr-xr-x 6 root root 4096 Jul 26 21:58 man/
drwxr-xr-x 2 root root 4096 Jul 28 12:10 misc/
-rw-r--r-- 1 root root 10835 Jul 26 21:59 openssl.cnf
-rw-r--r-- 1 root root 10909 Jul 28 12:10 openssl.cnf.dist
drwxr-xr-x 2 root root 4096 Jul 26 21:59 private/
ただし、このサーバー(「新しいプライマリUbuntu20」ではなくサードパーティ製)は、信頼できるCAを次の場所に保存します。/etc/ssl/証明書。簡単に言うと、OpenSSLがすべての共通証明書を持つCAリポジトリを「見つけられない」理由です。解決策は、このソースフォルダを削除し、実際の信頼できるCAストアにシンボリックリンクを追加することでした。
$ rmdir certs
$ ln -s /etc/ssl/certs ./certs
また追加されました:
$ rm openssl.cnf
$ rmdir private
$ ln -s /etc/ssl/openssl.cnf ./openssl.cnf
$ ln -s /etc/ssl/private ./private
これで、次のようになります。
$ ll
total 48
drwxr-xr-x 7 root root 4096 Jul 30 17:02 ./
drwxr-xr-x 11 root root 4096 Jul 26 21:58 ../
drwxr-xr-x 2 root root 4096 Jul 26 21:59 bin/
lrwxrwxrwx 1 root root 14 Jul 30 16:57 certs -> /etc/ssl/certs/
-rw-r--r-- 1 root root 412 Jul 28 12:10 ct_log_list.cnf
-rw-r--r-- 1 root root 412 Jul 28 12:10 ct_log_list.cnf.dist
drwxr-xr-x 3 root root 4096 Jul 26 21:59 include/
drwxr-xr-x 4 root root 4096 Jul 26 21:59 lib/
drwxr-xr-x 6 root root 4096 Jul 26 21:58 man/
drwxr-xr-x 2 root root 4096 Jul 28 12:10 misc/
lrwxrwxrwx 1 root root 20 Jul 30 17:02 openssl.cnf -> /etc/ssl/openssl.cnf
-rw-r--r-- 1 root root 10909 Jul 28 12:10 openssl.cnf.dist
lrwxrwxrwx 1 root root 16 Jul 30 17:02 private -> /etc/ssl/private/
同じ方法で設定された別のサーバーにログインし、OPENSSLDIR(OpenSSLインストールディレクトリ)を見つけてソリューションを見つけました。
openssl version -d
これら2つのサーバーには違いがあります。このフォルダ内を見てください。動作するサーバー上のフォルダでシンボリックリンクを探します。サーバーに空の「certs」フォルダが見つかりましたが、存在しません。シンボリックリンクを追加しました。解決しました。