File: recreate-certs

package info (click to toggle)
tcllib 1.21%2Bdfsg-1
  • links: PTS
  • area: main
  • in suites: bookworm
  • size: 69,456 kB
  • sloc: tcl: 266,493; ansic: 14,259; sh: 2,936; xml: 1,766; yacc: 1,145; pascal: 881; makefile: 112; perl: 84; f90: 84; python: 33; ruby: 13; php: 11
file content (77 lines) | stat: -rwxr-xr-x 1,939 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#! /usr/bin/env tclsh

set dir [file normalize [file dirname [info script]]]

lappend auto_path [file join $dir ..]

package require pki 0.10

proc loadCertData {directory} {
    foreach certFile [glob -nocomplain -directory $directory *.crt] {
	set rootFile [file rootname $certFile]
	set id [file tail $rootFile]
	set keyFile "${rootFile}.key"
	set keyPassFile "${rootFile}.key.password"

	if {![file readable $certFile] || ![file readable $keyFile]} {
	    continue
	}

	set password ""
	if {[file exists $keyPassFile]} {
	    set fd [open $keyPassFile r]
	    set password [gets $fd]
	    close $fd
	}

	set fd [open $certFile]
	set cert [dict get [::pki::parse [read $fd]] certificate]
	close $fd

	set fd [open $keyFile]
	set cert [dict merge $cert [::pki::pkcs::parse_key [read $fd] $password]]
	close $fd

	dict set toProcess $id [dict create certFile $certFile data $cert]
    }

    return $toProcess
}

proc updateCerts {caCert certs} {
    foreach {id cert} $certs {
	set certFile [dict get $cert certFile]
	set cert [dict get $cert data]

	set validStart [clock seconds]
	set extensions [dict get $cert extensions]

	if {$id eq "ca"} {
	    set oldSerialNumber [dict get $cert serial_number]

	    set isCA true
	    set validEnd   [clock add $validStart 10 years]
	    set serialNumber [expr {$oldSerialNumber + 1}]
	} else {
	    set isCA false
	    set validEnd   [clock add $validStart 9 years]
	    set serialNumber [clock microseconds]
	}

	# pki 0.10 didnt support these
	dict unset extensions id-ce-authorityKeyIdentifier
	dict unset extensions id-ce-subjectKeyIdentifier
	dict unset extensions 2.5.29.37

	set newCert [::pki::x509::create_cert $cert $caCert $serialNumber $validStart $validEnd $isCA $extensions 1 sha256]

	set fd [open $certFile w]
	puts $fd [string trimright $newCert "\n"]
	close $fd
    }
}

set certInfo [loadCertData $dir]
set caCert [dict get $certInfo ca data]

updateCerts $caCert $certInfo