Ignore:
Timestamp:
11/12/07 17:41:51 (12 years ago)
Author:
pjkersha
Message:

Major changes to enable trust based on multiple CAs and use of dynamically created user certs from MyProxy? SimpleCA - affects ...
python/ndg.security.server/ndg/security/server/AttAuthority/init.py,
python/ndg.security.test/ndg/security/test/AttAuthority/siteAAttAuthorityProperties.xml,
python/ndg.security.test/ndg/security/test/AttAuthority/siteBAttAuthorityProperties.xml,
python/ndg.security.server/ndg/security/server/conf/attAuthorityProperties.xml,
python/ndg.security.server/ndg/security/server/SessionMgr/init.py,
python/ndg.security.test/ndg/security/test/sessionMgrClient/sessionMgrProperties.xml,
python/ndg.security.server/ndg/security/server/conf/sessionMgrProperties.xml,
python/ndg.security.server/ndg/security/server/MyProxy.py,
python/ndg.security.test/ndg/security/test/sessionMgr/test.py,
python/ndg.security.common/ndg/security/common/CredWallet.py

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

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/CredWallet.py

    r3040 r3133  
    8181class CredWalletAttributeRequestDenied(CredWalletError):     
    8282    """Handling exception where CredWallet is denied authorisation by an 
    83     Attribute Authority.""" 
     83    Attribute Authority. 
     84   
     85    @type __extAttCertList: list 
     86    @ivar __extAttCertList: list of candidate Attribute Certificates that 
     87    could be used to try to get a mapped certificate from the target  
     88    Attribute Authority 
     89     
     90    @type __trustedHostInfo: dict 
     91    @ivar __trustedHostInfo: dictionary indexed by host name giving  
     92    details of Attribute Authority URI and roles for trusted hosts""" 
    8493     
    8594    def __init__(self, *args, **kw): 
     
    159168# of new Get/Set methods for hiding of attributes 
    160169class CredWallet(object): 
    161     """Volatile store of user credentials associated with a user session""" 
     170    """Volatile store of user credentials associated with a user session 
     171     
     172    @type __credRepos: ndg.security.common.CredRepos or derivative 
     173    @ivar __credRepos: reference to Credential Repository object.  An optional 
     174    non-volatile cache for storage of wallet info when  
     175 
     176    @type __mapFromTrustedHosts: bool 
     177    @ivar __mapFromTrustedHosts: if true, allow a mapped attribute certificate 
     178    to obtained in a getAttCert call.  Set false to prevent mappings. 
     179 
     180    @type __rtnExtAttCertList: bool 
     181    @ivar __rtnExtAttCertList: if true, return a list of external attribute  
     182    certificates from getAttCert call 
     183 
     184    @type __dn: ndg.security.common.X509.X500DN 
     185    @ivar __dn: distinguished name from user certificate 
     186 
     187    @type __credentials: dict        
     188    @ivar __credentials: Credentials are stored as a dictionary one element per attribute 
     189    certicate held and indexed by certificate issuer name 
     190 
     191    @type __caCertFilePathList: basestring, list, tuple or None 
     192    @ivar __caCertFilePathList: file path(s) to CA certificates.  If None 
     193    then the input is quietly ignored.  See caCertFilePathList property 
     194 
     195    @type __userCert: ndg.security.common.X509.X509Cert 
     196    @ivar __userCert: X.509 user certificate instance 
     197 
     198    @type __issuingCert: ndg.security.common.X509.X509Cert 
     199    @ivar __issuingCert: X.509 user certificate instance 
     200  
     201    @type __userPriKey: M2Crypto.RSA.RSA 
     202    @ivar __userPriKey: Private key used to sign outbound message 
     203    """ 
    162204 
    163205    __metaclass__ = _MetaCredWallet 
    164206     
    165207    def __init__(self, 
    166                  proxyCert, 
    167                  proxyPriKey, 
    168208                 userCert, 
     209                 userPriKey, 
     210                 issuingCert=None, 
     211                 caCertFilePathList=None, 
    169212                 aaURI=None, 
    170213                 aaPropFilePath=None, 
    171                  caCertFilePath=None, 
    172214                 credRepos=None, 
    173215                 mapFromTrustedHosts=False, 
     
    176218        """Create store of user credentials for their current session 
    177219 
    178         @type proxyCert: string / M2Crypto.X509.X509 / 
     220        @type userCert: string / M2Crypto.X509.X509 / 
    179221        ndg.security.common.X509.X509Cert 
    180         @param proxyCert: X.509 proxy certificate for user 
    181          
    182         @type proxyPriKey: string / M2Crypto.RSA.RSA  
    183         @param proxyPriKey: private key for proxy 
    184          
    185         @type userCert: string / ndg.security.common.X509.X509Cert 
    186         @param userCert: X.509 cert for issuer of proxy 
     222        @param userCert: X.509 certificate for user 
     223         
     224        @type userPriKey: string / M2Crypto.RSA.RSA  
     225        @param userPriKey: private key for user cert 
     226         
     227        @type issuingCert: string / ndg.security.common.X509.X509Cert 
     228        @param issuingCert: X.509 cert for issuer of user cert 
    187229         
    188230        @type aaURI: string 
     
    199241        location rather to any self.__aa running locally. 
    200242         
    201         @type caCertFilePath: string 
    202         @param caCertFilePath: Certificate Authority's certificate - used in 
    203         validation of signed Attribute Certificates.  If not set here, it must 
     243        @type caCertFilePathList: string (for single file), list or tuple 
     244        @param caCertFilePathList: Certificate Authority's certificates - used 
     245        in validation of signed Attribute Certificates and WS-Security  
     246        signatures of incoming messages.  If not set here, it must 
    204247        be input in call to getAttCert. 
    205248                 
     
    225268        whether to replace an existing AC in the cache with a fresh one.  If  
    226269        the existing one has less than attCertRefreshElapse time in seconds 
    227         left before expiry then replace it.""" 
     270        left before expiry then replace it. 
     271        """ 
    228272 
    229273        log.debug("Calling CredWallet.__init__ ...") 
     
    231275        self.attCertRefreshElapse = attCertRefreshElapse 
    232276         
    233         self.__setProxyCert(proxyCert) 
    234         self.__setProxyPriKey(proxyPriKey) 
    235277        self.__setUserCert(userCert) 
     278        self.__setUserPriKey(userPriKey) 
     279        self.__setIssuingCert(issuingCert) 
    236280         
    237281        self.__setAAuri(aaURI) 
    238         self.__setCAcertFilePath(caCertFilePath) 
     282        self.__setCAcertFilePathList(caCertFilePathList) 
    239283                 
    240284        self.__credRepos = credRepos or NullCredRepos() 
     
    245289         
    246290         
    247         # Get the distinguished name from the proxy certificate 
    248         self.__dn = self.__proxyCert.dn.serialise() 
     291        # Get the distinguished name from the user certificate 
     292        self.__dn = self.__userCert.dn.serialise() 
    249293         
    250294         
     
    338382 
    339383    #_________________________________________________________________________ 
    340     def __setProxyCert(self, proxyCert): 
    341         "Set property method for X.509 proxy cert." 
    342         self.__proxyCert = self.__setCert(proxyCert) 
    343          
    344  
    345     def __getProxyCert(self): 
    346         """Get proxy cert X509Cert instance""" 
    347         return self.__proxyCert 
    348  
    349  
    350     # Proxy Cert instance is read-only - to set it, set proxyCertTxt 
    351     proxyCert = property(fget=__getProxyCert, 
    352                          fset=__setProxyCert, 
    353                          doc="X.509 proxy certificate instance") 
    354  
    355  
    356     #_________________________________________________________________________ 
    357384    def __setUserCert(self, userCert): 
    358385        "Set property method for X.509 user cert." 
     
    364391        return self.__userCert 
    365392 
    366  
    367     # User Cert instance is read-only - to set it, set proxyCertTxt 
    368393    userCert = property(fget=__getUserCert, 
    369                          fset=__setUserCert, 
     394                        fset=__setUserCert, 
     395                        doc="X.509 user certificate instance") 
     396 
     397 
     398    #_________________________________________________________________________ 
     399    def __setIssuingCert(self, issuingCert): 
     400        "Set property method for X.509 user cert." 
     401        self.__issuingCert = self.__setCert(issuingCert) 
     402         
     403 
     404    def __getIssuingCert(self): 
     405        """Get user cert X509Cert instance""" 
     406        return self.__issuingCert 
     407 
     408    issuingCert = property(fget=__getIssuingCert, 
     409                         fset=__setIssuingCert, 
    370410                         doc="X.509 user certificate instance") 
    371411      
    372412  
    373413    #_________________________________________________________________________ 
    374     def __setProxyPriKey(self, proxyPriKey): 
     414    def __setUserPriKey(self, userPriKey): 
    375415        """Set method for client private key 
    376416         
    377         Nb. if input is a string, proxyPriKeyPwd will need to be set if 
     417        Nb. if input is a string, userPriKeyPwd will need to be set if 
    378418        the key is password protected. 
    379419         
    380         @type proxyPriKey: M2Crypto.RSA.RSA / string 
    381         @param proxyPriKey: private key used to sign message""" 
    382          
    383         if isinstance(proxyPriKey, basestring): 
    384             self.__proxyPriKey = RSA.load_key_string(proxyPriKey, 
     420        @type userPriKey: M2Crypto.RSA.RSA / string 
     421        @param userPriKey: private key used to sign message""" 
     422         
     423        if isinstance(userPriKey, basestring): 
     424            self.__userPriKey = RSA.load_key_string(userPriKey, 
    385425                                             callback=lambda *ar, **kw: None) 
    386  
    387         elif isinstance(proxyPriKey, RSA.RSA): 
    388             self.__proxyPriKey = proxyPriKey  
    389                     
     426        elif isinstance(userPriKey, RSA.RSA): 
     427            self.__userPriKey = userPriKey           
    390428        else: 
    391             raise AttributeError, "Proxy private key must be a valid " + \ 
     429            raise AttributeError, "user private key must be a valid " + \ 
    392430                                  "M2Crypto.RSA.RSA type or a string" 
    393431                 
    394     proxyPriKey = property(fset=__setProxyPriKey, 
    395                              doc="Private key used to sign outbound message") 
    396      
    397      
    398     #_________________________________________________________________________ 
    399     # Credentials are read-only 
     432    userPriKey = property(fset=__setUserPriKey, 
     433                          doc="Private key used to sign outbound message") 
     434 
     435    
    400436    def __getCredentials(self): 
     437        """Get Property method.  Credentials are read-only 
     438         
     439        @rtype: dict 
     440        @return: cached ACs indesed by issuing organisation name""" 
    401441        return self.__credentials 
    402442 
     
    407447 
    408448    #_________________________________________________________________________ 
    409     def __setCAcertFilePath(self, caCertFilePath): 
    410          
    411         if not isinstance(caCertFilePath, basestring) and \ 
    412            caCertFilePath is not None: 
     449    def __getCAcertFilePathList(self): 
     450        """Get CA cert or certs used to validate AC signatures and signatures 
     451        of peer SOAP messages. 
     452         
     453        @rtype caCertFilePathList: basestring, list or tuple 
     454        @return caCertFilePathList: file path(s) to CA certificates.""" 
     455        return self.__caCertFilePathList 
     456     
     457    #_________________________________________________________________________ 
     458    def __setCAcertFilePathList(self, caCertFilePathList): 
     459        """Set CA cert or certs to validate AC signatures, signatures 
     460        of Attribute Authority SOAP responses and SSL connections where  
     461        AA SOAP service is run over SSL. 
     462         
     463        @type caCertFilePathList: basestring, list, tuple or None 
     464        @param caCertFilePathList: file path(s) to CA certificates.  If None 
     465        then the input is quietly ignored.""" 
     466         
     467        if isinstance(caCertFilePathList, basestring): 
     468           self.__caCertFilePathList = [caCertFilePathList] 
     469            
     470        elif isinstance(caCertFilePathList, list): 
     471           self.__caCertFilePathList = caCertFilePathList 
     472            
     473        elif isinstance(caCertFilePathList, tuple): 
     474           self.__caCertFilePathList = list(caCertFilePathList) 
     475 
     476        elif caCertFilePathList is not None: 
    413477            raise CredWalletError, \ 
    414                         "Input CA Certificate file path is not a valid string" 
    415                  
    416         self.__caCertFilePath = caCertFilePath 
    417         
    418          
    419     caCertFilePath = property(fset=__setCAcertFilePath, 
    420                               doc="CA Certificate  - use to check AC XML Sig") 
     478                        "Input CA Certificate file path is not a valid string"       
     479         
     480    caCertFilePathList = property(fget=__getCAcertFilePathList, 
     481                                  fset=__setCAcertFilePathList, 
     482                                  doc="CA Certificates - used for " + \ 
     483                                      "verification of AC and SOAP " + \ 
     484                                      "message signatures and SSL " + \ 
     485                                      "connections") 
    421486 
    422487 
     
    433498        log.debug('CredWallet.__createAAClnt for service: "%s"' % aaURI) 
    434499         
    435         # Initialise WS-Security signature handling to pass  
    436         # BinarySecurityToken containing proxy cert and user cert that issued 
    437         # the proxy 
    438  
    439         reqBinSecTokValType=SignatureHandler.binSecTokValType["X509PKIPathv1"] 
    440         certChain = (self.__userCert, self.__proxyCert) 
    441         caCertFilePathList = (self.__caCertFilePath,) 
     500        if self.__issuingCert is not None: 
     501            # Initialise WS-Security signature handling to pass  
     502            # BinarySecurityToken containing user cert and cert for user cert  
     503            # issuer  
     504            reqBinSecTokValType=SignatureHandler.binSecTokValType["X509PKIPathv1"] 
     505            certChain = (self.__issuingCert, self.__userCert) 
     506            signingCert = None 
     507        else: 
     508            # Pass user cert only - no need to pass a cert chain.  This type  
     509            # of token is more likely to be supported by the various 
     510            # WS-Security toolkits 
     511            reqBinSecTokValType=SignatureHandler.binSecTokValType["X509v3"]             
     512            certChain = None 
     513            signingCert = self.__userCert 
    442514         
    443515        aaClnt = AttAuthorityClient(uri=aaURI, 
    444                                     reqBinSecTokValType=reqBinSecTokValType,  
    445                                     signingCertChain=certChain, 
    446                                     signingPriKey=self.__proxyPriKey, 
    447                                     caCertFilePathList=caCertFilePathList, 
    448                                     sslCACertFilePathList=caCertFilePathList) 
     516                                reqBinSecTokValType=reqBinSecTokValType,  
     517                                signingCertChain=certChain, 
     518                                signingCert=self.__userCert, 
     519                                signingPriKey=self.__userPriKey, 
     520                                caCertFilePathList=self.__caCertFilePathList, 
     521                                sslCACertFilePathList=caCertFilePathList) 
    449522        return aaClnt 
    450523 
     
    516589    #_________________________________________________________________________ 
    517590    def isValid(self, **x509CertKeys): 
    518         """Check wallet's proxy cert.  If expired return False 
     591        """Check wallet's user cert.  If expired return False 
    519592         
    520593        @type **x509CertKeys: dict 
    521594        @param **x509CertKeys: keywords applying to  
    522595        ndg.security.common.X509.X509Cert.isValidTime method""" 
    523         return self.__proxyCert.isValidTime(**x509CertKeys) 
     596        return self.__userCert.isValidTime(**x509CertKeys) 
    524597 
    525598     
     
    699772        # Update attribute Certificate instance with CA's certificate ready  
    700773        # for signature check in addCredential() 
    701         if self.__caCertFilePath is None: 
     774        if self.__caCertFilePathList is None: 
    702775            raise CredWalletError, "No CA certificate has been set" 
    703776         
    704         attCert.certFilePathList = self.__caCertFilePath 
     777        attCert.certFilePathList = self.__caCertFilePathList 
    705778 
    706779         
     
    783856         
    784857        """For a given role, get an Attribute Certificate from an Attribute  
    785         Authority using a user's proxy certificate.  If this fails try to make 
     858        Authority using a user's X.509 certificate.  If this fails try to make 
    786859        a mapped Attribute Certificate by using a certificate from another  
    787860        host which has a trust relationship to the Attribute Authority in  
     
    795868        The procedure is: 
    796869 
    797         1) Try attribute request using proxy certificate 
     870        1) Try attribute request using user certificate 
    798871        2) If the Attribute Authority (AA) doesn't recognise the certificate, 
    799872        find out any other hosts which have a trust relationship to the AA. 
     
    818891                                 
    819892        @type mapFromTrustedHosts: bool / None      
    820         @param mapFromTrustedHosts: if request fails via the user's proxy 
     893        @param mapFromTrustedHosts: if request fails via the user's cert 
    821894        ID, then it is possible to get a mapped certificate by using  
    822895        certificates from other AA's.  Set this flag to True, to allow this  
     
    853926        @param extAttCertList: Attribute Certificate or list of certificates 
    854927        from other Attribute Authorities.  These can be used to get a mapped  
    855         certificate if access fails based on the user's proxy certificate 
     928        certificate if access fails based on the user's certificate 
    856929        credentials.  They are tried out in turn until access is granted so  
    857930        the order of the list decides the order in which they will be tried 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/AttAuthority/__init__.py

    r3001 r3133  
    7171    tokens - attribute certificates. 
    7272     
    73     @type __validKeys: list 
     73    @type __validKeys: dict 
    7474    @cvar __validKeys: valid configuration property keywords - properties file 
    7575    must contain these 
     
    9494     
    9595    # valid configuration property keywords 
    96     __validKeys = ( 'name', 
    97                     'portNum', 
    98                     'useSSL', 
    99                     'sslCertFile', 
    100                     'sslKeyFile', 
    101                     'sslKeyPwd', 
    102                     'useSignatureHandler', 
    103                     'certFile', 
    104                     'keyFile', 
    105                     'keyPwd', 
    106                     'caCertFile', 
    107                     'clntCertFile', 
    108                     'attCertLifetime', 
    109                     'attCertNotBeforeOff', 
    110                     'attCertFileName', 
    111                     'attCertFileLogCnt', 
    112                     'mapConfigFile', 
    113                     'attCertDir', 
    114                     'dnSeparator', 
    115                     'userRolesModFilePath', 
    116                     'userRolesModName', 
    117                     'userRolesClassName', 
    118                     'userRolesPropFile') 
     96    __validKeys = { 'name':                '', 
     97                    'portNum':             -1, 
     98                    'useSSL':              False, 
     99                    'sslCertFile':         '', 
     100                    'sslKeyFile':          '', 
     101                    'sslKeyPwd':           '', 
     102                    'useSignatureHandler': True, 
     103                    'certFile':            '', 
     104                    'keyFile':             '', 
     105                    'keyPwd':              '', 
     106                    'caCertFileList':      [], 
     107                    'clntCertFile':        '', 
     108                    'attCertLifetime':     -1, 
     109                    'attCertNotBeforeOff': 0, 
     110                    'attCertFileName':     '', 
     111                    'attCertFileLogCnt':   0, 
     112                    'mapConfigFile':       '', 
     113                    'attCertDir':          '', 
     114                    'dnSeparator':         '', 
     115                    'userRolesModFilePath':'', 
     116                    'userRolesModName':    '', 
     117                    'userRolesClassName':  '', 
     118                    'userRolesPropFile':   ''} 
    119119     
    120120    def __init__(self, propFilePath=None, bReadMapConfig=True): 
     
    168168        # Check CA certificate 
    169169        log.debug("Reading and checking X.509 CA certificate ...") 
    170         caCert = X509Cert(self.__prop['caCertFile']) 
    171         caCert.read() 
    172          
    173         try: 
    174             caCert.isValidTime(raiseExcep=True) 
    175              
    176         except Exception, e: 
    177             raise AttAuthorityError, "CA certificate is invalid: " + str(e) 
     170        for caCertFile in self.__prop['caCertFileList']: 
     171            caCert = X509Cert(caCertFile) 
     172            caCert.read() 
     173             
     174            try: 
     175                caCert.isValidTime(raiseExcep=True) 
     176                 
     177            except Exception, e: 
     178                raise AttAuthorityError,'CA certificate "%s" is invalid: %s'%\ 
     179                                        (caCert.dn, e) 
    178180         
    179181        # Issuer details - serialise using the separator string set in the 
     
    426428        attCert = AttCert() 
    427429 
    428         attCert.certFilePathList = [self.__prop['certFile'], 
    429                                     self.__prop['caCertFile']] 
     430        attCert.certFilePathList = [self.__prop['certFile']] + \ 
     431                                    self.__prop['caCertFileList'] 
    430432         
    431433        attCert.signingKeyFilePath = self.__prop['keyFile'] 
     
    531533            try: 
    532534                # Give path to CA cert to allow check 
    533                 userAttCert.certFilePathList = self.__prop['caCertFile'] 
     535                userAttCert.certFilePathList = self.__prop['caCertFileList'] 
    534536                userAttCert.isValid(raiseExcep=True) 
    535537                 
     
    630632        try: 
    631633            for elem in aaProp: 
    632                 if elem.tag in self.__class__.__validKeys: 
     634                if elem.tag in AttAuthority.__validKeys: 
    633635                 
    634636                    # Make sure to leave password element contents unchanged 
    635                     if 'eyPwd' not in elem.tag and elem.text:  
     637                    if isinstance(AttAuthority.__validKeys[elem.tag], list): 
     638                        self.__prop[elem.tag] = \ 
     639                            [os.path.expandvars(subElem.text.strip()) \ 
     640                             for subElem in elem] 
     641                             
     642                    elif 'eyPwd' not in elem.tag and elem.text:  
    636643                        self.__prop[elem.tag] = \ 
    637644                                        os.path.expandvars(elem.text.strip()) 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/MyProxy.py

    r3047 r3133  
    113113    http://grid.ncsa.uiuc.edu/myproxy/protocol/ 
    114114     
     115    @type __getCmd: string 
    115116    @cvar __getCmd: get command string 
     117     
     118    @type __infoCmd: string 
    116119    @cvar __infoCmd: info command string 
     120     
     121    @type __destroyCmd: string 
    117122    @cvar __destroyCmd: destroy command string 
     123     
     124    @type __changePassphrase: string 
    118125    @cvar __changePassphrase: command string to change cred pass-phrase 
     126     
     127    @type __storeCmd: string 
    119128    @cvar __storeCmd: store command string 
     129     
     130    @type _hostCertSubDirPath: string 
    120131    @cvar _hostCertSubDirPath: sub-directory path host certificate (as tuple) 
     132     
     133    @type _hostKeySubDirPath: string 
    121134    @cvar _hostKeySubDirPath: sub-directory path to host key (as tuple) 
    122     @cvar _certReqDNparamName: names of parameters needed to generate a  
    123     certificate request e.g. CN, OU etc. 
     135     
     136    @type __validKeys: tuple 
    124137    @cvar __validKeys: sets permissable element names for MyProxy XML config 
    125138    file 
     
    347360            raise SessionMgrError, \ 
    348361                "Error parsing tag \"%s\" in properties file" % elem.tag 
    349              
     362         
    350363        self.setProperties(**prop) 
    351364 
     
    523536        pemCerts = []         
    524537        dat = inputDat 
    525  
     538         
    526539        while dat:     
    527540            # find start of cert, get length         
     
    844857        Exceptions:  GetError, RetrieveError 
    845858         
     859        @type username: basestring 
    846860        @param username: username of credential 
     861         
     862        @type passphrase: basestring 
    847863        @param passphrase: pass-phrase for private key of credential held on 
    848864        server 
    849         @return list containing the credentials as strings in PEM format: the 
    850         proxy certificate, it's private key and the signing certificate. 
     865         
     866        @rtype: tuple 
     867        @return credentials as strings in PEM format: the 
     868        user certificate, it's private key and the issuing certificate.  The 
     869        issuing certificate is only set if the user certificate is a proxy 
    851870        """ 
    852871         
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/SessionMgr/__init__.py

    r3041 r3133  
    158158        try: 
    159159            # Proxy certificate's not after time determines the expiry 
    160             dtNotAfter = self.credWallet.proxyCert.notAfter 
     160            dtNotAfter = self.credWallet.userCert.notAfter 
    161161 
    162162            return dtNotAfter.strftime(self.__sessCookieExpiryFmt) 
     
    289289  
    290290        encrSessMgrURI = self.encodeSessionMgrURI(sessMgrURI, encrKey) 
    291         dtExpiry = self.credWallet.proxyCert.notAfter 
     291        dtExpiry = self.credWallet.userCert.notAfter 
    292292         
    293293        # Call class method  
     
    347347        'sslCertFile':            None, 
    348348        'sslKeyFile':             None, 
     349        'sslCACertDir':           None, 
    349350        'useSignatureHandler':    None, 
    350         'caCertFile':             None, 
     351        'caCertFileList':         [], 
    351352        'certFile':               None, 
    352353        'keyFile':                None, 
     
    626627            raise SessionMgrError, \ 
    627628                            "Parsing properties: root element is not defined" 
    628  
    629  
    630          
     629  
    631630        missingElem = [] 
    632631        invalidElem = [] 
     
    658657                    # field as password might contain leading or  
    659658                    # trailing white space 
    660                     if elem.text is not None and elem.tag != 'keyPwd':                         
     659                    if isinstance(self.__validElem[elem.tag], list): 
     660                        self.__prop[elem.tag] = [filtElemTxt(subElem) \ 
     661                                                 for subElem in elem] 
     662                         
     663                    elif elem.text is not None and elem.tag != 'keyPwd':                         
    661664                        if elem.text.isdigit(): 
    662665                            self.__prop[elem.tag] = int(elem.text) 
    663666                        else:                             
    664667                            # Check for environment variables in file paths 
    665                             self.__prop[elem.tag] = filtElemTxt(elem) 
     668                            self.__prop[elem.tag] = filtElemTxt(elem)         
    666669                    else: 
    667670                        self.__prop[elem.tag] = elem.text 
     
    711714                # Only update other keys if they are not None or "" 
    712715                if value: 
    713                     self.__prop[key] = value                 
     716                    if isinstance(value, basestring): 
     717                        self.__prop[key] = os.path.expandvars(value).strip() 
     718                    else: 
     719                        self.__prop[key] = value               
    714720            else: 
    715721                raise SessionMgrError, \ 
    716                 "Key \"%s\" is not a valid Session Manager property" % key 
    717  
    718  
     722                    "Key \"%s\" is not a valid Session Manager property" % key 
     723         
     724         
    719725    #_________________________________________________________________________ 
    720726    def addUser(self, username, passphrase=None):         
     
    812818                username=None, 
    813819                passphrase=None,  
    814                 proxyCert=None,  
     820                userCert=None,  
    815821                sessID=None):         
    816822        """Create a new user session or connect to an existing one: 
    817823 
    818824        connect([createServerSess=True/False, ]|[, username=u, passphrase=p]| 
    819                 [, proxyCert=px]|[, sessID=id]) 
     825                [, userCert=px]|[, sessID=id]) 
    820826 
    821827        @type createUserSess: bool 
     
    831837        @param passphrase: pass-phrase - user with username arg 
    832838         
    833         @type proxyCert: string 
    834         @param proxyCert: connect to existing session with proxy certificate 
     839        @type userCert: string 
     840        @param userCert: connect to existing session with proxy certificate 
    835841        corresponding to user.  username/pass-phrase not required 
    836842         
     
    840846         
    841847        @rtype: tuple 
    842         @return proxy certificate, proxy private key, user certificate and  
    843         session ID respectively.  Proxy cert. will be None if 'proxyCert' was  
    844         set as an input.  Session ID will be none if createUserSess keyword is 
    845         set to False 
     848        @return user certificate, private key, issuing certificate and  
     849        session ID respectively.  Session ID will be none if createUserSess  
     850        keyword is set to False 
    846851        """ 
    847852         
     
    849854         
    850855        # Initialise proxy cert to be returned 
    851         proxyCert = None 
     856        userCert = None 
    852857         
    853858        if sessID is not None:             
     
    855860            # return equivalent proxy cert 
    856861            userSess = self.__connect2UserSession(sessID=sessID) 
    857             proxyCert = userSess.credWallet.proxyCertTxt 
    858              
    859         elif proxyCert is not None: 
     862            userCert = userSess.credWallet.userCert 
     863             
     864        elif userCert is not None: 
    860865            # Connect to an existing session identified by a proxy  
    861866            # certificate  
    862             userSess = self.__connect2UserSession(proxyCert=proxyCert) 
     867            userSess = self.__connect2UserSession(userCert=userCert) 
    863868            sessID = userSess.latestSessID 
    864869             
     
    868873                # Get a proxy certificate to represent users ID for the new 
    869874                # session 
    870                 proxyCert, proxyPriKey, userCert = self.__myPx.logon(username, 
    871                                                                    passphrase)     
     875                userCreds = self.__myPx.logon(username, passphrase) 
     876                 
     877                # unpack  
     878                userCert = userCreds[0] 
     879                userPriKey = userCreds[1] 
     880                 
     881                # Issuing cert is needed only if userCert is a proxy 
     882                issuingCert = len(userCreds) > 2 and userCreds[2] or None 
     883                 
    872884            except Exception, e: 
    873885                raise SessionMgrError, "Delegating from MyProxy: %s" % e 
     
    875887            if createServerSess: 
    876888                # Session Manager creates and manages user's session 
    877                 userSess = self.__createUserSession(proxyCert,  
    878                                                     proxyPriKey,  
    879                                                     userCert) 
     889                userSess = self.__createUserSession(userCert,  
     890                                                    userPriKey,  
     891                                                    issuingCert) 
    880892                sessID = userSess.latestSessID 
    881893            else: 
     
    883895                                 
    884896        # Return proxy details and cookie 
    885         return proxyCert, proxyPriKey, userCert, sessID         
     897        return userCert, userPriKey, issuingCert, sessID         
    886898         
    887899        
    888900    #_________________________________________________________________________         
    889     def __createUserSession(self, *proxy): 
     901    def __createUserSession(self, *creds): 
    890902        """Create a new user session from input user credentials        
    891903        and return 
    892904         
    893         @type proxy: tuple 
    894         @param proxy: tuple containing proxy certificate, private key 
    895         and issuing certificate.""" 
     905        @type creds: tuple 
     906        @param creds: tuple containing user certificate, private key 
     907        and optionally an issuing certificate.  An issuing certificate is 
     908        present if user certificate is a proxy and therefore it's issuer is 
     909        other than the CA.""" 
    896910         
    897911        log.debug("Calling SessionMgr.__createUserSession ...") 
     
    899913        # Check for an existing session for the same user 
    900914        try: 
    901             userDN = str(X509CertParse(proxy[0]).dn) 
     915            userDN = str(X509CertParse(creds[0]).dn) 
    902916             
    903917        except Exception, e: 
    904918            raise SessionMgrError, \ 
    905             "Parsing input proxy certificate DN for session create: %s" % \ 
     919                "Parsing input certificate DN for session create: %s" % \ 
    906920                                                                    str(e) 
    907921 
    908922        if userDN in self.__dnDict: 
    909             # Update existing session with proxy cert and add a new  
     923            # Update existing session with user cert and add a new  
    910924            # session ID to access it - a single session can be accessed 
    911925            # via multiple session IDs e.g. a user may wish to access the 
     
    915929            userSess.addNewSessID()             
    916930        else: 
    917             # Create a new user session using the new proxy certificate 
     931            # Create a new user session using the new user certificate 
    918932            # and session ID 
    919933            # 
     
    921935            # encryption for responses from Attribute Authority WS 
    922936            try:    
    923                 userSess=UserSession(caCertFilePath=self.__prop['caCertFile'], 
    924                                      credRepos=self.__credRepos,  
    925                                      *proxy)       
     937                userSess = UserSession(credRepos=self.__credRepos,  
     938                             caCertFilePathList=self.__prop['caCertFileList'], 
     939                             *creds)       
    926940            except Exception, e: 
    927941                raise SessionMgrError, "Creating User Session: %s" % e 
     
    930944            self.__dnDict[userDN] = userSess 
    931945 
    932                              
     946         
    933947        newSessID = userSess.latestSessID 
    934948         
     
    950964        proxy certificate 
    951965 
    952         __connect2UserSession([proxyCert]|[sessID]) 
     966        __connect2UserSession([userCert]|[sessID]) 
    953967         
    954968        @type userCert: string 
     
    974988 
    975989            log.info("Connecting to session user DN = %s using ID = %s" % \ 
    976                      (userSess.credWallet.proxyCert.dn, sessID)) 
     990                     (userSess.credWallet.userCert.dn, sessID)) 
    977991                                
    978992        elif isinstance(userCert, basestring): 
     
    10381052 
    10391053    #_________________________________________________________________________         
    1040     def deleteUserSession(self, sessID=None, proxyCert=None, userSess=None): 
     1054    def deleteUserSession(self, sessID=None, userCert=None, userSess=None): 
    10411055        """Delete an existing session by providing a valid session ID or 
    10421056        proxy certificate - use for user logout 
    10431057 
    1044         deleteUserSession([proxyCert]|[sessID]|[userSess]) 
    1045          
    1046         @type proxyCert: ndg.security.common.X509.X509Cert  
    1047         @param proxyCert: proxy certificate corresponding to an existing  
     1058        deleteUserSession([userCert]|[sessID]|[userSess]) 
     1059         
     1060        @type userCert: ndg.security.common.X509.X509Cert  
     1061        @param userCert: proxy certificate corresponding to an existing  
    10481062        session to connect to. 
    10491063         
     
    10681082 
    10691083            # Get associated user Distinguished Name 
    1070             userDN = str(userSess.credWallet.proxyCert.dn) 
    1071              
    1072         elif proxyCert: 
    1073             try: 
    1074                 userDN = str(proxyCert.dn) 
     1084            userDN = str(userSess.credWallet.userCert.dn) 
     1085             
     1086        elif userCert: 
     1087            try: 
     1088                userDN = str(userCert.dn) 
    10751089                 
    10761090            except Exception, e: 
     
    10871101         
    10881102        if userSess: 
    1089             userDN = str(userSess.credWallet.proxyCert.dn) 
     1103            userDN = str(userSess.credWallet.userCert.dn) 
    10901104        else: 
    10911105            # User session not found with given ID 
    10921106            raise SessionMgrError, \ 
    1093                     '"sessID", "proxyCert" or "userSess" keywords must be set' 
     1107                    '"sessID", "userCert" or "userSess" keywords must be set' 
    10941108  
    10951109        # Delete associated sessions 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/conf/attAuthorityProperties.xml

    r2942 r3133  
    1111    --> 
    1212    <useSSL></useSSL> <!-- leave blank to use http --> 
    13     <sslCertFile>$NDGSEC_DIR/conf/certs/ssl-cert.pem</sslCertFile> 
     13    <<sslCertFileList> 
     14        <sslCertFile>$NDGSEC_DIR/conf/certs/ssl-cert.pem</sslCertFile> 
     15    </sslCertFileList> 
    1416    <sslKeyFile>$NDGSEC_DIR/conf/certs/ssl-key.pem</sslKeyFile> 
    1517    <sslKeyPwd></sslKeyPwd> 
     
    2123    <keyFile>$NDGSEC_DIR/conf/certs/aa-key.pem</keyFile> 
    2224    <keyPwd></keyPwd> 
    23     <caCertFile>$NDGSEC_DIR/conf/certs/cacert.pem</caCertFile> 
     25    <caCertFileList> 
     26        <caCertFile>$NDGSEC_DIR/conf/certs/cacert.pem</caCertFile> 
     27    </caCertFileList> 
    2428    <!--  
    2529    Set the certificate used to verify the signature of messages from the  
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/conf/sessionMgr.tac

    r3044 r3133  
    267267        ctx.set_verify(SSL.verify_client_once, 1) 
    268268 
    269         ctx.load_verify_locations(cafile=os.path.basename(srv.sm['caCertFile']),  
    270                                                   capath=os.path.dirname(srv.sm['caCertFile'])) 
     269        ctx.load_verify_locations(capath=srv.sm['sslCACertDir'])) 
    271270 
    272271        class ContextFactory: 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/conf/sessionMgrProperties.xml

    r3052 r3133  
    88    --> 
    99    <useSSL>Yes</useSSL> 
    10     <!-- X.509 certificate for SSL connections -->  
     10    <!-- X.509 certificate for SSL connections - ignored if useSSL is blank-->  
    1111    <sslCertFile>$NDGSEC_DIR/conf/certs/hostcert.pem</sslCertFile> 
    12     <!-- Private key file for SSL --> 
     12    <!-- Private key file for SSL  - ignored if useSSL is blank --> 
    1313    <sslKeyFile>$NDGSEC_DIR/conf/certs/hostkey.pem</sslKeyFile> 
     14    <!--  
     15    Directory containing CA cert.s to verify SSL peer cert against  
     16     - ignored if useSSL is blank --> 
     17    <sslCACertDir>$NDGSEC_DIR/conf/certs/ca</sslCACertDir> 
    1418    <!-- 
    1519    PKI settings for WS-Security signature of outbound SOAP messages 
     
    2327    <keyPwd></keyPwd> 
    2428    <!--  
    25     X.509 certificates included in inbound messages must validate 
    26     against this CA Certificate  
     29    CA Certificates used to verify X.509 certs used in peer SOAP messages, 
     30    SSL connections and Attribute Certificates 
    2731    --> 
    28     <caCertFile>$NDGSEC_DIR/conf/certs/cacert.pem</caCertFile> 
     32    <caCertFileList> 
     33        <caCertFile>$NDGSEC_DIR/conf/certs/cacert.pem</caCertFile> 
     34    </caCertFileList> 
    2935    <!--  
    3036    Set the certificate used to verify the signature of messages from the  
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/AttAuthority/siteAAttAuthorityProperties.xml

    r2900 r3133  
    44    <portNum>5000</portNum> 
    55    <useSSL></useSSL> <!-- leave blank to use http --> 
    6     <sslCertFile>$NDGSEC_AA_UNITTEST_DIR/aa-cert.pem</sslCertFile> 
     6    <sslCertFileList> 
     7        <sslCertFile>$NDGSEC_AA_UNITTEST_DIR/aa-cert.pem</sslCertFile> 
     8    </sslCertFileList> 
    79    <sslKeyFile>$NDGSEC_AA_UNITTEST_DIR/aa-key.pem</sslKeyFile> 
    810    <sslKeyPwd></sslKeyPwd> 
     
    1113    <keyFile>$NDGSEC_AA_UNITTEST_DIR/aa-key.pem</keyFile> 
    1214    <keyPwd></keyPwd> 
    13     <caCertFile>$NDGSEC_AA_UNITTEST_DIR/cacert.pem</caCertFile> 
     15    <caCertFileList> 
     16        <caCertFile>$NDGSEC_AA_UNITTEST_DIR/cacert.pem</caCertFile> 
     17    </caCertFileList> 
    1418    <!--  
    1519    Set the certificate used to verify the signature of messages from the  
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/AttAuthority/siteBAttAuthorityProperties.xml

    r2900 r3133  
    55    <useSSL></useSSL> <!-- leave blank to use http --> 
    66    <sslCertFile></sslCertFile> 
    7     <sslKeyFile></sslKeyFile> 
     7    <sslCertFileList> 
     8        <sslKeyFile></sslKeyFile> 
     9    <sslCertFileList> 
    810    <sslKeyPwd></sslKeyPwd> 
    911    <useSignatureHandler>Yes</useSignatureHandler> <!-- leave blank for no signature --> 
    1012    <certFile>$NDGSEC_AA_UNITTEST_DIR/aa-cert.pem</certFile> 
    11     <caCertFile>$NDGSEC_AA_UNITTEST_DIR/cacert.pem</caCertFile> 
     13    <caCertFileList> 
     14        <caCertFile>$NDGSEC_AA_UNITTEST_DIR/cacert.pem</caCertFile> 
     15    </caCertFileList> 
    1216    <keyFile>$NDGSEC_AA_UNITTEST_DIR/aa-key.pem</keyFile> 
    1317    <keyPwd></keyPwd> 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/MyProxy/myProxyClientTest.cfg

    r2893 r3133  
    3131 
    3232[test2GetDelegation] 
    33 #username: raphaelTest 
    34 username: Junk 
    35 passphrase: JunkJunk 
     33username: raphaelTest 
     34#username: Junk 
     35#passphrase: JunkJunk 
    3636 
    3737[test3Info] 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/sessionMgr/test.py

    r3044 r3133  
    2828    This class manages server side sessions""" 
    2929     
    30     test2Passphrase = None 
     30    test1Passphrase = None 
    3131    test3Passphrase = None 
    3232 
     
    5353        print "\n\t" + self.test1Connect.__doc__ 
    5454         
    55         if SessionMgrTestCase.test2Passphrase is None: 
    56             SessionMgrTestCase.test2Passphrase = \ 
     55        if SessionMgrTestCase.test1Passphrase is None and \ 
     56           self.cfg.has_option('test1Connect', 'passphrase'): 
     57            SessionMgrTestCase.test1Passphrase = \ 
    5758                                    self.cfg.get('test1Connect', 'passphrase') 
    5859         
    59         if not SessionMgrTestCase.test2Passphrase: 
    60             SessionMgrTestCase.test2Passphrase = getpass.getpass(\ 
     60        if not SessionMgrTestCase.test1Passphrase: 
     61            SessionMgrTestCase.test1Passphrase = getpass.getpass(\ 
    6162                               prompt="\ntest1Connect pass-phrase for user: ") 
    6263 
    6364        proxyCert, self.proxyPriKey, self.userCert, self.sessID = \ 
    6465            self.sm.connect(username=self.cfg.get('test1Connect', 'username'),  
    65                             passphrase=SessionMgrTestCase.test2Passphrase) 
     66                            passphrase=SessionMgrTestCase.test1Passphrase) 
    6667        self.proxyCert = X509CertParse(proxyCert) 
    6768         
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/sessionMgrClient/sessionMgrProperties.xml

    r3044 r3133  
    1010    --> 
    1111    <useSignatureHandler>Yes</useSignatureHandler> <!-- leave blank for no signature --> 
    12     <caCertFile>$NDGSEC_SM_UNITTEST_DIR/cacert.pem</caCertFile> 
     12    <!--  
     13    CA Certificates used to verify X.509 certs used in peer SOAP messages, 
     14    SSL connections and Attribute Certificates 
     15    --> 
     16    <caCertFileList> 
     17        <caCertFile>$NDGSEC_SM_UNITTEST_DIR/cacert.pem</caCertFile> 
     18    </caCertFileList> 
    1319    <certFile>$NDGSEC_SM_UNITTEST_DIR/sm-cert.pem</certFile> 
    1420    <keyFile>$NDGSEC_SM_UNITTEST_DIR/sm-key.pem</keyFile> 
Note: See TracChangeset for help on using the changeset viewer.