source: fedd/cert_to_fedid.py @ b4e5366

axis_examplecompt_changesinfo-ops
Last change on this file since b4e5366 was 490ee21, checked in by Ted Faber <faber@…>, 14 years ago

Copy the subject as well

  • Property mode set to 100755
File size: 2.0 KB
RevLine 
[c573278]1#!/usr/local/bin/python
2
3import sys, os
4import subprocess, tempfile
[62f3dd9]5import os.path
[490ee21]6import re
7
8from M2Crypto import X509
[c573278]9
10from string import join
[62f3dd9]11from federation.util import abac_pem_type, abac_split_cert, file_expanding_opts
[c573278]12
[62f3dd9]13class Parser(file_expanding_opts):
[c573278]14    def __init__(self):
[62f3dd9]15        file_expanding_opts.__init__(self, usage='%prog [options]')
[c573278]16        self.add_option('--out', dest='out', help='destination file',
[62f3dd9]17                action='callback', callback=self.expand_file, type='str',
[c573278]18                default='./cert.pem')
19        self.add_option('--debug', dest='debug', action='store_true', 
20                default=False, help='Just print command')
[490ee21]21        self.add_option('--cert', dest='cert', 
22                help='Cretificate to copy subject from')
[c573278]23        self.add_option('--openssl', dest='openssl',
24                help='Path to openssl command', default='/usr/bin/openssl')
25
26parser = Parser()
27opts, args = parser.parse_args()
28delete_key = False
29
30if args:
31    key = args[0]
32
33ktype = abac_pem_type(key)
34if ktype == 'both':
35    key, cert = abac_split_cert(key)
36    os.unlink(cert)
37    delete_key = True
38elif ktype != 'key':
[ddf0903]39    sys.exit('Cannot use %s as identity.  It is a %s ' % (key, ktype) + 
[c573278]40        'and we were expecting a key')
41
42
43try:
[490ee21]44    c = X509.load_cert(opts.cert)
45    subj = c.get_subject().as_text()
46    if subj.startswith('/'): i = 1
47    else: i = 0
48    subj = '/' + re.sub('/', '\/', subj[i:])
49
[c573278]50    tf, tn = tempfile.mkstemp(suffix=".pem")
51    cmd = [opts.openssl, 'req', '-new', '-nodes', '-subj', 
[490ee21]52            subj, '-x509', '-days',  '3650',
[c573278]53            '-key', key, '-out', tn]
54    if opts.debug:
55        print join(cmd)
56        sys.exit(0)
57    else:
58        rv = subprocess.call(cmd)
59        if rv == 0:
60            try:
61                of = os.fdopen(os.open(opts.out, 
62                    os.O_WRONLY | os.O_CREAT, 0600), 'w')
63                for inf in (tn, key):
64                    f = open(inf, 'r')
65                    for line in f:
66                        print >>of, line,
67                    f.close()
68                of.close()
69            except EnvironmentError, e:
70                sys.exit("Cannot open %s: %s" % (efilename, e.strerror))
71        else:
72            sys.exit("%s failed: %d" % (opts.openssl, rv))
73finally:
74    if delete_key and key: os.unlink(key)
Note: See TracBrowser for help on using the repository browser.