Ubuntu 除非明确指定CAfile,否则OpenSSL无法获取本地颁发者证书

Ubuntu 除非明确指定CAfile,否则OpenSSL无法获取本地颁发者证书,ubuntu,ssl,openssl,ssl-certificate,apple-push-notifications,Ubuntu,Ssl,Openssl,Ssl Certificate,Apple Push Notifications,我正在尝试从Ubuntu服务器连接到苹果的推送通知服务,以获得一个应用程序。我已经成功地生成了我正在使用的pyAPNS提供程序所需的组合.pem证书。但是,当我尝试使用openssl verify验证证书时,在0深度查找时出现错误20:无法获取本地颁发者证书。如果我明确指定了证书颁发机构(openssl verify apns.pem-CAfile authority_2048_ca.pem),它就可以工作,但我已经按照“将证书导入系统范围的证书颁发机构数据库”中的说明在系统上明确安装了委托证书

我正在尝试从Ubuntu服务器连接到苹果的推送通知服务,以获得一个应用程序。我已经成功地生成了我正在使用的pyAPNS提供程序所需的组合.pem证书。但是,当我尝试使用
openssl verify
验证证书时,在0深度查找时出现
错误20:无法获取本地颁发者证书
。如果我明确指定了证书颁发机构(
openssl verify apns.pem-CAfile authority_2048_ca.pem
),它就可以工作,但我已经按照“将证书导入系统范围的证书颁发机构数据库”中的说明在系统上明确安装了委托证书,据我所知,一切都是应该的(证书位于/usr/lib/ssl/certs中,并且有一个带有哈希的符号链接)

如果我尝试使用
openssl s_client
连接到APNS本身,也会发生同样的情况:如果我显式指定CAfile,则连接似乎正常,但在其他方面则不正常。PyAPNS告诉我它无法连接到APNS服务器,我只能推测这是出于同样的原因


如何让OpenSSL在默认情况下识别委托证书颁发机构,而不是每次都明确指定它?我是否遗漏了某个步骤?

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

见:

-CApath目录

受信任证书的目录。证书应具有以下格式的名称:hash.0或具有指向此格式证书的符号链接 (`hash''是经过哈希处理的证书使用者名称:请参阅-hash选项 x509实用程序的)。在Unix下,c_rehash脚本将 自动创建指向证书目录的符号链接

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

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


此外,有两种不同的散列格式(自OpenSSL版本1.0以来发生了变化),使用
-subject\u hash\u old
-subject\u hash
创建链接是值得的,尽管OpenSSL本身在默认情况下应该只使用其新格式。

只是为了澄清一下,您是如何生成散列值的?它们是否与CA证书上的
openssl x509-subject\u hash
和证书上的
openssl x509-issuer\u hash
匹配以进行验证?
.0
扩展是否存在?我已经检查了哈希值,显然问题在于苹果公司有中间CA证书,而官方说明似乎没有提到。我仍然需要研究这些问题,但至少现在我已经越过了这个障碍。非常感谢您提供了清晰、有用和准确的答案。