5
(c) by Michael Stroeder <michael@stroeder.com>
7
CGI-BIN for On-line checking of certificates -
8
a handler for URL in Netscape extension nsRevocationUrl.
10
Have look at a x509_extensions-section and the
11
attributes nsBaseUrl and nsRevocationUrl
16
- Name of CA in openssl.cnf (section [ca] of openssl.cnf)
18
- Serial number of desired certificate
19
max. 8 digits hexadecimal (32 Bit)
22
ns-check-rev.py/Persona?537A
23
checks if certificate number 0x537A issued of CA "Persona" is valid
27
Content-type: application/x-netscape-revocation
28
0 if certificate is valid <=> V in index.txt
29
1 if certificate is invalid
34
import sys, os, string, re, pycacnf, htmlbase, openssl
36
from pycacnf import opensslcnf, pyca_section
38
# Ein paar Umgebungsvariablen auslesen, welche der Apache liefert
39
request_method = os.environ['REQUEST_METHOD']
40
query_string = os.environ['QUERY_STRING']
41
ca_name = os.environ.get('PATH_INFO','')[1:]
43
# Wir lesen rein gar nix von Standardeingabe => gleich dicht machen
46
# Hier die ueblichen Paranoid-Pruefungen der Parameter
47
rm = (re.compile('[0-9a-fA-F]+')).match(query_string)
48
if (request_method!='GET') or \
49
(len(query_string)>8) or \
51
rm.group(0)!=query_string:
52
# Skript nicht mit GET aufgerufen
53
# Seriennummer mit mehr 32 Bit
54
# Parameter war keine Hex-Nummer
55
# => Kommentarloses Ende
59
htmlbase.PrintErrorMsg('No certificate authority.')
62
if not opensslcnf.data['ca'].has_key(ca_name):
63
# CA-Definition nicht in openssl-Konfiguration enthalten
64
htmlbase.PrintErrorMsg('Unknown certificate authority "%s"!' % ca_name)
67
ca_section=opensslcnf.data[opensslcnf.data['ca'][ca_name]]
68
ca_dir = ca_section.get('dir','')
69
ca_database = string.replace(ca_section.get('database','$dir/index.txt'),'$dir',ca_dir)
71
# Hex-String in Integer wandeln
72
serialnumber=string.atoi(query_string,16)
74
# Eintrag suchen lassen
75
entry = openssl.db.GetEntrybySerial(ca_database,serialnumber)
78
print 'Content-type: application/x-netscape-revocation\n'
80
# Kein Zertifikat mit angegebener Nummer gefunden
85
# Zertifikat gueltig <=> type-Feld ist 'V'
86
print not (entry and openssl.db.IsValid(entry))
88
#if entry[openssl.db.DB_type]==openssl.db.DB_TYPE_VAL: