HTTPS 请求在响应 'certificate has expired' 中为 shortswitch api 返回错误
Https request returning error in response 'certificate has expired' for shortswitch api
我正在使用 nodejs 的 https 包向 shortswitch api 发出请求。它 returns 错误 'certificate has expired' 响应。 Shortswitch 没有我们可以随请求一起发送的客户端证书。他们有一个服务器端证书,该证书在通过 SSL 检查器验证时有效。
我正在使用节点版本 6.14.0(因为该应用程序正在生产并且 运行 我们还不能更新节点版本)。
关于如何解决这个问题有什么建议吗?
代码片段:
https.request('https://api.shortswitch.com/shorten?apiKey=****&longUrl=***********&format=json', function(res){
console.log("Connected");
res.on('data',function(data){
console.log(data);
});
});
编辑:我根据建议的解决方案添加了以下证书。
const ISRGCAs = [`-----BEGIN CERTIFICATE-----MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZLubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=-----END CERTIFICATE-----`];
const options = {
host: 'api.shortswitch.com',
path: '/shorten?apiKey=***&longUrl=*****&format=json',
method: 'GET',
port: 443,
ca: ISRGCAs
}
https.request(options, function(res){
var data = [];
res.on('data', function(chunk) {
data.push(chunk);
console.log((Buffer.concat(data)).toString());
});
res.on('end', function() {
var buffer = Buffer.concat(data);
console.log(buffer.toString());
});
});
但现在出现错误:
API/server没有'returning'过期;它正在使用 你的 nodejs 客户端 拒绝的 certificate/chain,因为证书来自 LetsEncrypt,默认情况下它仍然使用最后过期的 'compatibility' 根(DSTX3) 9 月,但是 大多数 客户端(包括您使用的 sslchecker)可以替换为较新的 still-valid ISRG root。
nodejs 使用 OpenSSL,默认情况下它自己的硬编码 CA 证书列表,在 nodejs 6 中不包括 ISRG 根;此外,根据您的系统和构建,它 可能 使用旧版本的 OpenSSL,它不能正确执行 replacement-with-new-root。要解决此问题,您必须拥有最新的 (>=1.1.0) OpenSSL and 添加 ISRG 根;您可以通过设置 ca
选项或使用环境变量 NODE_EXTRA_CA_CERTS.
在代码中执行后者
见
LetsEncrypt root certificate expiry breaks Azure Function Node application
我正在使用 nodejs 的 https 包向 shortswitch api 发出请求。它 returns 错误 'certificate has expired' 响应。 Shortswitch 没有我们可以随请求一起发送的客户端证书。他们有一个服务器端证书,该证书在通过 SSL 检查器验证时有效。 我正在使用节点版本 6.14.0(因为该应用程序正在生产并且 运行 我们还不能更新节点版本)。
关于如何解决这个问题有什么建议吗?
代码片段:
https.request('https://api.shortswitch.com/shorten?apiKey=****&longUrl=***********&format=json', function(res){
console.log("Connected");
res.on('data',function(data){
console.log(data);
});
});
编辑:我根据建议的解决方案添加了以下证书。
const ISRGCAs = [`-----BEGIN CERTIFICATE-----MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZLubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=-----END CERTIFICATE-----`];
const options = {
host: 'api.shortswitch.com',
path: '/shorten?apiKey=***&longUrl=*****&format=json',
method: 'GET',
port: 443,
ca: ISRGCAs
}
https.request(options, function(res){
var data = [];
res.on('data', function(chunk) {
data.push(chunk);
console.log((Buffer.concat(data)).toString());
});
res.on('end', function() {
var buffer = Buffer.concat(data);
console.log(buffer.toString());
});
});
但现在出现错误:
API/server没有'returning'过期;它正在使用 你的 nodejs 客户端 拒绝的 certificate/chain,因为证书来自 LetsEncrypt,默认情况下它仍然使用最后过期的 'compatibility' 根(DSTX3) 9 月,但是 大多数 客户端(包括您使用的 sslchecker)可以替换为较新的 still-valid ISRG root。
nodejs 使用 OpenSSL,默认情况下它自己的硬编码 CA 证书列表,在 nodejs 6 中不包括 ISRG 根;此外,根据您的系统和构建,它 可能 使用旧版本的 OpenSSL,它不能正确执行 replacement-with-new-root。要解决此问题,您必须拥有最新的 (>=1.1.0) OpenSSL and 添加 ISRG 根;您可以通过设置 ca
选项或使用环境变量 NODE_EXTRA_CA_CERTS.
见
LetsEncrypt root certificate expiry breaks Azure Function Node application