openssl ca: tarikh luput tidak sah dalam index.txt dan cara membaikinya
CA enggan mengeluarkan kerana satu baris dalam index.txt tidak dapat dihuraikan. Salin keadaan CA, nyahkod entri itu, kemudian selaraskannya dengan sijil yang ditandatangani.
Satu larian pengeluaran berhenti dengan entry 22: invalid expiry date, sedangkan permintaan di hadapan anda sepenuhnya betul. Aduan itu datang daripada penghurai pangkalan data CA, bukan daripada CSR dan bukan daripada klien VPN yang akhirnya akan mengemukakan sijil itu. Perbezaan itulah yang menentukan segala-galanya selepas itu: rekod itu cacat, jadi pembaikan terletak pada keadaan CA, bukan pada permintaan atau konfigurasi rakan sebaya. Layankan entri bernombor itu sebagai satu baris dalam index.txt, dan masalahnya mengecil kepada soalan data terbatas dengan jawapan yang boleh disemak.
Baca ralat itu sebagai aduan pangkalan data
Setiap openssl ca seruan menelusuri pangkalan data teksnya sebelum menandatangani apa-apa. Setiap baris mengandungi huruf status, cap masa luput, cap masa pembatalan pilihan, nombor siri dalam heks, nama fail dan subjek. Apabila satu medan tidak dapat dihurai, arahan itu melaporkan nombor baris dan berhenti daripada meneka baki rekod.
Berhenti itu bersifat melindungi, bukan terlalu teliti. Rekod yang tidak dapat dibaca oleh alat itu membuatkannya tidak dapat memutuskan sama ada subjek yang diminta sudah wujud, sama ada nombor siri sudah dikeluarkan, atau apa yang sepatutnya terkandung dalam CRL seterusnya. Meneruskan melepasi baris rosak akan menghasilkan ketakkonsistenan senyap yang muncul berbulan-bulan kemudian, biasanya semasa pembatalan yang tiada siapa dapat menjelaskan. Baca mesej itu sebagai aduan tentang data, dan siasatan kekal di dalam direktori CA.
Salin keadaan CA sebelum menyentuh apa-apa
Ambil syot kilat seluruh direktori CA, bukan hanya fail pangkalan data. Indeks, fail atributnya, fail nombor siri dan nombor CRL, kunci peribadi serta sijil yang dikeluarkan semuanya terlibat dalam operasi kemudian, dan pembaikan yang memulihkan satu sambil meninggalkan yang lain mencipta insiden kedua. Gunakan rutin sandaran CA itu sendiri jika ada, dan hentikan pengeluaran berjadual sepanjang kerja itu.
Catat binaan OpenSSL dan fail konfigurasi yang benar-benar dimuatkan oleh arahan yang gagal. Pemasangan sering menyimpan lebih daripada satu direktori CA, dan ralat itu hanya bermakna terhadap pangkalan data yang dinamakan oleh konfigurasi yang dipilih.
Cari entri itu dan nyahkod medan tarikhnya
Nombor baris yang dilaporkan dikira dari rekod pertama, jadi sed -n '22p' index.txt mendarat pada entri bermasalah itu setelah anda mengesahkan tiada baris kosong atau komen di atasnya. Cetak baris itu dengan pemisah yang kelihatan, kerana tab dan ruang di hujung adalah biasa dan tidak kelihatan dalam tetingkap editor biasa.
Medan luput ialah cap masa yang lebarnya bergantung pada tahun. Nilai sehingga 2049 ditulis dalam UTCTime sebagai YYMMDDHHMMSSZ, manakala nilai kemudian beralih kepada GeneralizedTime dengan tahun empat digit. Rekod yang mencampurkan kedua-dua bentuk, atau yang membawa tahun dua digit di tempat penghurai kini menjangka empat, gagal tepat pada titik ini. Begitu juga medan terpotong yang ditinggalkan oleh tulisan yang terhenti.
Bandingkan rekod itu dengan sijil yang dirujuknya, bukan dengan fail CA lain. Sijil yang ditandatangani ialah autoriti tentang apa yang sepatutnya dikatakan oleh kesahan, dan ia sudah wujud sebagai objek yang boleh dihurai.
Baiki rekod itu berdasarkan sijil yang ditandatangani
Baca tarikh sebenar dengan openssl x509 -in issued.pem -noout -dates -serial -subject. Tukar notAfter kepada lebar cap masa yang ditulis oleh binaan anda untuk tahun itu, dan sahkan nombor siri sepadan dengan entri yang akan anda sunting sebelum menukar satu aksara pun.
Sunting hanya medan yang rosak, kekalkan huruf status dan nombor siri, dan biarkan seluruh baris yang lain. Jika rekod itu tidak dapat diselaraskan dengan mana-mana sijil yang ditandatangani, layankan sebagai entri tersesat dan persarakan ia melalui laluan pembatalan CA itu sendiri daripada memadam baris itu dengan tangan.
Jangan baiki dengan memotong tarikh supaya sesuai dengan tekaan tentang tahun. Potongan dua aksara tidak mudah alih antara binaan, dan ia secara senyap mengubah kesahan yang dilaporkan pangkalan data kepada pemeriksaan subjek pendua dan CRL pada masa hadapan. Apabila nilai asal tidak dapat dipulihkan, keluarkan semula di bawah nombor siri baharu dan catat mengapa yang lama ditinggalkan. Jejak audit ialah bahagian pembaikan, bukan kerja kertas di sekelilingnya.
Sahkan pengeluaran dan penjanaan CRL sebelum anda beredar
Jalankan satu pengeluaran dengan konfigurasi yang sama dan sahkan ia selesai tanpa aduan nombor baris. Kemudian jana CRL dengan openssl ca -gencrl -config openssl.cnf dan periksa bahawa ia dapat dihurai, kerana rekod yang rosak sering muncul di situ dan bukan semasa penandatanganan.
Periksa sijil baharu dengan openssl x509 -noout -dates -serial dan bandingkannya dengan baris yang baru ditulis oleh CA. Sahkan huruf status dan tarikh luput bersetuju dengan sijil itu, dan sahkan bahawa openssl verify -CAfile ca.pem issued.pem kembali tanpa ralat. Kemudian pulihkan pengeluaran berjadual dan pantau larian pertama, kerana baris cacat kedua akan mengumumkan dirinya serta-merta.