~ubuntu-branches/ubuntu/hardy/pyca/hardy

« back to all changes in this revision

Viewing changes to cgi-bin/view-cert.py

  • Committer: Bazaar Package Importer
  • Author(s): Lars Bahner
  • Date: 2003-12-02 19:39:35 UTC
  • Revision ID: james.westby@ubuntu.com-20031202193935-fzzt289mntvy6a8q
Tags: upstream-20031118
ImportĀ upstreamĀ versionĀ 20031118

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/python
 
2
 
 
3
"""
 
4
view-cert.py
 
5
(c) by Michael Stroeder <michael@stroeder.com>
 
6
 
 
7
CGI-BIN for viewing certificates
 
8
with Netscape Navigator and M$ Internet Explorer
 
9
 
 
10
Input:
 
11
 
 
12
PATH_INFO
 
13
- Name of CA in openssl.cnf (section [ca] of openssl.cnf)
 
14
- Type of certificate ('email', 'user', 'ca', 'crl')
 
15
QUERY_STRING only for ('email', 'user')
 
16
- Serial number of desired certificate
 
17
  max. 8 digits hexadecimal (32 Bit)
 
18
 
 
19
Examples:
 
20
  view-cert.py/Persona/ca
 
21
  displays CA certificate of CA "Persona"
 
22
 
 
23
  view-cert.py/Persona/email?01
 
24
  displays client certificate of CA "Persona" with serial 0x01
 
25
 
 
26
  view-cert.py/Server/crl
 
27
  displays CRL of CA "Server"
 
28
 
 
29
  view-cert.py/Server/server?01
 
30
  displays server certificate of CA "Server" with serial 0x01
 
31
"""
 
32
 
 
33
__version__ = '0.6.6'
 
34
 
 
35
import sys,os,string,re,pycacnf,htmlbase,openssl,charset
 
36
 
 
37
from time import time,localtime,strftime,mktime
 
38
 
 
39
from pycacnf import opensslcnf, pyca_section
 
40
 
 
41
from openssl.db import \
 
42
  empty_DN_dict, \
 
43
  DB_type,DB_exp_date,DB_rev_date,DB_serial,DB_file,DB_name,DB_number, \
 
44
  DB_TYPE_REV,DB_TYPE_EXP,DB_TYPE_VAL, \
 
45
  dbtime2tuple,GetEntriesbyDN,SplitDN
 
46
 
 
47
# Wir lesen rein gar nix von Standardeingabe => gleich dicht machen
 
48
sys.stdin.close()
 
49
 
 
50
# Path to openssl executable
 
51
openssl.bin_filename = pyca_section.get('OpenSSLExec','/usr/bin/openssl')
 
52
 
 
53
# Ein paar Umgebungsvariablen auslesen, welche der Apache liefert
 
54
request_method  = os.environ.get('REQUEST_METHOD','')
 
55
query_string    = os.environ.get('QUERY_STRING','')
 
56
path_info       = os.environ.get('PATH_INFO','')[1:]
 
57
 
 
58
nsBaseUrl    = pyca_section.get('nsBaseUrl','/')
 
59
nsGetCertUrl = pyca_section.get('nsGetCertUrl','get-cert.py')
 
60
nsViewCertUrl = pyca_section.get('nsViewCertUrl','view-cert.py')
 
61
 
 
62
# Hier die ueblichen Paranoid-Pruefungen der Parameter
 
63
 
 
64
if request_method!='GET':
 
65
  # Skript nicht mit GET aufgerufen
 
66
  htmlbase.PrintErrorMsg('Wrong method.')
 
67
  sys.exit(0)
 
68
 
 
69
# Bezeichnung der Sub-CA und MIME-Typ aus PATH_INFO splitten
 
70
try:
 
71
  ca_name, cert_typeandformat = string.split(path_info,'/',1)
 
72
  cert_typeandformat=string.lower(cert_typeandformat)
 
73
except ValueError:
 
74
  htmlbase.PrintErrorMsg('Invalid parameter format.')
 
75
  sys.exit(0)
 
76
 
 
77
# Name der CA pruefen
 
78
if not opensslcnf.data['ca'].has_key(ca_name):
 
79
  # CA-Definition nicht in openssl-Konfiguration enthalten
 
80
  htmlbase.PrintErrorMsg('Unknown certificate authority "%s".' % ca_name)
 
81
  sys.exit(0)
 
82
 
 
83
if re.compile('^(ca|crl|server|user|email)(.(der|pem|b64|crt|crl))*$').match(cert_typeandformat) is None:
 
84
  htmlbase.PrintErrorMsg('Certificate type has invalid format.')
 
85
  sys.exit(0)
 
86
 
 
87
try:
 
88
  cert_type,cert_format = string.split(cert_typeandformat,'.',1)
 
89
except ValueError:
 
90
  cert_type,cert_format = cert_typeandformat,'der'
 
91
if cert_format=='crt' or cert_format=='crl':
 
92
  cert_format='der'
 
93
 
 
94
if len(query_string)>8:
 
95
  # Seriennummer mit mehr 32 Bit
 
96
  htmlbase.PrintErrorMsg('Serial number too long.')
 
97
  sys.exit(0)
 
98
 
 
99
if (not cert_type in ['ca','crl']) and (not query_string):
 
100
  # keine Seriennummer
 
101
  htmlbase.PrintErrorMsg('No serial number.')
 
102
  sys.exit(0)
 
103
 
 
104
# Process request
 
105
 
 
106
ca = opensslcnf.getcadata(ca_name)
 
107
 
 
108
if cert_type=='ca':
 
109
    # Abruf des CA-Zertifikates
 
110
    certfilename = ca.certificate
 
111
elif cert_type=='crl':
 
112
  certfilename = ca.crl
 
113
elif cert_type in ['user','email','server']:
 
114
  if re.compile('^[0-9a-fA-F]+$').match(query_string) is None:
 
115
    # Parameter war keine Hex-Nummer
 
116
    htmlbase.PrintErrorMsg('Serial number not in hexadecimal format.')
 
117
    sys.exit(0)
 
118
  # Abruf eines Zertifikates mittels Seriennummer
 
119
  serialnumber=string.atoi(query_string,16)
 
120
  entry = openssl.db.GetEntrybySerial(ca.database,serialnumber)
 
121
  # Kein entsprechender Eintrag gefunden
 
122
  if not entry:
 
123
    htmlbase.PrintErrorMsg('Certificate not found.')
 
124
    sys.exit(0)
 
125
  certfilename = os.path.join(ca.certs,'%s.pem' % (entry[DB_serial]))
 
126
else:
 
127
  # Zertifikattyp war nicht gueltig
 
128
  htmlbase.PrintErrorMsg('Invalid certificate type "%s"' % cert_type)
 
129
  sys.exit(0)
 
130
 
 
131
# Does the certificate file exist?
 
132
if not os.path.isfile(certfilename):
 
133
  htmlbase.PrintErrorMsg('Certificate file not found.')
 
134
  sys.exit(0)
 
135
 
 
136
if cert_type=='crl':
 
137
 
 
138
  htmlbase.PrintHeader('View CRL')
 
139
  htmlbase.PrintHeading('View CRL')
 
140
  crl = openssl.cert.CRLClass(certfilename)
 
141
  issuerdatalist = []
 
142
  for attr in openssl.cert.X509v1_certattrlist:
 
143
    issuerdatalist.append(string.strip(charset.asn12html4(crl.issuer.get(attr,''))))
 
144
  print """
 
145
<DL>
 
146
  <DT><STRONG>This CRL was issued by:</STRONG></DT>
 
147
  <DD>%s</DD>
 
148
  <DT><STRONG>last updated:</STRONG></DT>
 
149
  <DD>%s</DD>
 
150
  <DT><STRONG>next update:</STRONG></DT>
 
151
  <DD>%s</DD>
 
152
</DL>
 
153
<P><A HREF="%s%s/%s/crl.crl">Download CRL</A></P>
 
154
<HR><FONT SIZE=-1><PRE>
 
155
""" % ( \
 
156
        string.join(issuerdatalist,'<BR>'),
 
157
        crl.lastUpdate,crl.nextUpdate,
 
158
        nsBaseUrl,nsGetCertUrl,ca_name
 
159
      )
 
160
  sys.stdout.flush()
 
161
  os.system('%s crl -inform PEM -in "%s" -noout -text' %(openssl.bin_filename,ca.crl))
 
162
  sys.stdout.flush()
 
163
  print '</PRE></FONT>'
 
164
  htmlbase.PrintFooter()
 
165
 
 
166
elif cert_type=='ca':
 
167
 
 
168
  htmlbase.PrintHeader('View CA Certificate')
 
169
  htmlbase.PrintHeading('View CA Certificate')
 
170
  cert = openssl.cert.X509CertificateClass(certfilename)
 
171
 
 
172
  print """
 
173
%s
 
174
<P>
 
175
  <A HREF="%s%s/%s/ca.crt">Download certificate</A>
 
176
</P>
 
177
<HR><FONT SIZE=-1><PRE>
 
178
""" % (cert.htmlprint(),nsBaseUrl,nsGetCertUrl,ca_name)
 
179
 
 
180
  sys.stdout.flush()
 
181
  os.system('%s x509 -inform PEM -in "%s" -noout -text' %(openssl.bin_filename,certfilename))
 
182
  sys.stdout.flush()
 
183
 
 
184
  print '</PRE></FONT>'
 
185
  htmlbase.PrintFooter()
 
186
 
 
187
elif cert_type in ['user','email','server']:
 
188
 
 
189
  htmlbase.PrintHeader('View Certificate')
 
190
  htmlbase.PrintHeading('View Certificate')
 
191
  cert = openssl.cert.X509CertificateClass(certfilename)
 
192
  if entry[DB_type]==openssl.db.DB_TYPE_VAL:
 
193
    statusstr = 'Certificate is valid.'
 
194
  elif entry[DB_type]==openssl.db.DB_TYPE_REV:
 
195
    statusstr = 'Certificate revoked since %s.' % (strftime('%Y-%m-%d %H:%M',localtime(mktime(dbtime2tuple(entry[DB_rev_date])))))
 
196
  elif entry[DB_type]==openssl.db.DB_TYPE_EXP:
 
197
    statusstr = 'Certificate expired.'
 
198
  print """
 
199
<P>
 
200
  <DL>
 
201
    <DT><STRONG>Current status</STRONG>:</DT>
 
202
    <DD>%s</DD>
 
203
  </DL>
 
204
</P>
 
205
%s
 
206
</PRE></FONT>
 
207
""" % (statusstr,cert.htmlprint())
 
208
  print """
 
209
<P>
 
210
  <A HREF="%s%s/%s/%s.crt?%s">Download certificate</A> &nbsp;
 
211
  <A HREF="%s%s/%s/ca.crt">View issuer certificate</A>
 
212
</P>
 
213
<HR><FONT SIZE=-1><PRE>
 
214
""" % ( \
 
215
        nsBaseUrl,nsGetCertUrl,ca_name,cert_type,entry[DB_serial],
 
216
        nsBaseUrl,nsViewCertUrl,ca_name
 
217
      )
 
218
  sys.stdout.flush()
 
219
  os.system('%s x509 -inform PEM -in "%s" -noout -text' %(openssl.bin_filename,certfilename))
 
220
  sys.stdout.flush()
 
221
  print '</PRE></FONT>'
 
222
  htmlbase.PrintFooter()
 
223
 
 
224
sys.exit(0)
 
225