12

我正在尝试从应用程序的 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 证书,在“将证书导入系统范围的证书颁发机构数据库”下,据我所知这个页面,一切都是应该的(证书在 /usr/lib/ssl/certs 中,并且有一个符号链接到它的哈希)。

如果我尝试使用以下方式连接到 APNS 本身,也会发生同样的情况openssl s_client:如果我明确指定 CAfile,它似乎可以连接,否则不会。PyAPNS 告诉我它无法连接到 APNS 服务器,我只能假设这是出于同样的原因。

如何让 OpenSSL 默认识别 Entrust 证书颁发机构,而无需每次都明确指定?我在某处错过了一步吗?

4

1 回答 1

16

OpenSSL 使用证书颁发者 DN 的哈希值在安装 CA 证书的默认目录中查找文件。

请参阅OpenSSLverify文档

-CApath 目录

受信任证书的目录。证书应该具有以下形式的名称:hash.0 或具有这种形式的符号链接(“散列”是散列的证书主题名称:请参阅 x509 实用程序的 -hash 选项)。在 Unix 下,c_rehash 脚本将自动创建指向证书目录的符号链接。

这些散列值将来自每个 CA 证书的主题 DN(因为目标是查找主题与证书颁发者匹配的 CA 证书以进行验证)。您可以c_rehash按照文档说明使用,也可以使用获取主题 DN 的哈希openssl x509 -subject_hash -noout -in cacert.pem并相应地重命名文件/链接。

要验证的证书的直接颁发者可能不是根 CA 证书:链中可能存在中间 CA 证书。您还需要确保使用了中间证书。

此外,还有两种不同的哈希格式(自 OpenSSL 1.0 版以来发生了变化),值得同时使用-subject_hash_old和建立链接-subject_hash,尽管默认情况下 OpenSSL 本身应该只使用其新格式。

于 2012-08-20T17:25:34.333 回答