PayPal IPN请求突然中断问题排查求助——疑似Let's Encrypt证书链异常引发
一、为啥openssl一会儿说证书过期,最后又返回ok?
这事儿根源在2021年9月30日过期的DST Root CA X3根证书。你的openssl客户端在验证证书链的时候,会同时尝试走两条路:一条是旧的X3根证书链(已经过期了,所以会弹出警告),另一条是新的ISRG Root X1根证书链(这个是有效的)。最后openssl验证通过了那条有效链,所以才会返回verify return code: 0 (ok)。
但PayPal的服务器对证书链的检查更严格——它只要看到链里包含过期的X3根,直接就拒绝握手了,根本不会给你发IPN请求,这就是为啥你access.log里啥记录都没有的原因。
二、同一服务器为啥有的域名正常,有的不行?
你用h1.tempel.org测试成功,是因为你给它强制生成了只包含ISRG Root X1的证书链;但paypal-api.tempel.org的Apache站点配置,大概率还是在使用默认的混合链(包含过期X3的那种)。Let's Encrypt默认会生成同时兼容新旧根证书的混合链,但PayPal不吃这一套。
一步步修复paypal-api.tempel.org:
强制生成纯ISRG Root X1的证书链
直接跑这条命令,指定用ISRG Root X1作为首选链,强制续签证书:certbot renew --cert-name paypal-api.tempel.org --preferred-chain "ISRG Root X1" --force-renewal跑完之后,certbot会生成完全移除X3根证书的新链文件。
确认Apache配置用对了新证书
打开paypal-api.tempel.org对应的Apache配置文件(一般在/etc/apache2/sites-available/下面),检查这三个配置项:SSLCertificateFile指向/etc/letsencrypt/live/paypal-api.tempel.org/fullchain.pem(这个fullchain现在是纯ISRG的链)SSLCertificateKeyFile指向/etc/letsencrypt/live/paypal-api.tempel.org/privkey.pem- 如果你之前手动加过
SSLCertificateChainFile,确保它指向/etc/letsencrypt/live/paypal-api.tempel.org/chain.pem(新生成的链)
优雅重启Apache生效
别直接硬重启,用优雅重启不影响其他站点:apachectl graceful验证修复结果
再用openssl测一次paypal-api.tempel.org,看看还会不会出现X3的过期提示:openssl s_client -connect paypal-api.tempel.org:443 -showcerts -CApath /etc/ssl/certs/正常情况下,输出里只会看到ISRG Root X1和R3中间证书的信息,再也不会提DST Root CA X3了。
三、额外要检查的小细节
- PayPal IPN用的是POST请求:你之前测的是GET,但要确保你的CGI脚本能正确处理POST请求——可以自己用curl模拟POST请求测试下,同时看Apache的
access.log和error.log有没有异常。 - SSL版本要达标:PayPal早就不支持TLS 1.0和1.1了,确保Apache配置里只启用TLS 1.2及以上:
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 - 清缓存:如果服务器有CDN或者本地SSL缓存,可能需要手动清一下,避免旧链残留。
内容的提问来源于stack exchange,提问作者Thomas Tempelmann

