Masalahnya adalah, itu openssl -verify
tidak melakukan pekerjaan.
Seperti yang disebutkan Priyadi , openssl -verify
berhenti pada sertifikat yang ditandatangani sendiri pertama, maka Anda tidak benar-benar memverifikasi rantai, karena seringkali sertifikat perantara ditandatangani sendiri.
Saya berasumsi bahwa Anda ingin 101% yakin, bahwa file sertifikat sudah benar sebelum Anda mencoba menginstalnya di layanan web produktif. Resep ini di sini melakukan persis seperti pra-penerbangan-cek ini.
Harap dicatat bahwa jawaban Peter benar , namun hasil dari openssl -verify
tidak ada petunjuk bahwa semuanya benar-benar berfungsi sesudahnya. Ya, mungkin menemukan beberapa masalah, tetapi tidak semua.
Berikut ini adalah skrip yang melakukan pekerjaan untuk memverifikasi rantai sertifikat sebelum Anda menginstalnya ke dalam Apache. Mungkin ini dapat ditingkatkan dengan beberapa keajaiban OpenSSL yang lebih mistik, tetapi saya bukan guru OpenSSL dan karya-karya berikut:
#!/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
Perhatikan bahwa output setelahnya EVERYTHING OK
adalah pengaturan Apache, karena orang yang menggunakan NginX
atau haproxy
biasanya dapat membaca dan memahami ini juga;)
Ada GitHub Gist ini yang mungkin memiliki beberapa pembaruan
Prasyarat skrip ini:
- Anda memiliki data root CA tepercaya
/etc/ssl/certs
seperti biasa misalnya di Ubuntu
- Buat direktori
DIR
tempat Anda menyimpan 3 file:
DIR/certificate.crt
yang berisi sertifikat
DIR/certificate.key
yang berisi kunci rahasia untuk layanan web Anda (tanpa frasa sandi)
DIR/certificate.bundle
yang berisi CA-Bundle. Tentang cara menyiapkan bundel, lihat di bawah.
- Sekarang jalankan skrip:
./check DIR/certificate
(ini mengasumsikan bahwa skrip dinamai check
dalam direktori saat ini)
- Ada kasus yang sangat tidak mungkin yang dihasilkan skrip
CA-Bundle is not needed
. Ini berarti bahwa Anda (baca /etc/ssl/certs/
:) sudah mempercayai sertifikat penandatanganan. Tapi ini sangat tidak mungkin di WWW.
- Untuk port tes ini, 4433 harus tidak digunakan di workstation Anda. Dan lebih baik hanya menjalankan ini di lingkungan yang aman, karena membuka port 4433 segera ke publik, yang mungkin melihat orang asing terhubung dalam lingkungan yang bermusuhan.
Bagaimana cara membuat certificate.bundle
file?
Di WWW rantai kepercayaan biasanya terlihat seperti ini:
- sertifikat tepercaya dari
/etc/ssl/certs
- sertifikat perantara tidak dikenal, mungkin ditandatangani oleh CA lain
- sertifikat Anda (
certificate.crt
)
Sekarang, evaluasi berlangsung dari bawah ke atas, ini berarti, pertama, sertifikat Anda dibaca, maka sertifikat perantara yang tidak diketahui diperlukan, kemudian mungkin sertifikat penandatanganan silang dan kemudian /etc/ssl/certs
dikonsultasikan untuk menemukan sertifikat tepercaya yang tepat.
Bundel harus dibuat dalam urutan pemrosesan yang tepat, ini berarti, sertifikat yang diperlukan pertama (sertifikat perantara yang menandatangani sertifikat Anda) datang terlebih dahulu dalam bundel. Maka lintas-penandatanganan sertifikat diperlukan.
Biasanya CA Anda (otoritas yang menandatangani sertifikat Anda) akan sudah menyediakan file ca-bundle yang tepat. Jika tidak, Anda harus memilih semua sertifikat perantara yang diperlukan dan cat
semuanya menjadi satu file (pada Unix). Di Windows, Anda cukup membuka editor teks (seperti notepad.exe
) dan menempelkan sertifikat ke dalam file, yang pertama diperlukan di atas dan mengikuti yang lain.
Ada satu hal lagi. File harus dalam format PEM. Beberapa CA mengeluarkan format DER (biner). PEM mudah dikenali: ASCII dapat dibaca. Untuk lebih lanjut tentang cara mengubah sesuatu menjadi PEM, lihat Cara mengkonversi .crt ke .pem dan ikuti jalan bata kuning.
Contoh:
Kamu punya:
intermediate2.crt
sertifikat lanjutan yang menandatangani certificate.crt
intermediate1.crt
sertifikat perantara lain, yang dinyanyikan intermediate2.crt
crossigned.crt
yang merupakan sertifikat penandatanganan silang dari CA lain, yang ditandatangani intermediate1.crt
crossintermediate.crt
yang merupakan perantara lain dari CA lain yang menandatangani crossigned.crt
(Anda mungkin tidak akan pernah melihat hal seperti itu)
Maka yang tepat cat
akan terlihat seperti ini:
cat intermediate2.crt intermediate1.crt crossigned.crt crossintermediate.crt > certificate.bundle
Dan bagaimana Anda bisa mengetahui file mana yang dibutuhkan atau tidak dan dalam urutan apa?
Nah, bereksperimen, sampai check
memberitahu Anda semuanya baik-baik saja. Ini seperti permainan puzzle komputer untuk memecahkan teka-teki itu. Setiap. Tunggal. Waktu. Bahkan untuk pro. Tetapi Anda akan menjadi lebih baik setiap kali Anda perlu melakukan ini. Jadi, Anda pasti tidak sendirian dengan semua rasa sakit itu. Ini SSL, Anda tahu? SSL mungkin adalah salah satu desain terburuk yang pernah saya lihat dalam lebih dari 30 tahun administrasi sistem profesional. Pernah bertanya-tanya mengapa crypto belum menjadi arus utama dalam 30 tahun terakhir? Itu sebabnya. kata Nuff.
man verify
, saya menemukan bahwa-untrusted
parameter adalah yang benar untuk digunakan ketika menentukan sertifikat perantara.