Ŝlosilkreado ne bezonas provizoran dosieron, kaj preterlasi ĝin riparas malpli ol plej multaj gvidiloj sugestas. Kion ĝi forigas estas dosierciklo kaj la purigkonkuro ĉirkaŭ ĝi. Kion ĝi lasas netuŝita estas ĉiu ŝanco liki la sekreton poste. La korekteca problemo en tiuj ĉi skriptoj kutime sidas aliloke, ĉar diagnozado kaj ŝlosila materialo vojaĝas per diversaj fluoj.

La dosiero neniam estis la elmeto, kiun vi pensis

Provizora dosiero estas konkreta risko, kiam ĝi estas legebla de ĉiuj, kiam ĝi postvivas kraŝon, aŭ kiam puriga paŝo estas preterlasita post escepto. Tiuj estas realaj, kaj indas ripari ilin. Ili ankaŭ estas lokaj, videblaj kaj facile testeblaj. Nomu ĉiun el ili en via propra skripto antaŭ ol konkludi, ke la ŝanĝo estis nur kosmetika.

La pli silentaj riskoj sidas malsupre: la ŝlosilo printita dum sencimigado, la escepto, kiu serialigas la tutan rezultan objekton, la kraŝtraktilo, kiu skribas kernan elfalaĵon, la protokolokolektilo, kiu ricevas la dosiervojon kaj poste la enhavon. Eviti provizoran dosieron faras nenion por iu ajn el ili, kaj kredi la malon estas kiel bonintenca reverko lasas la sekreton pli elmetita ol antaŭe. Traktu la ŝanĝon kiel unu plibonigon en sinsekvo, ne kiel la solvon.

Kion la kliento skribas, kiam neniu dosiernomo estas donita

Nunaj versioj de la kliento sendas la generitan ŝlosilon al la norma eligo, kiam la ŝlosilkomando estas donita sen eliga vojo. Ĝuste tiu dokumentita konduto ebligas la aliron per memoro, kaj ĝi forigas la bezonon de la pli malnova artifiko direkti la ilon al aparatvojo.

import subprocess
proc = subprocess.run(
    ["openvpn", "--genkey", "tls-crypt"],
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    check=True,
)
key_material = proc.stdout

Transdonu la komandon kiel liston. Ĉi tie ne necesas ŝelvastigo, kaj ŝalti ŝelon igus la argumentlimon dependa de citiloj, kiujn vi ne regas. Uzu la celitan plenumeblon per absoluta vojo, se la skripto povas ruliĝi kun alia serĉvojo ol vi atendas.

La kontrolo de la revena kodo malhelpas la sukcesan vojon daŭrigi post malsukcesa alvoko. Sen ĝi, malplena bajta ĉeno povas flui antaŭen kaj malsukcesi nur multe poste, ĉe la punkto, kie la ŝlosilo estas uzata kaj la erarmesaĝo jam tute ne plu mencias kreadon.

Du fluoj, du signifoj

La norma eligo portas la ŝlosilon. La norma eraro portas ĉion, kion la ilo volas diri al vi, inkluzive avertojn pri la agordo, la versio kaj la ŝlosiltipo. Alidirekti ambaŭ al unu bufro estas la eraro, kiu produktas kredinde aspektan ŝlosilon kun frazo enkudrita en ĝia mezo.

Tenu ankaŭ la malsukcesan vojon aparta. Kiam la alvoko malsukcesas, raportu la komandon, kiu malsukcesis, kaj la eliran staton, kaj poste decide elektu, ĉu iu ajn parto de la norma eraro sekuras montri. Elverŝi la tutan rezultan objekton en protokolon estas la ordinara ŝparvojo, kaj ĝi povas porti la ŝlosilon kun si.

Binare sekura legado gravas, se vi poste haketas aŭ komparas la materialon. Teksta reĝimo kun neatendita kodoprezento povas ŝanĝi bajtojn, kiuj neniam estis celitaj esti teksto, kaj ŝanĝita ŝlosilo ne diferencigeblas de malĝusta ĝis malsukcesas manpremo.

Se vi tamen persistigas ĝin, faru tion konscie

Plej multaj elspezoj fine bezonas la ŝlosilon sur disko, sur la pordego aŭ en sekreta konservejo. Skribu ĝin unufoje, kun restriktaj permesoj ekde kreado anstataŭ posta chmod, kaj faru la skribon atoma, por ke parta dosiero neniam fariĝu tiu, kiun servo legas ĉe starto. Renomado el vojo en la sama dosierujo kutime sufiĉas por tio. Forigu la preparan vojon en la malsukcesa branĉo, ĉar la malsukcesa skribo estas ĝuste la kopio, kiun homoj forgesas.

Agordu la dosierreĝimon ĉe kreado, kaj tenu ankaŭ la dosierujan reĝimon restrikta. Evitu ajnan vojon sub loko, kiun savkopio-tasko balaas sen pripenso, ĉar sekreto en nokta savkopio estas sekreto en ĉiu kopio de tiu savkopio. La sama rezonado validas por dividita volumo, kiun aliaj servoj povas legi.

Dividita ŝlosilo ne estas identeco

Krei ĉi tiun materialon ne eldonas atestilon, ne enskribas klienton kaj ne establas, kiu konektiĝas. La dividita ŝlosilo protektas kanalon inter partioj, kiuj jam fidas unu la alian; identeco ankoraŭ venas de la atestilo kaj de ajna aŭtentigo, kiu staras antaŭ ĝi.

Ankaŭ la ŝlosiltipoj ne estas interŝanĝeblaj. Simetria ŝlosilo por unu trajto ne estas tuja anstataŭaĵo por alia, kaj pli novaj eldonoj aldonas proprajn variantojn kun diversaj dosieroj ĉe ĉiu fino. Generu la tipon, kiun via agordo vere nomas, kaj poste uzu ĝin en la rolo, kiun tiu tipo difinas.

Testu la rezulton per reala konekto anstataŭ per inspektado de la dosiera grandeco. Se la manpremo finiĝas kaj la protokoloj montras neniujn ŝlosilajn avertojn, la krea vojo estas ĝusta; se la ŝlosilo estus detranĉita pro kunfandita fluo, la konekto malsukcesus tiel, ke ĝi indikus la partneron anstataŭ la skripton.

Rilataj artikoloj