source: TI12-security/branches/Dependencies/m2crypto/contrib/SimpleX509create.py @ 2172

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI12-security/branches/Dependencies/m2crypto/contrib/SimpleX509create.py@2237
Revision 2172, 4.8 KB checked in by pjkersha, 13 years ago (diff)
Line 
1#!/usr/bin/env python
2#
3#vim: ts=4 sw=4 nowrap
4#
5
6"""PKI demo by Peter Teniz <peter.teniz@inverisa.net>"""
7
8import M2Crypto
9
10
11MBSTRING_FLAG = 0x1000
12MBSTRING_ASC  = MBSTRING_FLAG | 1
13MBSTRING_BMP  = MBSTRING_FLAG | 2
14
15
16class Cert:
17        def __init__ ( self ):
18                self.RsaKey = { 'KeyLength'       : 1024,
19                                                'PubExponent'     : 0x10001,            # -> 65537
20                                                'keygen_callback' : self.callback
21                                          }
22
23                self.KeyPair         = None
24                self.PKey            = None
25
26                self.X509Request     = None 
27                self.X509Certificate = None
28
29        def callback ( self, *args ):
30                return 'p'
31
32
33
34        def CreatePKey ( self ):
35                self.KeyPair = M2Crypto.RSA.gen_key( self.RsaKey['KeyLength'], self.RsaKey['PubExponent'], self.RsaKey['keygen_callback'] )
36                #PubKey = M2Crypto.RSA.new_pub_key( self.KeyPair.pub () )
37
38                self.KeyPair.save_key( 'KeyPair.pem', cipher='des_ede3_cbc', callback=self.callback )
39               
40                self.PKey = M2Crypto.EVP.PKey ( md='sha1')
41                self.PKey.assign_rsa ( self.KeyPair )
42
43
44        def CreateX509Request ( self ):
45                #
46                # X509 REQUEST
47                #
48
49                self.X509Request = M2Crypto.X509.Request ()
50
51                #
52                # subject
53                #
54
55                X509Name = M2Crypto.X509.X509_Name ()
56
57                X509Name.add_entry_by_txt ( field='C',            type=MBSTRING_ASC, entry='austria',               len=-1, loc=-1, set=0 )    # country name
58                X509Name.add_entry_by_txt ( field='SP',           type=MBSTRING_ASC, entry='kernten',               len=-1, loc=-1, set=0 )    # state of province name
59                X509Name.add_entry_by_txt ( field='L',            type=MBSTRING_ASC, entry='stgallen',              len=-1, loc=-1, set=0 )    # locality name
60                X509Name.add_entry_by_txt ( field='O',            type=MBSTRING_ASC, entry='labor',                 len=-1, loc=-1, set=0 )    # organization name
61                X509Name.add_entry_by_txt ( field='OU',           type=MBSTRING_ASC, entry='it-department',         len=-1, loc=-1, set=0 )    # organizational unit name
62                X509Name.add_entry_by_txt ( field='CN',           type=MBSTRING_ASC, entry='Certificate client',    len=-1, loc=-1, set=0 )    # common name
63                X509Name.add_entry_by_txt ( field='Email',        type=MBSTRING_ASC, entry='user@localhost',        len=-1, loc=-1, set=0 )    # pkcs9 email address
64                X509Name.add_entry_by_txt ( field='emailAddress', type=MBSTRING_ASC, entry='user@localhost',        len=-1, loc=-1, set=0 )    # pkcs9 email address     
65
66                self.X509Request.set_subject_name( X509Name )
67
68                #
69                # publickey
70                #
71
72                self.X509Request.set_pubkey ( pkey=self.PKey )
73                self.X509Request.sign ( pkey=self.PKey, md='sha1' )
74                #print X509Request.as_text ()
75
76
77
78
79
80
81        def CreateX509Certificate ( self ):
82                #
83                # X509 CERTIFICATE
84                #
85
86                self.X509Certificate =  M2Crypto.X509.X509 ()
87
88                #
89                # version
90                #
91
92                self.X509Certificate.set_version ( 0 )
93
94                #
95                # time notBefore
96                #
97
98                ASN1 = M2Crypto.ASN1.ASN1_UTCTIME ()
99                ASN1.set_time ( 500 )
100                self.X509Certificate.set_not_before( ASN1 )
101
102                #
103                # time notAfter
104                #
105
106                ASN1 = M2Crypto.ASN1.ASN1_UTCTIME ()
107                ASN1.set_time ( 500 )
108                self.X509Certificate.set_not_after( ASN1 )
109
110                #
111                # public key
112                #
113
114                self.X509Certificate.set_pubkey ( pkey=self.PKey )
115               
116                #
117                # subject
118                #
119
120                X509Name = self.X509Request.get_subject ()
121
122                #print X509Name.entry_count ()
123                #print X509Name.as_text ()
124
125                self.X509Certificate.set_subject_name( X509Name )
126
127                #
128                # issuer
129                #
130
131                X509Name = M2Crypto.X509.X509_Name ( M2Crypto.m2.x509_name_new () )
132
133                X509Name.add_entry_by_txt ( field='C',            type=MBSTRING_ASC, entry='germany',               len=-1, loc=-1, set=0 )    # country name
134                X509Name.add_entry_by_txt ( field='SP',           type=MBSTRING_ASC, entry='bavaria',               len=-1, loc=-1, set=0 )    # state of province name
135                X509Name.add_entry_by_txt ( field='L',            type=MBSTRING_ASC, entry='munich',                len=-1, loc=-1, set=0 )    # locality name
136                X509Name.add_entry_by_txt ( field='O',            type=MBSTRING_ASC, entry='sbs',                   len=-1, loc=-1, set=0 )    # organization name
137                X509Name.add_entry_by_txt ( field='OU',           type=MBSTRING_ASC, entry='it-department',         len=-1, loc=-1, set=0 )    # organizational unit name
138                X509Name.add_entry_by_txt ( field='CN',           type=MBSTRING_ASC, entry='Certificate Authority', len=-1, loc=-1, set=0 )    # common name
139                X509Name.add_entry_by_txt ( field='Email',        type=MBSTRING_ASC, entry='admin@localhost',       len=-1, loc=-1, set=0 )    # pkcs9 email address
140                X509Name.add_entry_by_txt ( field='emailAddress', type=MBSTRING_ASC, entry='admin@localhost',       len=-1, loc=-1, set=0 )    # pkcs9 email address     
141
142                #print X509Name.entry_count ()
143                #print X509Name.as_text ()
144
145                self.X509Certificate.set_issuer_name( X509Name )
146
147                #
148                # signing
149                #
150
151                self.X509Certificate.sign( pkey=self.PKey, md='sha1' )
152                print self.X509Certificate.as_text ()
153
154
155
156
157
158if __name__ == '__main__':
159        run = Cert ()
160        run.CreatePKey ()
161        run.CreateX509Request ()
162        run.CreateX509Certificate ()
Note: See TracBrowser for help on using the repository browser.