authorize.net如何使用与CA签名的证书,该证书不在众所周知的curl.haxx.se/ca/cacert.pem列表中?

时间:2015-03-17 15:47:25

标签: curl ssl-certificate authorize.net

authorize.net交易的网址为https://secure.authorize.net/gateway/transact.dll。如果我们访问此URL并检查证书,我们可以看到它是由CN = Entrust Certification Authority - L1E的中间证书签署的,有效期为201年12月10日17:25:43。但是,如果您访问Entrust站点https://validev.entrust.net/,您会看到他们的中间证书具有相同的CN有效期至11月11日2021 23:00:59 - 因此它是更新版本。这两个中间证书不共享相同的根证书。在我的情况下,出现问题是因为我的配置设置中CURL使用的众所周知的列表http://curl.haxx.se/ca/cacert.pem不包含先前版本证书的根证书。它仅包含新版本的根证书。当我在文件中手动添加旧版本的根证书时,问题就解决了。但是,我想了解到底出了什么问题。列表是否应包含两个版本的根证书?是否应该让Authorize.net更新其证书,以便与更新的CA捆绑包匹配?

2 个答案:

答案 0 :(得分:2)

更新:由于Authorize.net has updated its production servers' certificates

,因此不再需要这样做

你可能已经发现这一点突然停止工作,因为Ubuntu ca-certificates软件包在最近的更新中放弃了对它们的支持:

http://changelogs.ubuntu.com/changelogs/pool/main/c/ca-certificates/ca-certificates_20141019ubuntu0.12.04.1/changelog

http://changelogs.ubuntu.com/changelogs/pool/main/c/ca-certificates/ca-certificates_20141019ubuntu0.14.04.1/changelog

我的同事和我前几天遇到了这个客户 - 他们的捐款突然停止了工作。

真正的解决方案是Authorize.net需要更新其证书。但是,在此期间,您只需添加一个缺少的证书。我在这里把关于如何在Ubuntu中做这个的说明放在一起:

https://aghstrategies.com/content/SSL3_GET_SERVER_CERTIFICATE

我还在https://github.com/agh1/ca-certificate-for-authorize.net隐藏了一个根证书(尽管可能不安全)

同样,我希望这只需要一个短期解决方案,直到他们获得新证书,但这将是一个很好的止损。

答案 1 :(得分:0)

问题是,https://secure.authorize.net的根CA(以及authorize.net上可能还有其他安全域)未包含在CA捆绑http://curl.haxx.se/ca/cacert.pem中,原因如下:如果您访问该页面并且查看证书路径中根CA的详细信息,您将注意到Sha1指纹是99 a6 9b e6 1a fe 88 6b 4d 2b 82 00 7c b8 54 fc 31 7e 15 39。在互联网上搜索将引导您进入此页面 https://blog.mozilla.org/security/2014/09/08/phasing-out-certificates-with-1024-bit-rsa-keys/,它解释了此根证书不再受信任。它使用不安全的1024位RSA密钥。链中的下面的证书(sha1指纹是e7 72 b3 19 0a c8 4b f8 31 f9 60 7d 98 89 ec 6a 96 6c 16)使用2048 RSA密钥,但它不是最新版本。例如,Google切换到更新版本(sha1指纹:B3 1E B1 B7 40 E3 6C 84 02 DA DC 37 D4 4D F5 D4 67 49 52 F9)https://android.googlesource.com/platform/libcore.git/+/078e25d731728ba52e2940fbca31b3d6d7a56fad。根据我自己的经验和安德鲁提到的,Ubuntu最近放弃了对此链中证书的支持,并且curl将不再连接到https://secure.authorize.net/gateway/transact.dll。不幸的是,Authorize.net仍然使用旧版本。所以,我被迫使用旧证书(2048位)来解决问题。我没有插入使用1024位密钥的根证书。临时解决方案是让CURL信任根目录下的证书(而不是不安全的根)。为了在Ubuntu中执行此操作,我按照配置文件\ etc \ ca-certificates.conf中提供的说明进行操作。

# This file lists certificates that you wish to use
...
# Certificates should be installed under /usr/share/ca-certificates
# and files with extension '.crt' is recognized as available certs.

在我的情况下,我添加了根目录下的所有证书(仔细检查了他们的sha1指纹后),按照指示将其列在配置文件中并简单执行:

sudo update-ca-certificates –fresh

这会在/ etc / ssl / certs /中添加证书。我们需要确保CURL知道这个位置。所以,我在CURL脚本中添加了以下选项:

curl_setopt($ch, CURLOPT_CAPATH, "/etc/ssl/certs"); 

要验证它是否有效,您可以执行

openssl verify -CApath /etc/ssl/certs /path/to/signed/certificate.crt

此处提出了类似的问题:Drupal Curl SSL Certificate Error