Sorun şu ki openssl -verify
, bu işi yapmıyor.
Priyadi'nin de belirttiği gibi , openssl -verify
ilk 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 -verify
her ş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 OK
Apache ayarı olduğuna dikkat edin , çünkü kullanan NginX
veya haproxy
genellikle 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/certs
zamanki gibi, örneğin Ubuntu'da güvenilir CA kök verilerine sahipsiniz
DIR
3 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.bundle
CA-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 check
geç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.bundle
Dosya 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/certs
uygun 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 cat
bunları 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.crt
bu, 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, check
sana 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.
man verify
,-untrusted
parametrenin ara sertifikayı belirtirken kullanılacak doğru olanı olduğunu buldum .