Changeset 8091


Ignore:
Timestamp:
16/08/12 17:02:23 (8 years ago)
Author:
pjkersha
Message:
  • Added support for addition of custom cert extensions
Location:
trunk/CertificateAuthority/ca
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/CertificateAuthority/ca/__init__.py

    r8089 r8091  
    133133        # used to update the object 
    134134        kw = dict(_cfg.items(section)) 
     135         
     136        # ... but first get file path settings which aren't included as  
     137        # instance variables 
     138        cert_filepath_opt = prefix + self.__class__.cert_filepath_optname 
     139        prikey_filepath_opt = prefix + self.__class__.prikey_filepath_optname 
     140        prikey_file_passwd_opt = prefix + self.__class__.prikey_passwd_optname 
     141         
     142        cert_filepath = kw.get(cert_filepath_opt) 
     143        prikey_file_passwd = kw.get(prikey_file_passwd_opt) 
     144        prikey_filepath = kw.get(prikey_filepath_opt) 
     145         
    135146        if 'prefix' not in kw and prefix: 
    136147            kw['prefix'] = prefix 
     
    174185        """ 
    175186        obj = cls() 
    176         obj.from_keywords(prefix=prefix, **kw) 
     187        obj.parse_keywords(prefix=prefix, **kw) 
    177188         
    178189        return obj 
     
    232243        """ 
    233244        key = crypto.load_privatekey(crypto.FILETYPE_PEM,  
    234                                         open(key_filepath).read(), 
    235                                         key_file_passwd) 
     245                                     open(key_filepath).read(), 
     246                                     key_file_passwd) 
    236247         
    237248        cert = crypto.load_certificate(crypto.FILETYPE_PEM,  
    238                                           open(cert_filepath).read()) 
     249                                       open(cert_filepath).read()) 
    239250         
    240251        ca = CertificateAuthority() 
     
    249260                          certificate_version=certificate_version3, 
    250261                          ca_true=False, 
    251                           subject_alt_name=False): 
     262                          subject_alt_name=False, 
     263                          extensions=None): 
    252264        """ 
    253265        Generate a certificate given a certificate request. 
     
    294306            basic_constraints = 'CA:false' 
    295307             
    296         # Add basic constraints as first element of extensions tuple 
    297         extensions = (crypto.X509Extension('basicConstraints',  
    298                                            True,  
    299                                            basic_constraints),) 
     308        # Add basic constraints as first element of extensions list 
     309        basic_constraints_ext = crypto.X509Extension('basicConstraints',  
     310                                                     True,  
     311                                                     basic_constraints) 
     312        x509_extensions = [basic_constraints_ext] 
    300313             
    301314        # Check for a subject alt names extension, if present add as is. 
    302315        if isinstance(subject_alt_name, basestring): 
    303             extensions += (crypto.X509Extension('subjectAltName',  
    304                                                 False,  
    305                                                 subject_alt_name),) 
    306              
    307         cert.add_extensions(extensions) 
     316            subject_alt_name_ext = crypto.X509Extension('subjectAltName',  
     317                                                        False,  
     318                                                        subject_alt_name) 
     319            x509_extensions.append(subject_alt_name_ext) 
     320             
     321        if extensions: 
     322            x509_extensions += self._add_certificate_ext(cert, extensions) 
     323             
     324        cert.add_extensions(x509_extensions) 
    308325         
    309326        cert.sign(self.key, digest) 
     
    319336         
    320337        return cert  
     338     
     339    def _add_certificate_ext(self, cert, extensions): 
     340        """Add certificate extension - derived classes can override to customise 
     341        behaviour 
     342        """ 
     343 
     344        x509_extensions = [] 
     345        for ext_name, ext_val, ext_crit in extensions: 
     346            x509_cust_ext = crypto.X509Extension(ext_name, ext_crit, str(ext_val)) 
     347            x509_extensions.append(x509_cust_ext) 
     348             
     349        return x509_extensions 
     350 
  • trunk/CertificateAuthority/ca/test/test_ca.py

    r8089 r8091  
    2525    ca_key_filepath = path.join(this_dir, 'myca.key') 
    2626    ca_key_file_passwd = 'ndgtestca' 
    27      
    28     def test01_issue_fqdn_cert_with_subj_alt_names(self): 
     27 
     28    def _create_ca_and_cert_req(self): 
    2929        key_pair = Utils.create_key_pair() 
    3030         
     
    3232        cert_req = Utils.create_cert_req(dn, key_pair) 
    3333         
     34        ca = CertificateAuthority.from_files(self.__class__.ca_cert_filepath,  
     35                                             self.__class__.ca_key_filepath,  
     36                                             self.__class__.ca_key_file_passwd) 
     37         
     38        return key_pair, cert_req, ca 
     39       
     40    def test01_issue_fqdn_cert_with_subj_alt_names(self): 
     41        key_pair, cert_req, ca = self._create_ca_and_cert_req() 
     42         
    3443        not_before_ndays = 0 
    3544        not_after_ndays =  60*60*24*365*5 
    3645         
    37         ca = CertificateAuthority.from_files(self.__class__.ca_cert_filepath,  
    38                                              self.__class__.ca_key_filepath,  
    39                                              self.__class__.ca_key_file_passwd) 
    4046        cert = ca.issue_certificate(cert_req,  
    4147                      (not_before_ndays, not_after_ndays),  
     
    6773                    print dns_name 
    6874 
     75    def test03_create_from_keywords(self): 
     76        ca = CertificateAuthority.from_keywords(prefix='ca.') 
     77         
     78    def test04_issue_cert_with_custom_ext(self): 
     79        key_pair, cert_req, ca = self._create_ca_and_cert_req() 
     80         
     81        not_before_ndays = 0 
     82        not_after_ndays =  60*60*24*365*5 
    6983 
     84        cert = ca.issue_certificate(cert_req,  
     85                      (not_before_ndays, not_after_ndays),  
     86                      extensions=[('nsComment', 'my_cust_val', False)]) 
     87 
     88        s_key = crypto.dump_privatekey(crypto.FILETYPE_PEM, key_pair) 
     89        open(path.join(this_dir, 'my1.key'), 'w').write(s_key) 
     90        s_cert = crypto.dump_certificate(crypto.FILETYPE_PEM, cert) 
     91        open(path.join(this_dir, 'my1.crt'), 'w').write(s_cert) 
     92         
    7093if __name__ == "__main__": 
    7194    unittest.main() 
Note: See TracChangeset for help on using the changeset viewer.