ปัญหาคือopenssl -verify
ไม่ได้ทำงาน
ดังที่ Priyadi กล่าวไว้ให้openssl -verify
หยุดที่ใบรับรองที่ลงนามด้วยตนเองครั้งแรกดังนั้นคุณจึงไม่ได้ตรวจสอบห่วงโซ่จริงๆเนื่องจากใบรับรองระดับกลางมักจะลงนามด้วยตนเอง
ฉันคิดว่าคุณต้องแน่ใจ 101% ว่าไฟล์ใบรับรองนั้นถูกต้องก่อนที่คุณจะพยายามติดตั้งในบริการเว็บที่มีประสิทธิผล สูตรนี้ที่นี่ดำเนินการตรวจสอบก่อนเที่ยวบินนี้
โปรดทราบว่าคำตอบของ Peter ถูกต้องอย่างไรก็ตามผลลัพธ์ของopenssl -verify
ไม่มีเงื่อนงำที่ทุกอย่างจะได้ผลในภายหลัง ใช่อาจพบปัญหาบางอย่าง แต่ก็ไม่ใช่ทั้งหมด
นี่คือสคริปต์ที่ทำหน้าที่ตรวจสอบห่วงโซ่ใบรับรองก่อนที่คุณจะติดตั้งลงใน Apache บางทีสิ่งนี้อาจเพิ่มขึ้นได้ด้วยเวทมนตร์ OpenSSL ที่ลึกลับกว่านี้ แต่ฉันไม่ใช่กูรู OpenSSL และผลงานต่อไปนี้:
#!/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
โปรดทราบว่าผลลัพธ์ที่ตามมาEVERYTHING OK
คือการตั้งค่า Apache เนื่องจากคนที่ใช้NginX
หรือhaproxy
โดยปกติสามารถอ่านและเข้าใจสิ่งนี้ได้อย่างสมบูรณ์เช่นกัน;)
มีGitHub Gistซึ่งอาจมีการอัปเดตบางอย่าง
ข้อกำหนดเบื้องต้นของสคริปต์นี้:
- คุณมีข้อมูลราก CA ที่เชื่อถือได้
/etc/ssl/certs
ตามปกติเช่นบน Ubuntu
- สร้างไดเร็กทอรี
DIR
ที่คุณจัดเก็บ 3 ไฟล์:
DIR/certificate.crt
ซึ่งมีใบรับรอง
DIR/certificate.key
ซึ่งมีรหัสลับสำหรับบริการเว็บของคุณ (ไม่มีข้อความรหัสผ่าน)
DIR/certificate.bundle
ซึ่งประกอบด้วย CA-Bundle เกี่ยวกับวิธีการเตรียมชุดดูด้านล่าง
- ตอนนี้เรียกใช้สคริปต์:
./check DIR/certificate
(ซึ่งถือว่าสคริปต์มีชื่อcheck
อยู่ในไดเร็กทอรีปัจจุบัน)
CA-Bundle is not needed
มีกรณีที่ไม่น่าเป็นที่ผลสคริปต์ ซึ่งหมายความว่าคุณ (อ่าน/etc/ssl/certs/
:) เชื่อถือใบรับรองการลงนามแล้ว แต่สิ่งนี้ไม่น่าเกิดขึ้นอย่างมากใน WWW
- สำหรับพอร์ตทดสอบ 4433 นี้ต้องไม่ได้ใช้งานบนเวิร์กสเตชันของคุณ และควรรันสิ่งนี้ในสภาพแวดล้อมที่ปลอดภัยเท่านั้นเนื่องจากจะเปิดพอร์ต 4433 ต่อสาธารณะในไม่ช้าซึ่งอาจเห็นการเชื่อมต่อต่างประเทศในสภาพแวดล้อมที่ไม่เป็นมิตร
จะสร้างcertificate.bundle
ไฟล์ได้อย่างไร?
ใน WWW เครือข่ายความไว้วางใจมักจะมีลักษณะดังนี้:
- ใบรับรองที่เชื่อถือได้จาก
/etc/ssl/certs
- ใบรับรองระดับกลางที่ไม่รู้จักอาจมีการลงนามข้ามโดย CA อื่น
- ใบรับรองของคุณ (
certificate.crt
)
ตอนนี้การประเมินจะเกิดขึ้นจากล่างขึ้นบนนั่นหมายความว่าอันดับแรกใบรับรองของคุณจะถูกอ่านจากนั้นจึงจำเป็นต้องมีใบรับรองระดับกลางที่ไม่รู้จักจากนั้นอาจจะต้องใช้ใบรับรองการเซ็นชื่อข้ามจากนั้น/etc/ssl/certs
จึงได้รับการปรึกษาเพื่อค้นหาใบรับรองที่เชื่อถือได้ที่เหมาะสม
ca-bundle จะต้องประกอบขึ้นตามลำดับการประมวลผลที่ถูกต้องซึ่งหมายความว่าใบรับรองที่จำเป็นอันดับแรก (ใบรับรองระดับกลางที่ลงนามในใบรับรองของคุณ) จะมาเป็นอันดับแรกในกลุ่ม จากนั้นต้องใช้ใบรับรองการลงนามข้ามกัน
โดยปกติแล้ว CA ของคุณ (หน่วยงานที่ลงนามในใบรับรองของคุณ) จะให้ไฟล์ ca-bundle-file ที่เหมาะสมดังกล่าวอยู่แล้ว หากไม่เป็นเช่นนั้นคุณต้องเลือกใบรับรองระดับกลางที่จำเป็นทั้งหมดและcat
รวมกันเป็นไฟล์เดียว (บน Unix) ใน Windows คุณสามารถเปิดโปรแกรมแก้ไขข้อความ (เช่นnotepad.exe
) และวางใบรับรองลงในไฟล์ได้โดยอันดับแรกต้องอยู่ด้านบนและทำตามรายการอื่น ๆ
ยังมีอีกสิ่งหนึ่ง ไฟล์ต้องอยู่ในรูปแบบ PEM CA บางรายการออกรูปแบบ DER (ไบนารี) PEM สามารถมองเห็นได้ง่าย: ASCII สามารถอ่านได้ สำหรับวิธีการแปลงบางสิ่งเป็น PEM โปรดดูวิธีการแปลง. crt เป็น. pemและทำตามถนนอิฐสีเหลือง
ตัวอย่าง:
คุณมี:
intermediate2.crt
ใบรับรองระดับกลางซึ่งลงนามในไฟล์ certificate.crt
intermediate1.crt
ใบรับรองระดับกลางอื่นซึ่งร้องเพลง intermediate2.crt
crossigned.crt
ซึ่งเป็นใบรับรองการลงนามไขว้จาก CA อื่นซึ่งลงนาม intermediate1.crt
crossintermediate.crt
ซึ่งเป็นสื่อกลางอื่นจาก CA อื่นที่ลงนามcrossigned.crt
(คุณอาจไม่เคยเห็นสิ่งนี้)
จากนั้นค่าที่เหมาะสมcat
จะมีลักษณะดังนี้:
cat intermediate2.crt intermediate1.crt crossigned.crt crossintermediate.crt > certificate.bundle
และคุณจะทราบได้อย่างไรว่าไฟล์ใดที่จำเป็นหรือไม่และอยู่ในลำดับใด
ทดลองจนกว่าคำตอบcheck
จะบอกคุณว่าทุกอย่างเรียบร้อยดี มันเป็นเหมือนเกมปริศนาคอมพิวเตอร์เพื่อไขปริศนา ทุกๆ เดียว เวลา. แม้สำหรับมืออาชีพ แต่คุณจะดีขึ้นทุกครั้งที่ต้องทำสิ่งนี้ ดังนั้นคุณไม่ได้อยู่คนเดียวกับความเจ็บปวดทั้งหมดนั้นแน่นอน มันคือ SSL รู้ไหม SSL อาจเป็นหนึ่งในการออกแบบที่แย่ที่สุดที่ฉันเคยเห็นในการดูแลระบบมืออาชีพกว่า 30 ปี เคยสงสัยไหมว่าทำไม crypto ถึงไม่กลายเป็นกระแสหลักในช่วง 30 ปีที่ผ่านมา? นั่นเป็นเหตุผลว่าทำไม 'Nuff กล่าวว่า.
man verify
ฉันพบว่า-untrusted
พารามิเตอร์เป็นพารามิเตอร์ที่ถูกต้องที่จะใช้เมื่อระบุใบรับรองระดับกลาง