"Fossies" - the Fresh Open Source Software Archive 
Member "nss_ldap-265/certutil" (6 Nov 2009, 5533 Bytes) of package /linux/privat/old/nss_ldap-265.tar.gz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Bash source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
1 #!/bin/sh
2 #ident $Id: certutil,v 2.2 2001/05/27 12:16:31 lukeh Exp $
3 #
4 # certutil -- manage trusted X.509 certificates
5 # inspired by Netscape PKCS #11 toolkit
6 # contributed by Jarkko Turkulainen <jt@wapit.com>
7 #
8 #
9 # INTRODUCTION
10 #
11 # certutil can be used with various OpenSSL routines and tools
12 # that utilize OpenSSL. Example:
13 #
14 # $ openssl s_client -CApath certdir
15 #
16 # where certdir is a directory created by certutil. Other well known
17 # programs that use the same format are stunnel, sendmail and pam_ldap
18 #
19 #
20 #
21 # HOWTO
22 #
23 # 1. Initialize certificate database
24 #
25 # Simply by adding a new certificate. If the certificate directory
26 # doesn't exist, the script asks for creating a one. Example:
27 #
28 # $ certutil -a -n "First Cert" -i cert.pem -d /home/jt/mycerts
29 # ./certutil: cannot access /home/jt/mycerts, create? [y/N] y
30 #
31 #
32 # 2. Add new certificate
33 #
34 # $ certutil -a -n "My Cert" -i cert.pem [-d certdir]
35 #
36 # Note that nickname (-n) must exist. certdir is optional - if it's
37 # not given, $PWD is used. The directory must have a file named certs.dat.
38 # If that file doesn't exist, the script refuses to do anything. If your
39 # certs.dat file is corrupted, "rm -rf" the whole dir and start from
40 # the scratch. cert.pem is the actual sertificate.
41 #
42 # 3. Delete certificate
43 #
44 # $ certutil -r -n "My Cert" [-d certdir]
45 #
46 # This command removes the certificate named "My Cert". certdir is
47 # optional, see 2.
48 #
49 # 4. List sertificates
50 #
51 # $ certutil -l [-d certdir]
52 #
53 # And again, certdir is optional.
54 #
55 # 5. View certificate properties
56 #
57 # $ certutil -v -n "My Cert" [-d certdir]
58 #
59 #
60
61
62 # Print usage
63 usage() {
64 cat << EOF
65
66 Usage: $0 -l [-d dir]
67 -a -n name -i file [-d dir]
68 -r -n name [-d dir]
69 -v -n name [-d dir]
70
71 Commands:
72 -l -- List sertificates (requires a valid dir)
73 -a -- Add sertificate and create dir if necessary
74 -r -- Remove sertificate (requires a valid dir)
75 -v -- View sertificate (requires a valid dir)
76
77 Parameters:
78 dir -- Certificate directory, or \$PWD if not given
79 name -- Nickname of the certificate
80 file -- Certificate file in PEM format
81
82 EOF
83 exit 1
84 }
85
86 # Check path
87 check_path() {
88
89 # check the directory
90 if [ ! -d $CDIR -a $ADD -eq 1 ]; then
91 echo -n "$0: cannot access $CDIR, create? [y/N] "
92 read LINE
93 case $LINE in
94 y|Y)
95 mkdir $CDIR
96 chmod 700 $CDIR
97 touch $CDIR/certs.dat
98 chmod 600 $CDIR/certs.dat
99 ;;
100 *)
101 exit 1
102 ;;
103 esac
104 fi
105
106 # check certs.dat
107 if [ ! -e $CDIR/certs.dat ]; then
108 echo "$0: please specify a valid cert directory"
109 exit 1
110 fi
111 }
112
113 # Add certificates
114 add_cert() {
115 check_path
116 if [ ! -e $FILE ]; then
117 echo "$0: cannot find $FILE"
118 exit 1
119 fi
120 HASH=`openssl x509 -in $FILE -hash -noout 2>/dev/null`.0
121 if [ $? -ne 0 ]; then
122 echo "$0: unable to load certificate $FILE"
123 exit 1
124 fi
125
126 if grep "^$CNAME|" $CDIR/certs.dat 1>/dev/null 2>&1; then
127 echo "$0: nickname already in use"
128 exit 1
129 fi
130
131 if [ -e $CDIR/$HASH ]; then
132 echo "$0: certificate already in directory"
133 echo `openssl x509 -in $CDIR/$HASH -subject -noout`
134 exit 1
135 else
136 cp $FILE $CDIR/$HASH
137 chmod 600 $CDIR/$HASH
138 echo "$CNAME|$HASH" >> $CDIR/certs.dat
139 chmod 600 $CDIR/certs.dat
140 fi
141
142 }
143
144 # List certificates
145 #
146 # (this is too slow...)
147 #
148 list_cert() {
149 check_path
150 echo
151 echo "Certificates in directory $CDIR"
152 echo
153 printf "%-30s%s\n" nickname subject/issuer
154 echo "----------------------------------------------------------------------------"
155 cat $CDIR/certs.dat | while read LINE; do
156 NICK=`echo $LINE | cut -d "|" -f 1`
157 HASH=`echo $LINE | cut -d "|" -f 2`
158 SUBJECT=`openssl x509 -in $CDIR/$HASH -subject -noout`
159 ISSUER=`openssl x509 -in $CDIR/$HASH -issuer -noout`
160 printf "%-30s%s\n" "$NICK" "$SUBJECT"
161 printf "%-30s%s\n\n" "" "$ISSUER"
162
163 done
164 }
165
166 # Remove certificates
167 remove_cert() {
168 check_path
169 (
170 cat $CDIR/certs.dat | while read LINE; do
171 NICK=`echo $LINE | cut -d "|" -f 1`
172 HASH=`echo $LINE | cut -d "|" -f 2`
173 if [ "$CNAME" = "$NICK" ]; then
174 rm $CDIR/$HASH
175 else
176 echo $LINE
177 fi
178 done
179 ) > /tmp/$$
180 mv /tmp/$$ $CDIR/certs.dat
181 chmod 600 $CDIR/certs.dat
182 }
183
184 # View certificate
185 view_cert() {
186 check_path
187 cat $CDIR/certs.dat | while read LINE; do
188 NICK=`echo $LINE | cut -d "|" -f 1`
189 HASH=`echo $LINE | cut -d "|" -f 2`
190 if [ "$CNAME" = "$NICK" ]; then
191 openssl x509 -in $CDIR/$HASH -text
192 return 1
193 fi
194 done
195 }
196
197 # Parse option string
198 ADD=0
199 REMOVE=0
200 LIST=0
201 VIEW=0
202 while getopts "arlvd:n:i:" OPT; do
203 case $OPT in
204 a)
205 ADD=1
206 ;;
207 r)
208 REMOVE=1
209 ;;
210 l)
211 LIST=1
212 ;;
213 v)
214 VIEW=1
215 ;;
216 d)
217 CDIR=$OPTARG
218 ;;
219 n)
220 CNAME=$OPTARG
221 ;;
222 i)
223 FILE=$OPTARG
224 ;;
225 *)
226 usage
227 ;;
228 esac
229 done
230
231 # Default options
232 CDIR=${CDIR:=.}
233
234 # Check command line options
235 if [ $ADD -eq 1 -a $REMOVE -eq 0 -a $LIST -eq 0 -a $VIEW -eq 0 ]; then
236 if [ -n "$CNAME" -a -n "$FILE" ]; then
237 add_cert
238 else
239 echo "$0: missing certificate name or file"
240 usage
241 fi
242 elif [ $REMOVE -eq 1 -a $ADD -eq 0 -a $LIST -eq 0 -a $VIEW -eq 0 ]; then
243 if [ -n "$CNAME" ]; then
244 remove_cert
245 else
246 echo "$0: missing certificate name"
247 usage
248 fi
249 elif [ $LIST -eq 1 -a $ADD -eq 0 -a $REMOVE -eq 0 -a $VIEW -eq 0 ]; then
250 list_cert
251 elif [ $VIEW -eq 1 -a $ADD -eq 0 -a $REMOVE -eq 0 -a $LIST -eq 0 ]; then
252 if [ -n "$CNAME" ]; then
253 if view_cert; then
254 echo "$0: cert named \"$CNAME\" not found"
255 exit 1
256 fi
257 else
258 echo "$0: missing certificate name"
259 usage
260 fi
261 else
262 usage
263 fi