~ubuntu-branches/ubuntu/karmic/pyca/karmic

« back to all changes in this revision

Viewing changes to bin/print-cacerts.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
# print-ca-certs.py
 
5
# (c) by Michael Stroeder, michael@stroeder.com
 
6
########################################################################
 
7
 
 
8
__version__ = '0.6.6'
 
9
 
 
10
########################################################################
 
11
# This simple script prints all CA certs on stdout.
 
12
# This is intended to generate a authentic printout of the fingerprints
 
13
# on the private CA system.
 
14
# Choose the option --html to generate nicer formatted HTML-output
 
15
# instead of the default textual output in ISO-8859-1.
 
16
########################################################################
 
17
 
 
18
 
 
19
import sys, string, os, getopt
 
20
 
 
21
def findoption(options,paramname):
 
22
  for i in options:
 
23
    if i[0]==paramname:
 
24
      return i
 
25
  return ()
 
26
 
 
27
def PrintUsage(ErrorMsg='',ErrorCode=1):
 
28
  script_name = string.split(sys.argv[0],os.sep)[-1]
 
29
  sys.stderr.write("""*** %s *** (C) by Michael Stroeder, 1999
 
30
 
 
31
usage: %s [options]
 
32
 
 
33
Options:
 
34
 
 
35
  -h or --help
 
36
        Print out this message
 
37
 
 
38
  --config=[pathname]
 
39
        Pathname of OpenSSL configuration file.
 
40
        You may also use env variable OPENSSL_CONF.
 
41
        Default: /etc/openssl/openssl.cnf
 
42
 
 
43
  --pycalib=[directory]
 
44
        Specify directory containing the pyCA modules
 
45
        Default: /usr/local/pyca/pylib
 
46
 
 
47
  --html
 
48
        Generate nicer formatted HTML output
 
49
 
 
50
""" % (script_name,script_name))
 
51
  if ErrorMsg:
 
52
    sys.stderr.write('Error: %s\n' % ErrorMsg)
 
53
  sys.exit(ErrorCode)
 
54
 
 
55
script_name=sys.argv[0]
 
56
 
 
57
try:
 
58
  options,args=getopt.getopt(sys.argv[1:],'h',['help','config=','pycalib=','html'])
 
59
except getopt.error,e:
 
60
  PrintUsage(str(e))
 
61
 
 
62
if findoption(options,'-h')!=() or findoption(options,'--help')!=():
 
63
  PrintUsage()
 
64
 
 
65
if findoption(options,'--config')!=():
 
66
  opensslcnfname = findoption(options,'--config')[1]
 
67
else:
 
68
  opensslcnfname = os.environ.get('OPENSSL_CONF','/etc/openssl/openssl.cnf')
 
69
 
 
70
if not os.path.isfile(opensslcnfname):
 
71
  PrintUsage('Config file %s not found.' % (opensslcnfname))
 
72
 
 
73
if findoption(options,'--pycalib')!=():
 
74
  pycalib = findoption(options,'--pycalib')[1]
 
75
else:
 
76
  pycalib = os.environ.get('PYCALIB','/usr/local/pyca/pylib')
 
77
 
 
78
if not os.path.exists(pycalib) or not os.path.isdir(pycalib):
 
79
  PrintUsage('Module directory %s not exists or not a directory.' % (pycalib))
 
80
 
 
81
sys.path.append(pycalib)
 
82
 
 
83
try:
 
84
  import openssl, charset, htmlbase
 
85
except ImportError:
 
86
  PrintUsage('Required pyCA modules not found in directory %s!' % (pycalib))
 
87
 
 
88
# Read the configuration file
 
89
if os.path.isfile('%s.pickle' % (opensslcnfname)):
 
90
  # Try to read OpenSSL's config file from a pickled copy
 
91
  f=open('%s.pickle' % (opensslcnfname),'rb')
 
92
  try:
 
93
    # first try to use the faster cPickle module
 
94
    from cPickle import load
 
95
  except ImportError:
 
96
    from pickle import load
 
97
  opensslcnf=load(f)
 
98
  f.close()
 
99
else:
 
100
  # Parse OpenSSL's config file from source
 
101
  opensslcnf=openssl.cnf.OpenSSLConfigClass(opensslcnfname)
 
102
 
 
103
pyca_section = opensslcnf.data.get('pyca',{})
 
104
 
 
105
openssl.bin_filename = pyca_section.get('OpenSSLExec','/usr/local/ssl/bin/openssl')
 
106
if not os.path.isfile(openssl.bin_filename):
 
107
  PrintUsage('Did not find OpenSSL executable %s.' % (openssl.bin_filename))
 
108
 
 
109
ca_names = opensslcnf.sectionkeys.get('ca',[])
 
110
 
 
111
htmlmode = findoption(options,'--html')!=()
 
112
 
 
113
if htmlmode:
 
114
 
 
115
  #HTML mode
 
116
 
 
117
  sys.stdout.write('<HTML>\n<HEAD>\n<TITLE>CA certs</TITLE>\n</HEAD>\n<BODY>\n<CENTER>\n')
 
118
 
 
119
  for ca_name in ca_names:
 
120
 
 
121
    ca = opensslcnf.getcadata(ca_name)
 
122
 
 
123
    if os.path.isfile(ca.certificate):
 
124
 
 
125
      # Parse certificate textual output
 
126
      cacert = openssl.cert.X509CertificateClass(ca.certificate)
 
127
      sys.stdout.write('<H2>%s</H2>%s<P>' % (ca_name,cacert.htmlprint()))
 
128
 
 
129
  sys.stdout.write('</CENTER>\n</BODY>\n</HTML>\n')
 
130
 
 
131
 
 
132
else:
 
133
 
 
134
  # Text mode
 
135
 
 
136
  for ca_name in ca_names:
 
137
 
 
138
    ca = opensslcnf.getcadata(ca_name)
 
139
 
 
140
    if os.path.isfile(ca.certificate):
 
141
 
 
142
      # Parse certificate textual output
 
143
      cacert = openssl.cert.X509CertificateClass(ca.certificate)
 
144
 
 
145
      # Convert character sets
 
146
      subject,issuer = {},{}
 
147
      for attr in ['CN','Email','OU','O','L','ST','C']:
 
148
        subject[attr] = string.strip(charset.asn12iso(cacert.subject.get(attr,'')))
 
149
        issuer[attr]  = string.strip(charset.asn12iso(cacert.issuer.get(attr,'')))
 
150
 
 
151
      sys.stdout.write('Subject:\nCommon Name: "%(CN)s"\nOrganizational Unit: "%(OU)s"\nOrganization: "%(O)s"\nLocation: "%(L)s"\nState/Province: "%(ST)s"\nCountry: "%(C)s"\n\n' % (subject))
 
152
      sys.stdout.write('Issuer:\nCommon Name: "%(CN)s"\nOrganizational Unit: "%(OU)s"\nOrganization: "%(O)s"\nLocation: "%(L)s"\nState/Province: "%(ST)s"\nCountry: "%(C)s"\n\n' % (issuer))
 
153
      sys.stdout.write('Serial: %s\n' % (cacert.serial))
 
154
      sys.stdout.write('Validity: from %s until %s\n' % (cacert.notBefore,cacert.notAfter))
 
155
      sys.stdout.write('Hash: %s\n' % (cacert.hash))
 
156
      sys.stdout.write('SHA-1 Fingerprint: %s\n' % (cacert.getfingerprint('sha1')))
 
157
      sys.stdout.write('MD5   Fingerprint: %s\n' % (cacert.getfingerprint('md5')))
 
158
      sys.stdout.write('\n%s\n\n' % (72*'-'))