Openssl ile bir sertifika zincirini doğrula


129

Aşağıdaki bileşenlerle kendi sertifika zinciri oluşturuyorum:

Root Certificate - Intermediate Certificate - User Certificate

Kök Sertifika, kendinden imzalı bir sertifikadır, Ara Sertifika, Kök ve Kullanıcı tarafından Ara tarafından imzalanır.

Şimdi bir Kullanıcı Sertifikasının Kök Sertifikasına göre dayanaklarının olup olmadığını doğrulamak istiyorum.

İle

openssl verify -verbose -CAfile RootCert.pem Intermediate.pem

doğrulama tamam. Bir sonraki adımda Kullanıcı Sertifikasını doğruluyorum

openssl verify -verbose -CAfile Intermediate.pem UserCert.pem

ve doğrulama gösterir

error 20 at 0 depth lookup:unable to get local issuer certificate

Yanlış olan ne?

Yanıtlar:


166

Gönderen verifybelgeler:

Kendi vericisi olan bir sertifika bulunursa, bunun kök CA olduğu varsayılır.

Başka bir deyişle, doğrulamanın çalışması için kök CA'nın kendi kendine imzalanması gerekir. Bu yüzden ikinci komutunuz işe yaramadı. Bunun yerine şunu deneyin:

openssl verify -CAfile RootCert.pem -untrusted Intermediate.pem UserCert.pem

Tüm zincirinizi tek bir komutla doğrulayacaktır.


2
Son zamanlarda bunu yapmak zorunda kaldığım için bu yanıta oy veriyorum ve tarafından listelenen farklı seçenekleri denedikten sonra man verify, -untrustedparametrenin ara sertifikayı belirtirken kullanılacak doğru olanı olduğunu buldum .
Anthony Geoghegan

Bence ikinci cevap: stackoverflow.com/a/31205833/173062 daha doğrudur - sertifika zincirini -CAfile parametresine aktarır.
Glenjamin

2
-untrustedsertifika zincirinin tamamen geçerli olup olmadığını kontrol etmez. Lütfen -CAfilediğer soruların da önerdiği gibi hem orta hem de kökten komuta geçmeyi düşünün .
Envek

2
Aşağıdakilerin olması mümkünse Intermediate.pem için -intrusted kullanın: mail.python.org/pipermail/cryptography-dev/2016-Ağustos/…
Greg Smethells

2
OP'nin istediği bu değil, ancak kendinden imzalı zinciri DEĞİLDİRMEK istemeniz durumunda, kendiniz yerine sistem / tarayıcı CA dosyasını kullanın. Örneğin homebrew kullanımından openssl ile OS X'te:openssl verify -CAfile /usr/local/etc/openssl/cert.pem -untrusted Intermediate.pem UserCert.pem
Greg Dubicki

50

Bu, aşağıdakiler için birkaç meşru işten biridir cat:

openssl verify -verbose -CAfile <(cat Intermediate.pem RootCert.pem) UserCert.pem

Güncelleme:

Greg Smethells'in yorumlarda belirttiği gibi, bu komut dolaylı olarak Intermediate.pem'e güveniyor . Greg referanslarının ilk bölümünü okumanızı tavsiye ederim (ikinci bölüm özellikle pyOpenSSL hakkındadır ve bu soruyla ilgili değildir).

Gönderinin kaybolması durumunda, önemli paragraflardan alıntı yapacağım:

Maalesef, aslında kök / kendinden imzalı bir "ara" sertifika, yukarıda verilen önerilen komut kullanıldığında güvenilir bir CA olarak değerlendirilecektir :

$ openssl doğrula -CAfile <(cat geotrust_global_ca.pem rogue_ca.pem) fake_sometechcompany_from_rogue_ca.com.pem fake_sometechcompany_from_rogue_ca.com.pem: Tamam

Görünüşe göre openssl, bir kök sertifika ile karşılaşıldığında zinciri doğrulamayı durduracak, eğer kendinden imzalıysa Intermediate.pem de olabilir. Bu durumda RootCert.pem dikkate alınmaz. Bu nedenle, yukarıdaki komuta güvenmeden önce Intermediate.pem'in güvenilir bir kaynaktan geldiğinden emin olun.


Bu, ara sertifikayı kök sertifika ile gerçekten doğrular mı?
augurar

Olur. Komutları doğru olduğunu bildiğim bir zincirle (işverenime üretim trafiğine hizmet ediyor) ve ardından yine başka bir ilgisiz kök sertifikayla yeniden çalıştırdım. Transkript özüne bakın .
Peter

8
UYARI: Intermediate.pem hiç güvenilmezse bunu KULLANMAYIN . Daha fazla bilgi için burayı okuyun: mail.python.org/pipermail/cryptography-dev/2016-Ağustos/…
Greg Smethells

1
Bunu gösterdiğin için teşekkürler Greg. Cevabı verdiğimde, ihraççıların ana sayfalarından hem kökleri hem de ara maddeleri indirdim, böylece düşünce aklıma gelmedi. Cevabı, ara maddeye dolaylı olarak bu komutla güvenildiğini açıklığa kavuşturmak için güncelledim.
Peter

1
@somenickname, Tony'nin yorumuna bakın. Güvenilmeyen seçeneği yine de tercih edilir. Daha fazla yardım istiyorsanız kendi sorunuzu sormanızı öneririm. Yorumlar, sorununuzu gidermek için doğru yer değildir.
Peter

18

Sorun şu ki openssl -verify, bu işi yapmıyor.

Priyadi'nin de belirttiği gibi , openssl -verifyilk kendinden imzalı sertifikada durur, bu nedenle ara sertifika otomatik olarak imzalandığından zinciri gerçekten doğrulamazsınız.

Üretken web hizmetine yüklemeyi denemeden önce sertifika dosyalarının doğru olduğundan% 101 emin olmak istediğinizi varsayıyorum. Buradaki tarif tam olarak bu uçuş öncesi kontrolü gerçekleştirir.

Lütfen Peter'ın cevabının doğru olduğuna dikkat edin , ancak çıktısı, openssl -verifyher şeyin daha sonra gerçekten çalıştığına dair hiçbir ipucu değildir . Evet, bazı sorunlar bulabilir, ancak hepsi değil.

Burada, siz onu Apache'ye kurmadan önce bir sertifika zincirini doğrulama görevini yapan bir betik var. Belki bu, daha mistik OpenSSL büyüsünün bir kısmı ile geliştirilebilir, ancak OpenSSL gurusu değilim ve aşağıdaki çalışmalar:

#!/bin/bash
# This Works is placed under the terms of the Copyright Less License,
# see file COPYRIGHT.CLL.  USE AT OWN RISK, ABSOLUTELY NO WARRANTY. 
#
# COPYRIGHT.CLL can be found at http://permalink.de/tino/cll
# (CLL is CC0 as long as not covered by any Copyright)

OOPS() { echo "OOPS: $*" >&2; exit 23; }

PID=
kick() { [ -n "$PID" ] && kill "$PID" && sleep .2; PID=; }
trap 'kick' 0

serve()
{
kick
PID=
openssl s_server -key "$KEY" -cert "$CRT" "$@" -www &
PID=$!
sleep .5    # give it time to startup
}

check()
{
while read -r line
do
    case "$line" in
    'Verify return code: 0 (ok)')   return 0;;
    'Verify return code: '*)    return 1;;
#   *)  echo "::: $line :::";;
    esac
done < <(echo | openssl s_client -verify 8 -CApath /etc/ssl/certs/)
OOPS "Something failed, verification output not found!"
return 2
}

ARG="${1%.}"
KEY="$ARG.key"
CRT="$ARG.crt"
BND="$ARG.bundle"

for a in "$KEY" "$CRT" "$BND"
do
    [ -s "$a" ] || OOPS "missing $a"
done

serve
check && echo "!!! =========> CA-Bundle is not needed! <========"
echo
serve -CAfile "$BND"
check
ret=$?
kick

echo
case $ret in
0)  echo "EVERYTHING OK"
    echo "SSLCertificateKeyFile $KEY"
    echo "SSLCertificateFile    $CRT"
    echo "SSLCACertificateFile  $BND"
    ;;
*)  echo "!!! =========> something is wrong, verification failed! <======== ($ret)";;
esac

exit $ret

Sonraki çıktının EVERYTHING OKApache ayarı olduğuna dikkat edin , çünkü kullanan NginXveya haproxygenellikle bunu mükemmel okuyup anlayabilen insanlar ;)

Bunun bazı güncellemeleri olabilecek bir GitHub Özü var

Bu komut dosyasının ön koşulları:

  • Her /etc/ssl/certszamanki gibi, örneğin Ubuntu'da güvenilir CA kök verilerine sahipsiniz
  • DIR3 dosyayı sakladığınız bir dizin oluşturun :
    • DIR/certificate.crt sertifikayı içeren
    • DIR/certificate.key web hizmetiniz için gizli anahtarı içeren (parola olmadan)
    • DIR/certificate.bundleCA-Bundle içeren. Paketin nasıl hazırlanacağı hakkında aşağıya bakın.
  • Şimdi betiği çalıştırın: ./check DIR/certificate(bu, betiğin checkgeçerli dizinde adlandırıldığını varsayar )
  • Betiğin çıktı vermesi pek olası olmayan bir durum var CA-Bundle is not needed. Bu, (oku /etc/ssl/certs/:) imzalama sertifikasına zaten güvendiğiniz anlamına gelir . Ancak bu WWW'de pek olası değil.
  • Bu test için bağlantı noktası 4433 iş istasyonunuzda kullanılmamış olmalıdır. Ve bunu yalnızca güvenli bir ortamda çalıştırmanız daha iyi olur, çünkü 4433 numaralı bağlantı noktasını kısa süre içinde halka açar, bu da düşmanca bir ortamda yabancı bağlantılara neden olabilir.

certificate.bundleDosya nasıl oluşturulur ?

WWW'de güven zinciri genellikle şöyle görünür:

  • güvenilir sertifika /etc/ssl/certs
  • bilinmeyen ara sertifikalar, muhtemelen başka bir CA tarafından çapraz imzalanmış
  • sertifikanız ( certificate.crt)

Şimdi, değerlendirme aşağıdan yukarıya doğru gerçekleşir, bu, önce sertifikanızın okunduğu, ardından bilinmeyen ara sertifikaya ihtiyaç duyulduğu, ardından belki çapraz imzalama sertifikasına ihtiyaç duyulduğu ve ardından /etc/ssl/certsuygun güvenilir sertifikayı bulmak için danışıldığı anlamına gelir.

Ca paketi, tam olarak doğru işleme sırasına göre oluşturulmalıdır, bu, ihtiyaç duyulan ilk sertifika (sertifikanızı imzalayan ara sertifika) pakette ilk sırada yer aldığı anlamına gelir. Ardından çapraz imzalama sertifikasına ihtiyaç vardır.

Genellikle CA'nız (sertifikanızı imzalayan yetkili) zaten böyle uygun bir ca-bundle-dosyası sağlayacaktır. Değilse, gerekli tüm ara sertifikaları ve catbunları tek bir dosyada (Unix'te) seçmeniz gerekir . Windows'ta bir metin düzenleyici (gibi notepad.exe) açıp sertifikaları dosyaya yapıştırabilirsiniz, ilk önce gerekli olan ve diğerlerini takip edin.

Başka bir şey daha var. Dosyaların PEM formatında olması gerekir. Bazı CA'lar DER (ikili) formatı yayınlar. PEM'i tespit etmek kolaydır: ASCII tarafından okunabilir. Bir şeyin PEM'e nasıl dönüştürüleceğiyle ilgili daha fazla bilgi için .crt'yi .pem'e dönüştürme konusuna bakın ve sarı tuğlalı yolu izleyin.

Misal:

Var:

  • intermediate2.crt imzalayan ara sertifika certificate.crt
  • intermediate1.crt şarkı söyleyen başka bir ara sertifika intermediate2.crt
  • crossigned.crt başka bir CA'dan çapraz imzalama sertifikası olan intermediate1.crt
  • crossintermediate.crtbu, imzalanan diğer CA'dan başka bir aracıdır crossigned.crt(muhtemelen böyle bir şeyi asla görmeyeceksiniz)

O zaman doğru kişi catşöyle görünür:

cat intermediate2.crt intermediate1.crt crossigned.crt crossintermediate.crt > certificate.bundle

Ve hangi dosyaların gerekli olup olmadığını ve hangi sırada olduğunu nasıl öğrenebilirsiniz?

Pekala, deney, checksana her şeyin yolunda olduğunu söyleyene kadar . Bilmeceyi çözmek için bir bilgisayar bulmaca oyunu gibidir. Her. Tek. Zaman. Profesyoneller için bile. Ancak bunu her yapmanız gerektiğinde daha iyi olacaksınız. Yani tüm bu acıyla kesinlikle yalnız değilsiniz. SSL, biliyor musun? SSL, muhtemelen 30 yılı aşkın profesyonel sistem yönetiminde gördüğüm en kötü tasarımlardan biridir. Son 30 yılda kripto paranın neden ana akım haline gelmediğini hiç merak ettiniz mi? Bu yüzden. 'nuff dedi.


Olumsuz oy verene: Lütfen cevabımda neyin yanlış olduğunu açıklayın. Teşekkürler.
Tino

2
Ben olumsuz oy verenlerden biriyim. Olumsuz oyu tetikleyen şey şudur: "Ve hangi dosyaların gerekli olup olmadığını ve hangi sırayla olduğunu nasıl öğrenebilirsiniz? Pekala, kontrol size her şeyin yolunda olduğunu söyleyene kadar deneyin." SSL'nin özel bir durum olduğunu düşünmüyorum. Bunun gibi problemlerin deterministik bir çözümü olmalıdır.
ychaouche

2
@ychaouche Teşekkürler! Senin gibi ben yok edici şeyleri severim. Soru, "Sorun nedir" ve "openssl doğrula" ile nasıl yapılacağıydı. Stackoverflow üzerindeyken, bunu programlı (dolayısıyla belirleyici) bir evet / hayır cevabı izlediğini açıkladım. Hatta bunu, üretime yüklemeden önce yeni Paket için kontrolleri otomatikleştirmek için bile kullanabilirsiniz. Bu, soruyu tam olarak yanıtlar. Sevmediğiniz şey, "Uygun bir paket nasıl oluşturulur?" Konusundaki hayal kırıklığından bahsetmiş olmam. Bunun için kısa bir deterministik cevap olamayacağını düşündüğüm için, buna cevap vermek buradaki bağlamda offtopik olacaktır.
Tino

6
"Priyadi'nin bahsettiği gibi, openssl -doğrulama ilk kendi kendine imzalanan sertifikada durur, bu nedenle ara sertifika otomatik olarak imzalandığı için zinciri gerçekten doğrulamazsınız." Açıktır ki, ara sertifikalar asla kendi kendine imzalanmaz (olsaydı kök sertifikalar olurdu). Ve tüm doğrulama noktası, zincire tüm sertifikaları güvenilir bir kök sertifikaya kadar dahil edip etmediğinizi kontrol etmektir. Bu tam olarak openssl doğrulamasının yaptığı şeydir. Bununla birlikte, openssl güvenen politikalarıyla oldukça muhafazakar olma eğilimindedir ...
Timo

4
"genellikle ara sertifika kendi kendine imzalanır". Bu yanlıştır ve bunun gibi terminoloji kafa karışıklıkları, yeni gelenlerin doğru şekilde açıklandığında aslında oldukça basit olan bir konuyu anlamasını zorlaştırır. RFC 5280'den: "[...] CA sertifikaları ayrıca üç sınıfa ayrılabilir: çapraz sertifikalar, kendi kendine verilen sertifikalar ve kendinden imzalı sertifikalar. Çapraz sertifikalar, verenin ve öznenin farklı varlıklar olduğu CA sertifikalarıdır Çapraz sertifikalar, iki CA arasındaki bir güven ilişkisini tanımlar. [...] ".
Dr Jan-Philip Gehrcke

8

Letsencrypt sertifikası için doğrulama yapmak zorunda kaldım ve bunu şöyle yaptım:

  1. Letsencrypt güven zincirinden kök sertifika ve ara sertifikayı indirin .
  2. Bu komutu verin:

    $ openssl verify -CAfile letsencrypt-root-cert/isrgrootx1.pem.txt -untrusted letsencrypt-intermediate-cert/letsencryptauthorityx3.pem.txt /etc/letsencrypt/live/sitename.tld/cert.pem 
    /etc/letsencrypt/live/sitename.tld/cert.pem: OK
    

1
Görünüşe göre John teşekkür ederim dememden hoşlanmadı. Zor "Teşekkür ederim" konusunda ısrar ediyorum, işte silinen metin: Umarım letencrypt sertifikalarınız için size yardımcı olur. Priyadi için teşekkürler, çözümünüz bu komutu bulmama yardımcı oldu. Lütfen çözümüne olumlu oy verdiğinizden emin olun.
Michael

5

SSL sertifikaları hakkında önceden bilgi sahibi olmadan aynı konuda tüm günü kırdıktan sonra, CERTivity Anahtar Depoları Yöneticisini indirdim ve anahtar depomu ona aktardım ve sertifika zincirinin net bir görselleştirmesini aldım.

Ekran görüntüsü:

görüntü açıklamasını buraya girin


1
Nasıl kullanılacağı ile ilgili soruya cevap vermeye çalışmaz openssl verify.
binki

evet, ancak bu tür bir araç, openssl komut satırı araçlarının şifreli bilgilerini anlamazsanız size bu tür şeylerin gerekli görselleştirmesini sağlayabilir :) İşte benim olumlu oyum, bunu da yapan bazı çevrimiçi şeyler olabilir.
David 天宇 Wong

2

Yalnızca doğrulamak istiyorsanız düzenleyicinizle ait UserCert.pem gerçekte olduğu Intermediate.pem (örnek kullanımları: aşağıdakileri yapmanız OpenSSL 1.1.1):

openssl verify -no-CAfile -no-CApath -partial_chain -trusted Intermediate.pem UserCert.pem

ve alacaksın:

UserCert.pem: OK

veya

UserCert.pem: verification failed

openssl verify -no-CAfile -no-CApath -partial_chain -trusted Intermediate.pem UserCert.pemPython 3.7'de herhangi bir eşdeğer komut var mı?
Bogota

-5

Openssl ile bir sertifika zincirini kolayca doğrulayabilirsiniz. Tam zincir CA sertifikasını içerecektir, bu nedenle CA ve sertifikanın kendisi hakkındaki ayrıntıları görmelisiniz.

openssl x509 - fullchain.pem'de --metin - yok


4
1) Bu tamamen herhangi bir açıklama içermiyor. 2) bu, soruyu soranın herhangi bir bağlam olmaksızın sormadığı bir soruya verilen cevaptır.
Shadur
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.