unable to verify the first certificate
Sertifika zinciri eksik.
Bu, bağlandığınız web sunucusunun yanlış yapılandırıldığı ve size gönderdiği sertifika zincirine ara sertifikayı dahil etmediği anlamına gelir.
Sertifika zinciri
Büyük olasılıkla aşağıdaki gibi görünür:
- Sunucu sertifikası - aracı tarafından imzalanmış bir sertifikayı depolar.
- Ara sertifika - kök tarafından imzalanmış bir sertifikayı saklar.
- Kök sertifika - kendinden imzalı bir sertifika depolar.
Ara sertifika, sunucu sertifikasıyla birlikte sunucuya yüklenmelidir.
Kök sertifikalar yazılım uygulamalarına, tarayıcılara ve işletim sistemlerine yerleştirilmiştir.
Sertifikaya hizmet eden uygulamanın tüm zinciri göndermesi gerekir, bu da sunucu sertifikasının kendisi ve tüm ara maddeler anlamına gelir. Kök sertifikanın istemci tarafından bilinmesi gerekiyor.
Sorunu yeniden yaratın
Tarayıcınızı kullanarak https://incomplete-chain.badssl.com adresine gidin .
Herhangi bir hata göstermez (adres çubuğundaki asma kilit yeşildir).
Bunun nedeni , sunucudan gönderilmezse tarayıcıların zinciri tamamlama eğiliminde olmasıdır .
Şimdi Düğümü kullanarak https://incomplete-chain.badssl.com adresine bağlanın :
// index.js
const axios = require('axios');
axios.get('https://incomplete-chain.badssl.com')
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
Günlükler: " Hata: ilk sertifika doğrulanamıyor ".
Çözüm
Sertifika zincirini kendiniz tamamlamanız gerekir.
Bunu yapmak için:
1: Eksik ara sertifikayı .pem
formatta almanız gerekir , ardından
2a: Düğümün yerleşik sertifika deposunu NODE_EXTRA_CA_CERTS
,
2b: veya ca
seçeneği kullanarak kendi sertifika paketinizi (ara ürünler ve kök) geçirin .
1. Ara sertifikayı nasıl alırım?
Kullanarak openssl
( Windows için Git ile birlikte gelir ).
Uzak sunucunun sertifika ayrıntılarını kaydedin:
openssl s_client -connect incomplete-chain.badssl.com:443 -servername incomplete-chain.badssl.com | tee logcertfile
Sertifikayı veren kişiyi arıyoruz (ara sertifika, sunucu sertifikasını veren / imzalayan kişidir):
openssl x509 -in logcertfile -noout -text | grep -i "issuer"
İmza sertifikasının URI'sini size vermelidir. İndir:
curl --output intermediate.crt http://cacerts.digicert.com/DigiCertSHA2SecureServerCA.crt
Son olarak, şuna dönüştürün .pem
:
openssl x509 -inform DER -in intermediate.crt -out intermediate.pem -text
2a. NODE_EXTRA_CERTS
Dosyadaki ortam değişkenlerini ayarlamak için ortamlar arası kullanıyorum package.json
:
"start": "cross-env NODE_EXTRA_CA_CERTS=\"C:\\Users\\USERNAME\\Desktop\\ssl-connect\\intermediate.pem\" node index.js"
2b. ca
seçenek
Bu seçenek, Düğümün yerleşik kök CA'larının üzerine yazacak.
Bu yüzden kendi kök CA'mızı oluşturmamız gerekiyor. Ssl-root-cas kullanın .
Ardından, https
sertifika paketimizle (kök ve ara) yapılandırılmış özel bir aracı oluşturun . axios
Talepte bulunurken bu temsilciye iletin.
// index.js
const axios = require('axios');
const path = require('path');
const https = require('https');
const rootCas = require('ssl-root-cas').create();
rootCas.addFile(path.resolve(__dirname, 'intermediate.pem'));
const httpsAgent = new https.Agent({ca: rootCas});
axios.get('https://incomplete-chain.badssl.com', { httpsAgent })
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
Özel bir https
aracı oluşturup bunu iletmek axios
yerine, sertifikaları https
global temsilciye yerleştirebilirsiniz:
// Applies to ALL requests (whether using https directly or the request module)
https.globalAgent.options.ca = rootCas;
Kaynaklar:
- https://levelup.gitconnected.com/how-to-resolve-certificate-errors-in-nodejs-app-involving-ssl-calls-781ce48daded
- https://www.npmjs.com/package/ssl-root-cas
- https://github.com/nodejs/node/issues/16336
- https://www.namecheap.com/support/knowledgebase/article.aspx/9605/69/how-to-check-ca-chain-installation
- /superuser/97201/how-to-save-a-remote-server-ssl-certificate-locally-as-a-file/
- .Crt'yi .pem'e dönüştürme