web-dev-qa-db-ja.com

CAfileが明示的に指定されていない限り、OpenSSLはローカルの発行者証明書を取得できません

アプリのUbuntuサーバーからAppleのプッシュ通知サービスに接続しようとしています。私が使用しているpyAPNSプロバイダーが必要とする結合.pem証明書を正常に生成しました。ただし、openssl verifyで証明書を確認しようとすると、error 20 at 0 depth lookup:unable to get local issuer certificateが表示されます。認証局を明示的に指定すると機能しますが(openssl verify apns.pem -CAfile entrust_2048_ca.pem)、指示に従ってシステムにEntrust証明書を明示的にインストールしました here の「システムへの証明書のインポート-ワイド認証局データベース」、そして私が理解している限り このページ 、すべてが本来あるべき状態です(証明書は/ usr/lib/ssl/certsにあり、それへのシンボリックリンクがあります)ハッシュ)。

openssl s_clientを使用してAPNS自体に接続しようとすると、同じことが起こります。CAfileを明示的に指定した場合は接続できますが、それ以外の場合は接続できません。 PyAPNSは、APNSサーバーに接続できないことを教えてくれます。同じ理由でしか推測できません。

毎回明示的に指定せずに、OpenSSLにデフォルトでEntrust認証局を認識させるにはどうすればよいですか?どこかに段差があるのでしょうか?

12
antialiasis

OpenSSLは、証明書の発行者DNのハッシュを使用して、CA証明書がインストールされているデフォルトのディレクトリでファイルを検索します。

OpenSSL verifyのドキュメント を参照してください:

-CApathディレクトリ

信頼できる証明書のディレクトリ。証明書には、hash.0という形式の名前を付けるか、この形式の証明書へのシンボリックリンクを含める必要があります(「ハッシュ」はハッシュされた証明書のサブジェクト名です:x509ユーティリティの-hashオプションを参照してください)。 Unixでは、c_rehashスクリプトが証明書のディレクトリへのシンボリックリンクを自動的に作成します。

これらのハッシュ値は、各CA証明書のサブジェクトDNから取得されます(目的は、検証する証明書の発行者と一致するサブジェクトを持つCA証明書を探すことであるため)。記載されているようにc_rehashを使用するか、openssl x509 -subject_hash -noout -in cacert.pemを使用してサブジェクトDNのハッシュを取得し、それに応じてファイル/リンクの名前を変更できます。

検証する証明書の直接発行者はルートCA証明書ではない可能性があります。チェーンに中間CA証明書がある可能性があります。また、中間証明書が使用されていることを確認する必要もあります。

さらに、2つの異なるハッシュ形式があります(OpenSSLバージョン1.0以降に変更がありました)。-subject_hash_old-subject_hashの両方を使用してリンクを作成する価値はありますが、OpenSSL自体はデフォルトで新しい形式のみを使用する必要があります。

15
Bruno