Changeset 2148


Ignore:
Timestamp:
12/02/07 17:18:25 (12 years ago)
Author:
pjkersha
Message:

python/ndg.security.server/ndg/security/server/ca/server-config.tac:

  • added check to ensure CA pass-phrase is set and if not prompt for from command line.
  • do a get call for 'clntCertFile' dict key so that it can be optional

python/ndg.security.server/ndg/security/server/ca/init.py:

  • use $HOME/.globus/simpleCA/grid-ca-ssl.conf as the default SSL config file
  • key access methods raise KeyError? on exception
  • PassPhrase? -> passphrase

python/ndg.security.server/ndg/security/server/MyProxy.py:

  • certReqDNParam attribute is no longer needed - use openSSLConfig.reqDN instead.

python/conf/simpleCAProperties.xml,
python/ndg.security.test/ndg/security/test/ca/simpleCAProperties.xml:
explanation about default openSSLConfigFilePath setting

python/ndg.security.common/ndg/security/common/wsSecurity.py: check X.509 cert text
on 64th char for newline not 65th.

python/ndg.security.common/ndg/security/common/openssl.py: fix to error reading file
exception message.

Location:
TI12-security/trunk/python
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/conf/simpleCAProperties.xml

    r2146 r2148  
    1616    <clntCertFile></clntCertFile>     
    1717        <!--  
    18         OpenSSL configuration file for Certificate Request settings - not 
    19         required if cert request is passed into sign method 
     18        OpenSSL configuration file - omit to use globus default 
     19        $HOME/.globus/simpleCA/grid-ca-ssl.conf 
     20    <openSSLConfigFilePath/> 
    2021        --> 
    21     <openSSLConfigFilePath/> 
    2222        <!-- 
    2323    certExpiryDate|certLifetimeDays may be set.  If both, then certExpiryDate  
     
    3333    <certTmpDir>/tmp<certTmpDir/> 
    3434    <!-- Executable for checking the CA pass-phrase set --> 
    35     <chkCAPassPhraseExe>openssl</chkCAPassPhraseExe> 
     35    <chkCAPassphraseExe>openssl</chkCAPassphraseExe> 
    3636    <!-- Executable for signing certificate request --> 
    3737    <signExe>grid-ca-sign</signExe> 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/openssl.py

    r2145 r2148  
    137137        except Exception, e: 
    138138            raise OpenSSLConfigError, \ 
    139                 "Error reading OpenSSL config file \"%s\: %s" % \ 
     139                "Error reading OpenSSL config file \"%s\": %s" % \ 
    140140                                                    (self.__filePath, str(e)) 
    141141        self._parseReqDN() 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/wsSecurity.py

    r2145 r2148  
    735735                # Convert parsed cert text into form that can be read 
    736736                # by X.509 string parser 
    737                 if x509CertTxt[65] != "\n": 
     737                if x509CertTxt[64] != "\n": 
    738738                    # Expecting cert split into lines of length 64 bytes 
    739739                    x509CertSpl = re.split('(.{64})', x509CertTxt) 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/MyProxy.py

    r2145 r2148  
    174174        class variable for a list of these 
    175175        """ 
    176  
    177         # Set-up parameter names for certificate request 
    178         self.__certReqDNParam = {} 
    179176         
    180177        # Check for parameter names set from input 
     
    382379        req.set_pubkey(pubKey) 
    383380         
    384         if self.__certReqDNParam: 
    385             certReqDNparam = self.__certReqDNParam 
    386         else: 
    387             defaultReqDN = self.__openSSLConf.reqDN 
    388              
    389             certReqDNparam = {} 
    390             certReqDNparam['O'] = defaultReqDN['0.organizationName'] 
    391             certReqDNparam['OU'] = defaultReqDN['0.organizationalUnitName'] 
    392              
     381        defaultReqDN = self.__openSSLConf.reqDN 
     382              
    393383        # Set DN 
    394384        x509Name = X509.X509_Name() 
    395385        x509Name.CN = CN 
    396         x509Name.OU = certReqDNparam['OU'] 
    397         x509Name.O = certReqDNparam['O'] 
     386        x509Name.OU = defaultReqDN.get('0.organizationalUnitName') or \ 
     387                        defaultReqDN['OU'] 
     388        x509Name.O = defaultReqDN.get('0.organizationName') or \ 
     389                        defaultReqDN['O'] 
     390                         
    398391        req.set_subject_name(x509Name) 
    399392         
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/ca/__init__.py

    r2147 r2148  
    8686                    'certTmpDir', 
    8787                    'caCertFile', 
    88                     'chkCAPassPhraseExe', 
     88                    'chkCAPassphraseExe', 
    8989                    'signExe', 
    9090                    'path'  ) 
    9191     
    92     __gridCASubDir = ".globus/simpleCA" 
     92    __gridCASubDir = os.path.join(".globus", "simpleCA") 
    9393    __gridCAConfigFile = "grid-ca-ssl.conf" 
    9494 
     
    105105 
    106106        SimpleCA([propFilePath=p, ][passphraseFilePath=pp|caPassphrase=cp, ] 
    107                 [ ... ]) 
     107                 [ ... ]) 
    108108          
    109109        @type propFilePath: string        
     
    136136        # os.environ - if self.__env is changed, so is os.environ 
    137137        self.__env = os.environ.copy() 
    138          
     138 
     139 
    139140        # Set-up parameter names for certificate request 
    140141        self.__openSSLConfig = OpenSSLConfig() 
    141142 
    142  
    143143        self.setProperties(**prop) 
    144144 
     145         
     146        # Set from input or use defaults based or environment variables 
     147        self.setPropFilePath(propFilePath) 
    145148 
    146149        # If properties file is set any parameters settings in file will 
    147150        # override those set by input keyword 
    148         if propFilePath is not None: 
    149             self.readProperties(propFilePath) 
    150  
    151         if self.__prop.get('openSSLConfigFilePath'): 
     151        self.readProperties() 
     152 
     153 
     154        # Set-up CA directory - use in chkCAPassphrase() 
     155        if not os.environ.get('HOME'): 
     156            raise SimpleCAError, "Environment variable \"HOME\" is not set" 
     157         
     158        if 'openSSLConfigFilePath' not in self.__prop:         
     159            self.__openSSLConfig.filePath = os.path.join(os.environ['HOME'],  
     160                                                   self.__gridCASubDir, 
     161                                                   self.__gridCAConfigFile) 
    152162            self.__openSSLConfig.read() 
    153              
    154         if not 'GLOBUS_LOCATION' in os.environ or \ 
    155            not os.environ['GLOBUS_LOCATION']: 
     163 
     164             
     165        if not os.environ.get('GLOBUS_LOCATION'): 
    156166            raise SimpleCAError, \ 
    157167                        "Environment variable \"GLOBUS_LOCATION\" is not set" 
    158  
    159  
    160         # Set-up CA directory - use in chkCAPassPhrase() 
    161         if not 'HOME' in os.environ or not os.environ['HOME']: 
    162             raise SimpleCAError, "Environment variable \"HOME\" is not set" 
    163                  
    164         self.__gridCAConfigFilePath = os.path.join(os.environ['HOME'],  
    165                                                    self.__gridCASubDir, 
    166                                                    self.__gridCAConfigFile) 
    167  
     168        
    168169         
    169170        # Set pass-phrase from file or string input - Check HERE because 
     
    175176            except Exception, e: 
    176177                raise SimpleCAError, "Reading configuration file: %s" % e 
    177              
     178         
     179        self.__caPassphrase = None     
    178180        if caPassphrase is not None: 
    179             self.__setCAPassPhrase(caPassphrase) 
     181            self.__setCAPassphrase(caPassphrase) 
    180182 
    181183 
     
    192194    def __delitem__(self, key): 
    193195        "SimpleCA Properties keys cannot be removed"         
    194         raise SimpleCAError, 'Keys cannot be deleted from ' + \ 
     196        raise KeyError, 'Keys cannot be deleted from ' + \ 
    195197                            self.__class__.__name__ 
    196198 
     
    203205            return self.__prop[key]                 
    204206        else: 
    205             raise SimpleCAError, "Property with key '%s' not found" % key 
     207            raise KeyError, "Property with key '%s' not found" % key 
    206208         
    207209    def clear(self): 
    208         raise SimpleCAError, "Data cannot be cleared from " + \ 
     210        raise KeyError, "Data cannot be cleared from " + \ 
    209211                            self.__class__.__name__ 
    210212     
     
    229231 
    230232 
    231     def __setCAPassPhrase(self, caPassphrase): 
     233    def __setCAPassphrase(self, caPassphrase): 
    232234        """Give this instance the pass-phrase for the SimpleCA""" 
    233         self.chkCAPassPhrase(caPassphrase)         
     235        self.chkCAPassphrase(caPassphrase)         
    234236        self.__caPassphrase = caPassphrase 
    235237            
    236     caPassphrase = property(fset=__setCAPassPhrase, 
     238    caPassphrase = property(fset=__setCAPassphrase, 
    237239                            doc="Enter pass-phrase for Simple CA") 
    238240 
     
    305307                                    "YYYY mm dd HH MM SS. Year, month, " + \ 
    306308                                    "day, hour minute, second respectively."  
    307       
     309 
     310 
     311        if 'openSSLConfigFilePath' in prop: 
     312            self.__openSSLConfig.filePath = prop['openSSLConfigFilePath'] 
     313            self.__openSSLConfig.read() 
     314             
     315             
    308316    #_________________________________________________________________________    
    309317    @staticmethod                                
    310     def __filtTxt(txt):           
     318    def __filtTxt(tag, txt):           
    311319        if isinstance(txt, basestring): 
    312320            if txt.isdigit(): 
    313321                return int(txt) 
    314             else: 
    315                 return os.path.expandvars(txt) 
    316         else: 
    317             return txt 
     322             
     323            elif tag != 'keyPwd':  
     324                # Password may contain leading/trailing spaces 
     325                return os.path.expandvars(txt.strip()) 
     326         
     327        return txt 
    318328 
    319329 
     
    325335 
    326336        @type propElem: ElementTree node 
    327         @keyword propElem: set to read beginning from a ElementTree node"""       
    328  
    329         if propFilePath is not None: 
     337        @keyword propElem: set to read beginning from a ElementTree node. 
     338        If not set, file self.__propFilePath will be read"""       
     339 
     340        if propElem is None: 
    330341            try: 
    331                 tree = ElementTree.parse(propFilePath) 
     342                tree = ElementTree.parse(self.__propFilePath) 
    332343                propElem = tree.getroot() 
    333344                 
     
    341352                                    str(e) 
    342353 
    343         if propElem is None: 
    344             raise SimpleCAError, "Root element for parsing is not defined" 
    345  
    346354 
    347355        # Read properties into a dictionary 
    348         prop=dict([(elem.tag,self.__filtTxt(elem.text)) for elem in propElem]) 
     356        prop = dict([(elem.tag, self.__filtTxt(elem.tag, elem.text)) \ 
     357                     for elem in propElem]) 
    349358 
    350359        # Ensure Certificate Lifetime is converted into a numeric type 
     
    369378 
    370379    #_________________________________________________________________________ 
    371     def chkCAPassPhrase(self, caPassphrase=None): 
     380    def chkCAPassphrase(self, caPassphrase=None): 
    372381        """Check given pass-phrase is correct for CA private key 
    373382         
     
    382391        else: 
    383392            if not isinstance(caPassphrase, basestring): 
    384                 raise SimpleCAError, "CA Pass-phrase must be a valid string" 
    385          
    386         chkCAPassPhraseCmd = [ 
    387             self.__prop['chkCAPassPhraseExe'], 
     393                raise SimpleCAPassPhraseError, \ 
     394                                    "CA Pass-phrase must be a valid string" 
     395         
     396        chkCAPassphraseCmd = [ 
     397            self.__prop['chkCAPassphraseExe'], 
    388398            'ca', 
    389             '-config',  self.__gridCAConfigFilePath, 
     399            '-config',  self.__openSSLConfig.filePath, 
    390400            '-gencrl', 
    391401            '-passin', 'stdin'] 
     
    398408            try: 
    399409                # open pipe to pass to stdin 
    400                 chkCAPassPhraseR, chkCAPassPhraseW = os.pipe() 
    401                 os.write(chkCAPassPhraseW, caPassphrase) 
    402                  
    403                 chkCAPassPhraseProc = Popen(chkCAPassPhraseCmd, 
    404                                            stdin=chkCAPassPhraseR, 
     410                chkCAPassphraseR, chkCAPassphraseW = os.pipe() 
     411                os.write(chkCAPassphraseW, caPassphrase) 
     412                 
     413                chkCAPassphraseProc = Popen(chkCAPassphraseCmd, 
     414                                           stdin=chkCAPassphraseR, 
    405415                                           stdout=PIPE, 
    406416                                           stderr=STDOUT, 
     
    408418            finally: 
    409419                try: 
    410                     os.close(chkCAPassPhraseR) 
    411                     os.close(chkCAPassPhraseW) 
     420                    os.close(chkCAPassphraseR) 
     421                    os.close(chkCAPassphraseW) 
    412422                except: pass 
    413423 
     
    415425            # File must be closed + close_fds set to True above otherwise 
    416426            # wait() call will hang                 
    417             if chkCAPassPhraseProc.wait(): 
    418                 errMsg = chkCAPassPhraseProc.stdout.read() 
     427            if chkCAPassphraseProc.wait(): 
     428                errMsg = chkCAPassphraseProc.stdout.read() 
    419429            else: 
    420430                errMsg = None 
     
    522532        # ... or from string input 
    523533        if caPassphrase is not None: 
    524             self.__setCAPassPhrase(caPassphrase) 
     534            self.__setCAPassphrase(caPassphrase) 
    525535             
    526536        if self.__caPassphrase is None: 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/ca/server-config.tac

    r2146 r2148  
    2222 
    2323from CertificateAuthority_services_server import CertificateAuthorityService 
    24 from ndg.security.server.ca import SimpleCA 
     24from ndg.security.server.ca import SimpleCA, SimpleCAPassPhraseError 
    2525from ndg.security.common.wsSecurity import WSSecurityHandlerChainFactory, \ 
    2626        WSSecurityHandler, SignatureHandler 
     
    3838        self.ca = SimpleCA() 
    3939         
     40         
     41        # Check for CA pass-phrase input 
     42        try: 
     43                self.ca.chkCAPassphrase() 
     44        except SimpleCAPassPhraseError: 
     45                import getpass 
     46         
     47                nTries = 0 
     48                while nTries < 10: 
     49                    try: 
     50                        simpleCA.caPassphrase = \ 
     51                            getpass.getpass(prompt="CA Pass-phrase: ") 
     52                        break 
     53                     
     54                    except KeyboardInterrupt: 
     55                        sys.exit(1) 
     56                         
     57                    except SimpleCAPassPhraseError: 
     58                        nTries += 1 
     59                        if nTries >= 10: 
     60                            print >>sys.stderr, \ 
     61                                "Invalid Pass-phrase - exiting after 10 attempts" 
     62                            sys.exit(1) 
     63                        else: 
     64                            print >>sys.stderr, "Invalid pass-phrase" 
     65 
     66        
    4067    def soap_issueCert(self, ps, **kw): 
    4168        import pdb;pdb.set_trace() 
    4269        request,response = CertificateAuthorityService.soap_issueCert(self,ps) 
    4370         
    44         response.cert = self.ca.sign(certReq=request.CertReq)[0] 
     71        response.X509Cert = self.ca.sign(certReq=request.X509CertReq)[0] 
    4572        return request, response 
    4673 
     
    6794# public and private keys 
    6895WSSecurityHandler.signatureHandler = SignatureHandler(\ 
    69                                                                 verifyingCertFilePath=srv.ca['clntCertFile'], 
    70                                     signingCertFilePath=srv.ca['certFile'], 
    71                                     signingPriKeyFilePath=srv.ca['keyFile'], 
    72                                     signingPriKeyPwd=srv.ca['keyPwd']) 
     96                                                        verifyingCertFilePath=srv.ca.get('clntCertFile'), 
     97                            signingCertFilePath=srv.ca['certFile'], 
     98                            signingPriKeyFilePath=srv.ca['keyFile'], 
     99                            signingPriKeyPwd=srv.ca['keyPwd']) 
    73100 
    74101# Add Service to Session Manager branch 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/ca/simpleCAProperties.xml

    r2146 r2148  
    1616    <clntCertFile></clntCertFile>     
    1717        <!--  
    18         OpenSSL configuration file for Certificate Request settings - not 
    19         required if cert request is passed into sign method 
     18        OpenSSL configuration file - omit to use globus default 
     19        $HOME/.globus/simpleCA/grid-ca-ssl.conf 
    2020        --> 
    21     <openSSLConfigFilePath>$GRID_SECURITY_DIR/globus-user-ssl.conf</> 
    22     <certLifetimeDays>365<certLifetimeDays/> 
     21    <openSSLConfigFilePath> 
     22    $GRID_SECURITY_DIR/globus-user-ssl.conf 
     23    </openSSLConfigFilePath> 
     24    <certLifetimeDays>365</certLifetimeDays> 
    2325    <!-- 
    2426    <certExpiryDate/> 
    2527    --> 
    2628    <!-- Directory for temporary files generated during processing --> 
    27     <certTmpDir>/tmp<certTmpDir/> 
     29    <certTmpDir>/tmp</certTmpDir> 
    2830    <!-- Executable for checking the CA pass-phrase set --> 
    29     <chkCAPassPhraseExe>openssl</chkCAPassPhraseExe> 
     31    <chkCAPassphraseExe>openssl</chkCAPassphraseExe> 
    3032    <!-- Executable for signing certificate request --> 
    31     <signExe>grid-ca-sign<signExe/> 
     33    <signExe>grid-ca-sign</signExe> 
    3234    <!-- Set ':' paths for executables  
    3335    /usr/bin and /bin are required by grep and ? used in grid-ca-sign script  
    3436    --> 
    35     <path>$GLOBUS_LOCATION/bin:/usr/bin:/bin<path/> 
     37    <path>$GLOBUS_LOCATION/bin:/usr/bin:/bin</path> 
    3638</simpleCAProp> 
Note: See TracChangeset for help on using the changeset viewer.