Changeset 2145 for TI12-security


Ignore:
Timestamp:
12/02/07 15:27:35 (13 years ago)
Author:
pjkersha
Message:

python/ndg.security.server/ndg/security/server/ca/server-config.tac: added file copied
from Session Manager equivalent

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

  • added ability to generate a certificate request using M2Crypto
  • added properties for running web service over SSL + PKI settings
  • properties file path can be set vai the NDGSEC_CA_PROPFILEPATH environment variable

python/ndg.security.server/ndg/security/server/ca/start-container.sh: script to run
service with twistd.

python/ndg.security.server/ndg/security/server/ca/Makefile: calls to wsdl2dispatch to
generate server side stubs.

python/ndg.security.server/ndg/security/server/SessionMgr/server-config.tac: fixed typo

  • ref to Attribute Authority instead of Session Manager.

python/ndg.security.server/ndg/security/server/MyProxy.py: simplified use of OpenSSLConfig
class.

python/conf/sessionMgrProperties.xml: removed duplicate lines.

python/conf/simpleCAProperties.xml: re-added - for some reason not previously stored in
repository.

python/ndg.security.test/ndg/security/test/ca/server.sh: adapted from Session Manager
version.

python/ndg.security.test/ndg/security/test/ca/caClientTest.cfg: added settings for
issueCert unit test to configure certificate request.

python/ndg.security.test/ndg/security/test/ca/caClientTest.py: setting up
test1IssueCert unit test.

python/ndg.security.test/ndg/security/test/ca/simpleCAProperties.xml: added settings for
SSL and PKI.

python/ndgSetup.sh: set up GRID_SECURITY_DIR environment variable

python/ndg.security.common/ndg/security/common/ca/init.py: Certificate Authority
web service client - updated settings for OpenSSLConfig object and issueCert method.

python/ndg.security.common/ndg/security/common/ca/CertReq.py: old code from alpha version
of NDG-Security.

python/ndg.security.common/ndg/security/common/ca/Makefile: generates client and server
side stubs for Certificate Authority web service.

python/ndg.security.common/ndg/security/common/wsSecurity.py: updated header

python/ndg.security.common/ndg/security/common/openssl.py:

  • fixed regular expression for 'req_distinguished_name' pattern match
  • parameters are parsed in call to read() rather than in getReqDN method.
  • reqDN is now a property.
Location:
TI12-security/trunk/python
Files:
6 added
2 deleted
11 edited

Legend:

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

    r2136 r2145  
    99    <keyFile></keyFile> 
    1010    <keyPwd></keyPwd> 
    11     <useSSL>Yes</useSSL> <!-- leave blank to use http --> 
    12     <sslCertFile></sslCertFile> 
    13     <sslKeyFile></sslKeyFile> 
    14     <portNum></portNum> 
    1511    <!--  
    1612    Set the certificate used to verify the signature of messages from the  
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/ca/__init__.py

    r2136 r2145  
    2121# Handling for public key retrieval 
    2222import tempfile 
    23 from M2Crypto import X509, RSA, EVP 
     23from M2Crypto import X509, RSA, EVP, m2 
    2424 
    2525from CertificateAuthority_services import CertificateAuthorityServiceLocator 
     
    4444     
    4545    #_________________________________________________________________________ 
    46     def __init__(self, uri=None, tracefile=None, **signatureHandlerKw): 
     46    def __init__(self,  
     47                 uri=None,  
     48                 tracefile=None, 
     49                 openSSLConfigFilePath=None,  
     50                 **signatureHandlerKw): 
    4751        """ 
    4852        @type uri: string 
     
    6165 
    6266        # Set-up parameter names for certificate request 
    63         self.__certReqDNparam = {} 
     67        self.__openSSLConfig = OpenSSLConfig(filePath=openSSLConfigFilePath) 
    6468 
    6569         
     
    9195 
    9296    #_________________________________________________________________________ 
     97    def __getOpenSSLConfig(self): 
     98        "Get OpenSSLConfig object property method" 
     99        return self.__openSSLConfig 
     100     
     101    openSSLConfig = property(fget=__getOpenSSLConfig, 
     102                             doc="OpenSSLConfig object") 
     103 
     104 
     105    #_________________________________________________________________________ 
    93106    def __getSignatureHandler(self): 
    94107        "Get SignatureHandler object property method" 
     
    162175    clntPriKeyPwd = property(fset=__setClntPriKeyPwd, 
    163176                         doc="Password protecting client private key file") 
    164  
    165  
    166     #_________________________________________________________________________         
    167     def __setCertReqDNparam(self, dict): 
    168         '''certReqDNparam property set method - forces setting of certificate  
    169         request parameter names to valid values 
    170          
    171         @param dict: dictionary of parameters''' 
    172          
    173         invalidKw = [k for k in dict \ 
    174                      if k not in self.__class__._certReqDNparamName] 
    175         if invalidKw: 
    176             raise CertificateAuthorityClientError, \ 
    177     "Invalid certificate request keyword(s): %s.  Valid keywords are: %s" % \ 
    178     (', '.join(invalidKw), ', '.join(self.__class__._certReqDNparamName)) 
    179      
    180         self.__certReqDNparam.update(dict) 
    181  
    182  
    183     #_________________________________________________________________________         
    184     def __getCertReqDNparam(self): 
    185         """certReqDNparam property set method - for Certificate request  
    186         parameters dict""" 
    187         return self.__certReqDNparam 
    188      
    189      
    190     certReqDNparam = property(fset=__setCertReqDNparam, 
    191                             fget=__getCertReqDNparam, 
    192                             doc="Dictionary of parameters for cert. request") 
    193177 
    194178         
     
    248232        req.set_pubkey(pubKey) 
    249233         
    250         if self.__certReqDNparam: 
    251             certReqDNparam = self.__certReqDNparam 
    252         else: 
    253             defaultReqDN = self.__openSSLConf.getReqDN() 
    254              
    255             certReqDNparam = {} 
    256             certReqDNparam['O'] = defaultReqDN['0.organizationName'] 
    257             certReqDNparam['OU'] = defaultReqDN['0.organizationalUnitName'] 
     234        defaultReqDN = self.__openSSLConfig.reqDN         
    258235             
    259236        # Set DN 
    260237        x509Name = X509.X509_Name() 
    261238        x509Name.CN = CN 
    262         x509Name.OU = certReqDNparam['OU'] 
    263         x509Name.O = certReqDNparam['O'] 
     239        x509Name.OU = defaultReqDN.get('0.organizationalUnitName') or \ 
     240                        defaultReqDN['0U'] 
     241        x509Name.O = defaultReqDN.get('0.organizationName') or \ 
     242                        defaultReqDN['0'] 
     243                         
    264244        req.set_subject_name(x509Name) 
    265245         
    266246        req.sign(pubKey, messageDigest) 
    267247         
    268         return (req.as_pem(), key.as_pem(cipher=None)) 
     248        return req, key 
    269249     
    270250                                     
    271251    #_________________________________________________________________________ 
    272     def signCert(self,  
    273                  certReq=None,  
    274                  CN=None,  
    275                  opensslConfigFilePath=None, 
    276                  **createCertReqKw): 
     252    def issueCert(self,  
     253                  certReq=None,  
     254                  CN=None,  
     255                  openSSLConfigFilePath=None, 
     256                  **createCertReqKw): 
    277257        """Send a certificate request to the CA for signing 
    278258         
    279         signCert([certReq=cr]|[CN=cn, opensslConfigFilePath=p, **kw]) 
     259        signCert([certReq=cr]|[CN=cn, openSSLConfigFilePath=p, **kw]) 
    280260         
    281261        @type certReq: M2Crypto.X509.Request 
     
    288268        cert.  This keyword is ignored if certReq keyword is set. 
    289269         
    290         @type opensslConfigFilePath: string 
    291         @keyword opensslConfigFilePath: file path for OpenSSL configuration 
     270        @type openSSLConfigFilePath: string 
     271        @keyword openSSLConfigFilePath: file path for OpenSSL configuration 
    292272        file from which to get settings for Distinguished Name for new  
    293273        certificate.  This keyword is ignored if certReq keyword is set. 
     274         
     275        @type **createCertReqKw: dict 
     276        @param **createCertReqKw: keywords to call to _createCertReq - only 
     277        applies if certReq is not set. 
     278         
    294279        @rtype: tuple 
    295280        @return: signed certificate and private key.  Private key will be  
     
    303288         
    304289        try:    
    305             cert = self.__srv.signCert(certReq.as_pem()) 
     290            cert = self.__srv.issueCert(certReq.as_pem()) 
    306291 
    307292        except Exception, e: 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/openssl.py

    r2140 r2145  
    2626     
    2727    @cvar __reqDnRE: regular expression pattern for locating required 
    28     distinguished name from the config file""" 
     28    distinguished name from the config file 
    2929     
    30     __reqDnRE = '\[ req_distinguished_name \].*\[' 
     30    @cvar _certReqDNParamName: permissable keys for Distinguished Name 
     31    (not including CN which gets set separately).  This is used in __setReqDN 
     32    to check input""" 
     33     
     34    __reqDnRE = '\[\s*req_distinguished_name\s*\].*\[' 
     35    
     36    _certReqDNParamName = ('O', 'OU', '0.organizationName', 
     37                            '0.organizationalUnitName') 
     38 
    3139     
    3240    def __init__(self, filePath=None): 
     
    3846        # Content of file 
    3947        self.__fileTxt = None 
     48        self.__reqDN = None 
    4049        self.__setFilePath(filePath) 
    4150 
     
    4958                    "Input OpenSSL config file path must be a string" 
    5059 
    51             self.__filePath = filePath 
    52                      
    5360            try: 
    54                 if not os.access(self.__filePath, os.R_OK): 
     61                if not os.access(filePath, os.R_OK): 
    5562                    raise OpenSSLConfigError, "not found or no read access" 
    5663                                          
     
    5865                raise OpenSSLConfigError, \ 
    5966                    "OpenSSL config file path is not valid: \"%s\": %s" % \ 
    60                     (self.__filePath, str(e)) 
     67                    (filePath, str(e)) 
     68                     
     69        self.__filePath = filePath 
     70                     
    6171 
    6272 
     
    7282    def __getFileTxt(self): 
    7383        """Get content of file in call to getReqDN 
    74         @return string content of file""" 
     84        @rtype: string 
     85        @return: content of file""" 
    7586        return self.__fileTxt 
    7687     
    7788    def __setFileTxt(self, input): 
    7889        """Set content of file 
    79         @param input: string content of  file. - Set to None to re-read  
    80         file content in call to getReqDN""" 
     90        @type input: string 
     91        @param input: content of  file.""" 
    8192        if input is not None and not isinstance(input, basestring): 
    8293            raise AttributeError, "File text must be string or None type" 
     
    8899                       fget=__getFileTxt, 
    89100                       doc="Content of SSL file") 
    90      
    91     def _read(self): 
    92         """Read OpenSSL configuration file and return as string 
    93          
    94         @return fileTxt: content of the file""" 
    95  
    96         self.__fileTxt = self.__fileTxt or open(self.__filePath).read() 
    97         return self.__fileTxt 
    98101 
    99102 
    100     def getReqDN(self): 
    101         """Read Required DN parameters from the configuration file returning 
     103    def __getReqDN(self): 
     104        """Get property method 
     105        @rtype reqDN: dict 
     106        @return reqDN: Distinguished Name for certificate request""" 
     107        return self.__reqDN 
     108 
     109    def __setReqDN(self, reqDN): 
     110        """Set property method 
     111        @type reqDN: dict 
     112        @param reqDN: Distinguished Name for certificate request""" 
     113        if not isinstance(reqDN, dict): 
     114            raise AttributeError, "Distinguished Name must be dict type" 
     115         
     116        invalidKw = [k for k in dict \ 
     117                     if k not in self.__class__._certReqDNParamName] 
     118        if invalidKw: 
     119            raise AttributeError, \ 
     120    "Invalid certificate request keyword(s): %s.  Valid keywords are: %s" % \ 
     121    (', '.join(invalidKw), ', '.join(self.__class__._certReqDNParamName)) 
     122 
     123        self.__reqDN = reqDN 
     124 
     125 
     126    reqDN = property(fget=__getReqDN, 
     127                     fset=__setReqDN, 
     128                     doc="Distinguished Name for certificate request") 
     129     
     130        
     131    def read(self): 
     132        """Read OpenSSL configuration file and parse certificate request 
     133        Distinguished Name settings""" 
     134 
     135        try: 
     136            self.__fileTxt = open(self.__filePath).read() 
     137        except Exception, e: 
     138            raise OpenSSLConfigError, \ 
     139                "Error reading OpenSSL config file \"%s\: %s" % \ 
     140                                                    (self.__filePath, str(e)) 
     141        self._parseReqDN() 
     142 
     143 
     144    def _parseReqDN(self): 
     145        """Parse Required DN parameters from the configuration file returning 
    102146        them in a dictionary 
    103147         
     
    106150        # Nb. Match over line boundaries 
    107151        try: 
    108             reqDnTxt = re.findall(self.__reqDnRE, self._read(), re.S)[0] 
     152            reqDnTxt = re.findall(self.__reqDnRE, self.__fileTxt, re.S)[0] 
    109153 
    110154            # Separate lines 
     
    114158            # 
    115159            # Make sure comment lies are omitted - P J Kershaw 22/07/05 
    116             return dict([re.split('_default\s*=\s*', line) \ 
    117                          for line in reqDnLines \ 
    118                          if re.match('[^#].*_default\s*=', line)])  
     160            self.__reqDN = dict([re.split('_default\s*=\s*', line) \ 
     161                                 for line in reqDnLines \ 
     162                                 if re.match('[^#].*_default\s*=', line)])  
    119163        except Exception, e: 
    120164            raise OpenSSLConfigError, \ 
    121                 "Error reading content of OpenSSL config file \"%s\: %s" % \ 
     165                "Error parsing content of OpenSSL config file \"%s\: %s" % \ 
    122166                                                    (self.__filePath, str(e)) 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/wsSecurity.py

    r2136 r2145  
    55NERC Data Grid Project 
    66 
    7 P J Kershaw 01/09/06 
    8  
    9 Copyright (C) 2006 CCLRC & NERC 
    10  
    11 This software may be distributed under the terms of the Q Public License, 
    12 version 1.0 or later. 
     7@author P J Kershaw 01/09/06 
     8 
     9@copyright (C) 2006 CCLRC & NERC 
     10 
     11@license This software may be distributed under the terms of the Q Public  
     12License, version 1.0 or later. 
    1313""" 
    1414 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/MyProxy.py

    r2136 r2145  
    150150    _hostKeySubDirPath = ('etc', 'hostkey.pem') 
    151151     
    152     _certReqDNparamName = ('O', 'OU') 
    153  
    154152    # valid configuration property keywords 
    155153    __validKeys = ('hostname', 
     
    178176 
    179177        # Set-up parameter names for certificate request 
    180         self.__certReqDNparam = {} 
     178        self.__certReqDNParam = {} 
    181179         
    182180        # Check for parameter names set from input 
     
    221219                            os.path.join(self.__prop['gridSecurityDir'], 
    222220                                         self.__prop['openSSLConfFileName']) 
     221            self.__openSSLConf.read() 
     222 
    223223 
    224224    #_________________________________________________________________________ 
     
    239239                            os.path.join(self.__prop['gridSecurityDir'], 
    240240                                         self.__prop['openSSLConfFileName']) 
     241            self.__openSSLConf.read() 
    241242             
    242243 
     
    247248        propFilePath|propertiesElem 
    248249 
    249         @param propFilePath: set to read from the specified file 
    250         @param propertiesElem: set to read beginning from a cElementTree node 
    251         @return None 
     250        @type propFilePath: string 
     251        @keyword propFilePath: set to read from the specified file 
     252         
     253        @type propElem: ElementTree node 
     254        @keyword propElem: set to read beginning from a cElementTree node 
    252255        """ 
    253256 
     
    291294 
    292295 
    293     #_________________________________________________________________________         
    294     def __setCertReqDNparam(self, dict): 
    295         '''certReqDNparam property set method - forces setting of certificate  
    296         request parameter names to valid values 
    297          
    298         @param dict: dictionary of parameters''' 
    299          
    300         invalidKw = [k for k in dict \ 
    301                      if k not in MyProxyClient._certReqDNparamName] 
    302         if invalidKw: 
    303             raise MyProxyClientError, \ 
    304     "Invalid certificate request keyword(s): %s.  Valid keywords are: %s" % \ 
    305     (', '.join(invalidKw), ', '.join(MyProxyClient._certReqDNparamName)) 
    306      
    307         self.__certReqDNparam.update(dict) 
    308  
    309     #_________________________________________________________________________         
    310     def __getCertReqDNparam(self): 
    311         """certReqDNparam property set method - for Certificate request  
    312         parameters dict""" 
    313         return self.__certReqDNparam 
    314      
    315      
    316     certReqDNparam = property(fset=__setCertReqDNparam, 
    317                             fget=__getCertReqDNparam, 
    318                             doc="Dictionary of parameters for cert. request") 
     296    #_________________________________________________________________________ 
     297    def __getOpenSSLConfig(self): 
     298        "Get OpenSSLConfig object property method" 
     299        return self.__openSSLConfig 
     300     
     301    openSSLConfig = property(fget=__getOpenSSLConfig, 
     302                             doc="OpenSSLConfig object") 
     303 
    319304             
    320305    #_________________________________________________________________________         
     
    397382        req.set_pubkey(pubKey) 
    398383         
    399         if self.__certReqDNparam: 
    400             certReqDNparam = self.__certReqDNparam 
     384        if self.__certReqDNParam: 
     385            certReqDNparam = self.__certReqDNParam 
    401386        else: 
    402             defaultReqDN = self.__openSSLConf.getReqDN() 
     387            defaultReqDN = self.__openSSLConf.reqDN 
    403388             
    404389            certReqDNparam = {} 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/SessionMgr/server-config.tac

    r2136 r2145  
    102102srv = SessionMgrServiceSub() 
    103103 
    104 # Initialise WS-Security signature handler passing Attribute Authority 
     104# Initialise WS-Security signature handler passing Session Manager 
    105105# public and private keys 
    106106WSSecurityHandler.signatureHandler = SignatureHandler(\ 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/ca/SimpleCA.py

    r1699 r2145  
    3030from glob import glob 
    3131 
     32# Certificate request generation 
     33from M2Crypto import X509, RSA, EVP, m2 
     34 
    3235# For parsing of properties file 
    3336import cElementTree as ElementTree 
    3437 
    35  
     38from ndg.security.common.openssl import OpenSSLConfig 
    3639 
    3740 
    3841#_____________________________________________________________________________ 
    3942class SimpleCAError(Exception): 
    40      
    4143    """Exception handling for NDG SimpleCA class.""" 
    42      
    43     def __init__(self, msg): 
    44         self.__msg = msg 
    45           
    46     def __str__(self): 
    47         return self.__msg 
    4844 
    4945 
     
    5147class SimpleCAPassPhraseError(SimpleCAError): 
    5248    """Specific exception for CA pass-phrase check""" 
    53     pass 
    5449 
    5550 
    5651#_____________________________________________________________________________ 
    5752class SimpleCA(dict): 
    58     """Wrapper to Globus SimpleCA - administer NDG user X.509 Certificates""" 
    59  
    60     # valid configuration property keywords 
    61     __validKeys = [ 'certLifetimeDays', 
     53    """Wrapper to Globus SimpleCA - administer NDG user X.509 Certificates 
     54     
     55    @type __validKeys: tuple 
     56    @cvar __validKeys: valid configuration property keywords used in file 
     57    and keyword input to __init__ and setProperties() 
     58     
     59    @type __gridCASubDir: string 
     60    @cvar __gridCASubDir: sub-directory of globus user for CA settings 
     61     
     62    @type __gridCAConfigFile: string 
     63    @cvar __gridCAConfigFile: name of file containing SSL configuration  
     64    settings for CA 
     65         
     66    @type __confDir: string 
     67    @cvar __confDir: configuration directory under $NDG_DIR - default location 
     68    for properties file  
     69     
     70    @type __propFileName: string 
     71    @cvar __propFileName: default file name for properties file under  
     72    __confDir""" 
     73 
     74    __validKeys = ( 'portNum', 
     75                    'useSSL', 
     76                    'sslCertFile', 
     77                    'sslKeyFile', 
     78                    'caCertFile', 
     79                    'certFile', 
     80                    'keyFile', 
     81                    'keyPwd', 
     82                    'clntCertFile', 
     83                    'openSSLConfigFilePath', 
     84                    'certLifetimeDays', 
    6285                    'certExpiryDate', 
    6386                    'certTmpDir', 
     
    6588                    'chkCAPassPhraseExe', 
    6689                    'signExe', 
    67                     'path'  ] 
     90                    'path'  ) 
    6891     
    6992    __gridCASubDir = ".globus/simpleCA" 
    7093    __gridCAConfigFile = "grid-ca-ssl.conf" 
    7194 
     95    __confDir = "conf" 
     96    __propFileName = "simpleCAProperties.xml" 
     97 
    7298 
    7399    def __init__(self, 
    74100                 propFilePath=None, 
    75                  configFilePath=None, 
    76                  caPassPhrase=None, 
     101                 passphraseFilePath=None, 
     102                 caPassphrase=None, 
    77103                 **prop): 
    78104        """Initialise environment for calling SimpleCA executables 
    79105 
    80         propFilePath:                   XML file containing SimpleCA 
    81                                         settings. 
     106        SimpleCA([propFilePath=p, ][passphraseFilePath=pp|caPassphrase=cp, ] 
     107                [ ... ]) 
     108          
     109        @type propFilePath: string        
     110        @keyword propFilePath: XML file containing SimpleCA settings. 
     111            
     112        @type caPassphrase: string 
     113        @keyword caPassphrase: pass-phrase for SimpleCA's private key. 
     114         
     115        @type passphraseFilePath: string 
     116        @keyword passphraseFilePath: alternative to caPassphrase, Set  
     117        pass-phrase from a file. 
    82118                                         
    83         configFilePath|caPassPhrase:    pass phrase for SimpleCA's certificate. 
    84                                         Set via file or direct string input 
    85                                         respectively. 
    86                                          
    87         **prop:                         optional keywords for SimpleCA 
    88                                         settings.  These correspond exactly to 
    89                                         the tags in properties file.  If the 
    90                                         later is set, its settings will 
    91                                         override those set by keyword""" 
     119        **prop: optional keywords for SimpleCA settings.  These correspond  
     120        exactly to the tags in properties file (SimpleCA.__validKeys).  If  
     121        propFilePath is set, its settings will override those set by these  
     122        keywords""" 
    92123 
    93124 
     
    105136        # os.environ - if self.__env is changed, so is os.environ 
    106137        self.__env = os.environ.copy() 
     138         
     139        # Set-up parameter names for certificate request 
     140        self.__openSSLConfig = OpenSSLConfig() 
     141 
    107142 
    108143        self.setProperties(**prop) 
     
    114149            self.readProperties(propFilePath) 
    115150 
    116          
     151        if self.__prop.get('openSSLConfigFilePath'): 
     152            self.__openSSLConfig.read() 
     153             
    117154        if not 'GLOBUS_LOCATION' in os.environ or \ 
    118155           not os.environ['GLOBUS_LOCATION']: 
     
    133170        # property settings made by readProperties and setProperties need to 
    134171        # be in place first 
    135         if configFilePath is not None: 
     172        if passphraseFilePath is not None: 
    136173            try: 
    137                 caPassPhrase = open(configFilePath).read().strip() 
     174                caPassphrase = open(passphraseFilePath).read().strip() 
    138175            except Exception, e: 
    139176                raise SimpleCAError, "Reading configuration file: %s" % e 
    140177             
    141         if caPassPhrase is not None: 
    142             self.__setCAPassPhrase(caPassPhrase) 
     178        if caPassphrase is not None: 
     179            self.__setCAPassPhrase(caPassphrase) 
    143180 
    144181 
     
    192229 
    193230 
    194     def __setCAPassPhrase(self, caPassPhrase): 
     231    def __setCAPassPhrase(self, caPassphrase): 
    195232        """Give this instance the pass-phrase for the SimpleCA""" 
    196         self.chkCAPassPhrase(caPassPhrase)         
    197         self.__caPassPhrase = caPassPhrase 
     233        self.chkCAPassPhrase(caPassphrase)         
     234        self.__caPassphrase = caPassphrase 
    198235            
    199     caPassPhrase = property(fset=__setCAPassPhrase, 
     236    caPassphrase = property(fset=__setCAPassPhrase, 
    200237                            doc="Enter pass-phrase for Simple CA") 
     238 
     239 
     240    #_________________________________________________________________________ 
     241    def __getOpenSSLConfig(self): 
     242        "Get OpenSSLConfig object property method" 
     243        return self.__openSSLConfig 
     244     
     245    openSSLConfig = property(fget=__getOpenSSLConfig, 
     246                             doc="OpenSSLConfig object") 
     247 
     248 
     249    #_________________________________________________________________________ 
     250    def setPropFilePath(self, val=None): 
     251        """Set properties file from input or based on environment variable 
     252        settings""" 
     253        if not val: 
     254            if 'NDGSEC_CA_PROPFILEPATH' in os.environ: 
     255                val = os.environ['NDGSEC_CA_PROPFILEPATH'] 
     256                 
     257            elif 'NDG_DIR' in os.environ: 
     258                val = os.path.join(os.environ['NDG_DIR'],  
     259                                   self.__class__.__confDir, 
     260                                   self.__class__.__propFileName) 
     261            else: 
     262                raise AttributeError, 'Unable to set default Session ' + \ 
     263                    'Manager properties file path: neither ' + \ 
     264                    '"NDGSEC_CA_PROPFILEPATH" or "NDG_DIR" environment ' + \ 
     265                    'variables are set' 
     266                 
     267        if not isinstance(val, basestring): 
     268            raise AttributeError, "Input Properties file path " + \ 
     269                                  "must be a valid string." 
     270       
     271        self.__propFilePath = val 
     272         
     273    # Also set up as a property 
     274    propFilePath = property(fset=setPropFilePath, 
     275                            doc="Set the path to the properties file")    
    201276                             
    202277                             
     
    229304                raise SimpleCAError, "certExpiryDate has the format " + \ 
    230305                                    "YYYY mm dd HH MM SS. Year, month, " + \ 
    231                                     "day, hour minute, second respectively."            
    232  
    233  
     306                                    "day, hour minute, second respectively."  
     307      
    234308    #_________________________________________________________________________    
    235     def readProperties(self, propFilePath=None, propElem=None): 
    236  
    237         """Read the configuration properties for the Attribute Authority 
    238          
    239         propFilePath|propertiesElem 
    240  
    241         propFilePath: set to read from the specified file 
    242         propertiesElem:     set to read beginning from a cElementTree node"""       
     309    @staticmethod                                
     310    def __filtTxt(txt):           
     311        if isinstance(txt, basestring): 
     312            if txt.isdigit(): 
     313                return int(txt) 
     314            else: 
     315                return os.path.expandvars(txt) 
     316        else: 
     317            return txt 
     318 
     319 
     320    #_________________________________________________________________________    
     321    def readProperties(self, propElem=None): 
     322        """Read the configuration properties for the Certificate Authority 
     323         
     324        readProperties([propElem=p]) 
     325 
     326        @type propElem: ElementTree node 
     327        @keyword propElem: set to read beginning from a ElementTree node"""       
    243328 
    244329        if propFilePath is not None: 
    245  
    246330            try: 
    247331                tree = ElementTree.parse(propFilePath) 
     
    262346 
    263347        # Read properties into a dictionary 
    264         prop = dict([(elem.tag, elem.text) for elem in propElem]) 
     348        prop=dict([(elem.tag,self.__filtTxt(elem.text)) for elem in propElem]) 
    265349 
    266350        # Ensure Certificate Lifetime is converted into a numeric type 
     
    272356        # Check for missing properties 
    273357        propKeys = prop.keys() 
    274         missingKeys = [key for key in SimpleCA.__validKeys \ 
     358        missingKeys = [key for key in self.__class__.__validKeys \ 
    275359                       if key not in propKeys] 
    276360        if missingKeys != [] and \ 
     
    285369 
    286370    #_________________________________________________________________________ 
    287     def chkCAPassPhrase(self, caPassPhrase=None): 
     371    def chkCAPassPhrase(self, caPassphrase=None): 
    288372        """Check given pass-phrase is correct for CA private key 
    289373         
     
    294378         
    295379         
    296         if caPassPhrase is None: 
    297             caPassPhrase = self.__caPassPhrase 
     380        if caPassphrase is None: 
     381            caPassphrase = self.__caPassphrase 
    298382        else: 
    299             if not isinstance(caPassPhrase, basestring): 
     383            if not isinstance(caPassphrase, basestring): 
    300384                raise SimpleCAError, "CA Pass-phrase must be a valid string" 
    301385         
     
    315399                # open pipe to pass to stdin 
    316400                chkCAPassPhraseR, chkCAPassPhraseW = os.pipe() 
    317                 os.write(chkCAPassPhraseW, caPassPhrase) 
     401                os.write(chkCAPassPhraseW, caPassphrase) 
    318402                 
    319403                chkCAPassPhraseProc = Popen(chkCAPassPhraseCmd, 
     
    348432        if errMsg is not None: 
    349433            raise SimpleCAPassPhraseError, errMsg 
     434                  
     435                  
     436    #_________________________________________________________________________         
     437    def _createCertReq(self, CN, nBitsForKey=1024, messageDigest="md5"): 
     438        """ 
     439        Create a certificate request. 
     440         
     441        @param CN: Common Name for certificate - effectively the same as the 
     442        username for the MyProxy credential 
     443        @param nBitsForKey: number of bits for private key generation -  
     444        default is 1024 
     445        @param messageDigest: message disgest type - default is MD5 
     446        @return tuple of certificate request PEM text and private key PEM text 
     447        """ 
     448         
     449        # Check all required certifcate request DN parameters are set                 
     450        # Create certificate request 
     451        req = X509.Request() 
     452     
     453        # Generate keys 
     454        key = RSA.gen_key(nBitsForKey, m2.RSA_F4) 
     455     
     456        # Create public key object 
     457        pubKey = EVP.PKey() 
     458        pubKey.assign_rsa(key) 
     459         
     460        # Add the public key to the request 
     461        req.set_version(0) 
     462        req.set_pubkey(pubKey) 
     463         
     464        defaultReqDN = self.__openSSLConfig.reqDN         
     465             
     466        # Set DN 
     467        x509Name = X509.X509_Name() 
     468        x509Name.CN = CN 
     469        x509Name.OU = defaultReqDN.get('0.organizationalUnitName') or \ 
     470                        defaultReqDN['0U'] 
     471        x509Name.O = defaultReqDN.get('0.organizationName') or \ 
     472                        defaultReqDN['0'] 
     473                         
     474        req.set_subject_name(x509Name) 
     475         
     476        req.sign(pubKey, messageDigest) 
     477         
     478        return req, key 
    350479 
    351480 
    352481    #_________________________________________________________________________ 
    353482    def sign(self, 
     483             passphraseFilePath=None, 
     484             caPassphrase=None, 
    354485             certReq=None, 
    355486             certReqFilePath=None, 
    356              configFilePath=None, 
    357              caPassPhrase=None, 
    358              **prop): 
     487             CN=None, 
     488             **createCertReqKw): 
    359489         
    360490        """Sign a certificate request 
    361491 
    362         certReq|certReqFilePath:        pass certReq - the string text of the 
    363                                         certificate request or else the path 
    364                                         to a file containing the certificate 
    365                                         request 
    366         configFilePath|caPassPhrase:    pass phrase for SimpleCA's  
    367                                         certificate. 
    368                                         Set via file or direct string input 
    369                                         respectively.  Set here to override 
    370                                         setting [if any] made at object 
    371                                         creation. 
    372         **prop:                         keywords corresponding to properties 
    373                                         file parameters.  Set these to 
    374                                         override previous settings 
     492        @type caPassphrase: string 
     493        @keyword caPassphrase: pass-phrase for SimpleCA's private key. 
     494         
     495        @type passphraseFilePath: string 
     496        @keyword passphraseFilePath: alternative to caPassphrase, Set  
     497        pass-phrase from a file. 
     498        
     499        @type CN: string 
     500        @keyword CN: common name component of Distinguished Name for new 
     501        cert.  This keyword is ignored if certReq keyword is set. 
     502 
     503        @type certReq: M2Crypto.X509.Request 
     504        @keyword certReq: certificate request 
     505         
     506        @type **createCertReqKw: dict 
     507        @param **createCertReqKw: keywords to call to _createCertReq - only 
     508        applies if certReq is not set. 
     509         
     510        @rtype: tuple 
     511        @return: signed certificate and private key.  Private key will be  
     512        None if certReq keyword was passed in 
    375513        """ 
    376  
     514         
    377515        # Set pass phrase via from file         
    378         if configFilePath is not None: 
     516        if passphraseFilePath is not None: 
    379517            try: 
    380                 caPassPhrase = open(configFilePath).read().strip() 
     518                caPassphrase = open(passphraseFilePath).read().strip() 
    381519            except Exception, e: 
    382                 raise SimpleCAError, "Reading configuration file: " + str(e) 
     520                raise SimpleCAError, "Reading pass-phrase file: " + str(e) 
    383521 
    384522        # ... or from string input 
    385         if caPassPhrase is not None: 
    386             self.__setCAPassPhrase(caPassPhrase) 
     523        if caPassphrase is not None: 
     524            self.__setCAPassPhrase(caPassphrase) 
    387525             
    388         if self.__caPassPhrase is None: 
     526        if self.__caPassphrase is None: 
    389527            raise SimpleCAError, "CA Pass-phrase must be set in order to " + \ 
    390528                                "sign a certificate request" 
    391529 
    392          
     530 
     531        priKey = None 
     532                 
    393533        if certReq is not None: 
    394             if not isinstance(certReq, basestring): 
     534            if isinstance(certReq, X509.Request): 
     535                certReq = certReq.as_pem() 
     536                 
     537            elif not isinstance(certReq, basestring): 
    395538                raise SimpleCAError, "certReq input must be a valid string" 
    396539 
    397             # Certificate request has been passed in a string - write it to 
    398             # a temporary file for input into the grid-ca-sign executable 
     540        elif certReqFilePath is not None: 
     541 
     542            # Certificate request has been input as a file - check it 
     543            if not isinstance(certReqFilePath, basestring): 
     544                raise SimpleCAError, \ 
     545                    "certReqFilePath input must be a valid string"            
     546        elif CN is not None: 
     547             
     548            certReq, priKey = self._createCertReq(CN, **createCertReqKw) 
     549            certReq = certReq.as_pem() 
     550        else: 
     551            # The certificate request must be input via either of the  
     552            # options above 
     553            raise SimpleCAError, "No input Certificate Request provided" 
     554 
     555 
     556        if certReqFilePath is None: 
     557            # Certificate request has been passed in as a string or  
     558            # X509.Request object - write it to a temporary file for input  
     559            # into the grid-ca-sign executable 
    399560            certReqFile = tempfile.NamedTemporaryFile('w', -1, '.pem', 
    400561                                                    'certReq-', 
     
    403564            open(certReqFile.name, 'w').write(certReq) 
    404565            certReqFilePath = certReqFile.name 
    405  
    406         elif certReqFilePath is not None: 
    407  
    408             # Certificate request has been input as a file - check it 
    409             if not isinstance(certReqFilePath, basestring): 
    410                 raise SimpleCAError, \ 
    411                     "certReqFilePath input must be a valid string"            
    412         else: 
    413             # The certificate request msut be input via either of the two 
    414             # options above 
    415             raise SimpleCAError, "No input Certificate Request provided" 
    416  
    417          
     566        
     567        
    418568        # If no expiry date was set, use life time in days parameter 
    419569        if self.__dtCertExpiry is None: 
     
    428578                                               self.__prop['certTmpDir']) 
    429579 
    430         gridCaSignCmd = [ 
     580        gridCASignCmd = [ 
    431581            self.__prop['signExe'], 
    432582            '-in',  certReqFilePath, 
     
    443593            try: 
    444594                # open pipe to pass to stdin 
    445                 gridCaSignR, gridCaSignW = os.pipe() 
    446                 os.write(gridCaSignW, self.__caPassPhrase) 
    447                  
    448                 gridCaSignProc = Popen(gridCaSignCmd, 
    449                                        stdin=gridCaSignR, 
     595                gridCASignR, gridCASignW = os.pipe() 
     596                os.write(gridCASignW, self.__caPassphrase) 
     597                 
     598                gridCaSignProc = Popen(gridCASignCmd, 
     599                                       stdin=gridCASignR, 
    450600                                       stdout=PIPE, 
    451601                                       stderr=STDOUT, 
     
    453603            finally: 
    454604                try: 
    455                     os.close(gridCaSignR) 
    456                     os.close(gridCaSignW) 
     605                    os.close(gridCASignR) 
     606                    os.close(gridCASignW) 
    457607                except: pass 
    458608 
     
    476626        try: 
    477627            # Return the certificate file content 
    478             return open(certFile.name).read() 
     628            return open(certFile.name).read(), priKey 
    479629 
    480630        except Exception, e: 
    481631            raise SimpleCAError, \ 
    482632            "Reading output certificate file \"%s\": %s" % (certFile.name, e) 
     633 
     634 
     635    #_________________________________________________________________________ 
     636    def revokeCert(self): 
     637        """Revoke an existing certificate""" 
     638      
     639      
     640    #_________________________________________________________________________    
     641    def genCRL(self): 
     642        """Generate a Certificate Revocation List""" 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/ca/caClientTest.cfg

    r2139 r2145  
    11# NERC Data Grid Project 
    22# 
    3 # P J Kershaw 12/01/07 
     3# P J Kershaw 09/02/07 
    44# 
    55# Copyright (C) 2007 CCLRC & NERC 
     
    1010# $Id:$ 
    1111[setUp] 
    12 smuri = https://localhost:5700/SessionManager 
     12uri = https://localhost:5800/CertificateAuthority 
    1313 
    14  
    15 # X.509 certificate for Attribute Authority - if commented out, Session  
    16 # Manager will call AA getX509Cert WS method to retrieve it 
    17 #aacertfilepath =  
     14# May be omitted to use OU and O instead 
     15openSSLConfigFilePath = $GRID_SECURITY_DIR/globus-user-ssl.conf 
     16#O=NDG 
     17#OU=An NDG Partner 
    1818 
    1919# X.509 certificate for session manager.  If not set, it will be retrieved  
    2020# using the getX509Cert WS method 
    21 srvcertfilepath = ./sm-cert.pem 
     21#srvcertfilepath = 
    2222 
    2323# Password protecting client private key - if omitted it will be prompted for 
     
    2828clntprikeyfilepath = ./clnt-key.pem 
    2929 
    30 [test1AddUser] 
    31 username = BugsBunny  
     30[test1IssueCert] 
     31CN = BugsBunny  
    3232# Comment out to prompt for on tty. 
    3333#passphrase = 
    3434  
    35 [test2CookieConnect]          
     35[test2RevokeCert]          
    3636username = sstljakTestUser 
    3737#username = gabriel 
    3838#passphrase =  
    3939 
    40 [test3ProxyCertConnect]          
     40[test3GetCRL]          
    4141#username = sstljakTestUser 
    4242username = gabriel 
    4343#passphrase =  
    44  
    45 [test6CookieGetAttCert] 
    46 aaURI = http://localhost:5000/AttributeAuthority 
    47  
    48 [test6aCookieGetAttCertRefused] 
    49 aaURI = http://localhost:5100/AttributeAuthority 
    50  
    51 [test6bCookieGetMappedAttCert] 
    52 aaURI = http://localhost:5100/AttributeAuthority 
    53  
    54 [test6cCookieGetAttCertWithExtAttCertList] 
    55 aaURI = http://localhost:5100/AttributeAuthority 
    56  
    57 [test7ProxyCertGetAttCert] 
    58 aaURI = http://localhost:5000/AttributeAuthority 
    59  
    60  
    61  
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/ca/caClientTest.py

    r2139 r2145  
    11#!/usr/bin/env python 
    2  
    3 """Test harness for NDG Session Manager client - makes requests for  
    4 authentication and authorisation.  An Attribute Authority and Simple CA 
    5 services must be running for the reqAuthorisation and addUser tests 
     2"""Test harness for NDG Certificate Authority client - makes requests for  
     3issue and revocation of certificates. 
    64 
    75NERC Data Grid Project 
     
    108 
    11923/02/06 
    12  
    13 Renamed from SessionClientTest.py 27/0/4/06 
    14 Moved and renamed SessionMgrClientTest.py 23/11/06 
    1510 
    1611@copyright (C) 2007 CCLRC & NERC 
     
    2520from ConfigParser import SafeConfigParser 
    2621 
    27 from ndg.security.common.SessionMgr import SessionMgrClient, \ 
    28     AttributeRequestDenied 
    29      
    30 from ndg.security.common.SessionCookie import SessionCookie 
     22from ndg.security.common.ca import CertificateAuthorityClient 
    3123 
    3224 
    33 class SessionMgrClientTestCase(unittest.TestCase): 
     25class CAClientTestCase(unittest.TestCase): 
    3426     
    3527    def setUp(self): 
    3628         
    3729        configParser = SafeConfigParser() 
    38         configParser.read("./sessionMgrClientTest.cfg") 
     30        configParser.read("./caClientTest.cfg") 
    3931         
    4032        self.cfg = {} 
     
    5345            sys.exit(0) 
    5446             
    55         # Initialise the Session Manager client connection 
     47        # Initialise the Certificate Authority client connection 
    5648        # Omit traceFile keyword to leave out SOAP debug info 
    57         self.clnt = SessionMgrClient(uri=self.cfg['setUp']['smuri'], 
    58                 verifyingCertFilePath=self.cfg['setUp']['srvcertfilepath'], 
    59                 signingCertFilePath=self.cfg['setUp']['clntcertfilepath'], 
    60                 signingPriKeyFilePath=self.cfg['setUp']['clntprikeyfilepath'], 
    61                 signingPriKeyPwd=clntPriKeyPwd, 
    62                 tracefile=tracefile)  
    63          
    64         self.sessCookie = None 
    65         self.proxyCert = None 
    66         self.proxyPriKey = None 
    67         self.userCert = None 
     49        self.clnt = CertificateAuthorityClient(uri=self.cfg['setUp']['uri'], 
     50            verifyingCertFilePath=self.cfg['setUp'].get('srvcertfilepath'), 
     51            signingCertFilePath=self.cfg['setUp']['clntcertfilepath'], 
     52            signingPriKeyFilePath=self.cfg['setUp']['clntprikeyfilepath'], 
     53            signingPriKeyPwd=clntPriKeyPwd, 
     54            tracefile=tracefile)  
    6855 
    69     def test1AddUser(self): 
    70         """Add a new user ID to the MyProxy repository""" 
    71          
    72         passphrase = self.cfg['test1AddUser'].get('passphrase') or \ 
    73             getpass.getpass(prompt="\ntest1AddUser pass-phrase for new user: ") 
    74              
    75         # Note the pass-phrase is read from the file tmp.  To pass 
    76         # explicitly as a string use the 'passphrase' keyword instead 
    77         self.clnt.addUser(self.cfg['test1AddUser']['username'],  
    78                           passphrase=passphrase) 
    79         print "Added user '%s'" % self.cfg['test1AddUser']['username'] 
     56        self.clnt.openSSLConfig.filePath = \ 
     57            os.path.expandvars(self.cfg['setUp'].get('opensslconfigfilepath')) 
     58                 
     59        if self.clnt.openSSLConfig.filePath: 
     60            self.clnt.openSSLConfig.read() 
     61        else: 
     62            self.clnt.openSSLConfig.reqDN = {'O': self.cfg['setUp']['o'], 
     63                                             'OU': self.cfg['setUp']['ou']} 
     64 
     65 
     66    def test1IssueCert(self): 
     67        """Issue a new certificate""" 
     68        import pdb;pdb.set_trace() 
     69        cert,priKey = self.clnt.issueCert(CN=self.cfg['test1IssueCert']['cn']) 
     70        print "Issuing new cert '%s'" % self.cfg['test1IssueCert']['cn'] 
    8071         
    8172 
    82     def test2CookieConnect(self): 
    83         """test2CookieConnect: Connect as if acting as a browser client -  
    84         a cookie is returned""" 
     73    def test2RevokeCert(self): 
     74        """test2RevokeCert: revoke a certificate""" 
    8575 
    86         passphrase = self.cfg['test2CookieConnect'].get('passphrase') or \ 
    87         getpass.getpass(prompt="\ntest2CookieConnect pass-phrase for user: ") 
    88  
    89         self.proxyCert, self.proxyPriKey, self.userCert, cookie = \ 
    90             self.clnt.connect(self.cfg['test2CookieConnect']['username'],  
    91                               passphrase=passphrase, 
    92                               getCookie=True) 
     76        self.clnt.revokeCert(self.cfg['test2RevokeCert']['revokeCert']) 
    9377 
    9478        self.sessCookie = SessionCookie(cookie) 
    95         print "User '%s' connected to Session Manager:\n%s" % \ 
    96             (self.cfg['test2CookieConnect']['username'], self.sessCookie) 
     79        print "User '%s' connected to Certificate Authority:\n%s" % \ 
     80            (self.cfg['test2RevokeCert']['username'], self.sessCookie) 
    9781             
    9882 
    99     def test3ProxyCertConnect(self): 
    100         """test3ProxyCertConnect: Connect as a command line client -  
    101         a proxyCert is returned""" 
     83    def test3GetCRL(self): 
     84        """test3GetCRL: get Certificate Revocation List""" 
    10285 
    103         passphrase = self.cfg['test3ProxyCertConnect'].get('passphrase') or \ 
     86        passphrase = self.cfg['test3GetCRL'].get('passphrase') or \ 
    10487            getpass.getpass(\ 
    105                     prompt="\ntest3ProxyCertConnect pass-phrase for user: ") 
     88                    prompt="\ntest3GetCRL pass-phrase for user: ") 
    10689 
    107         self.proxyCert, self.proxyPriKey, self.userCert, null = \ 
    108             self.clnt.connect(self.cfg['test3ProxyCertConnect']['username'],  
    109                               passphrase=passphrase, 
    110                               getCookie=False) 
    111         print "User '%s' connected to Session Manager:\n%s" % \ 
    112             (self.cfg['test3ProxyCertConnect']['username'], self.proxyCert) 
     90        crl = self.clnt.getCRL() 
     91        print "CRL:\n%s" % crl 
    11392             
    114  
    115     def test4CookieDisconnect(self): 
    116         """test4CookieDisconnect: disconnect as if acting as a browser client -  
    117         a cookie is returned""" 
    118          
    119         print "\n\t" + self.test4CookieDisconnect.__doc__ 
    120         self.test2CookieConnect() 
    121          
    122         # Use proxy cert / private key just obtained from connect call for 
    123         # signature generation 
    124         self.clnt.signatureHandler.signingCert = self.proxyCert 
    125         self.clnt.signatureHandler.signingCertPriKey = self.proxyPriKey 
    126          
    127         self.clnt.disconnect(userCert=self.userCert, 
    128                              sessCookie=str(self.sessCookie)) 
    129          
    130         print "User disconnected from Session Manager:\n%s" % self.sessCookie 
    131              
    132  
    133     def test5ProxyCertDisconnect(self): 
    134         """test5ProxyCertDisconnect: Connect as a command line client -  
    135         a proxyCert is returned""" 
    136          
    137         print "\n\t" + self.test5ProxyCertDisconnect.__doc__ 
    138         self.test3ProxyCertConnect() 
    139          
    140         # Use proxy to sign outbound SOAP message 
    141         self.clnt.signingCert = self.proxyCert 
    142         self.clnt.signingKey = self.proxyPriKey 
    143         self.clnt.signingPriKeyPwd = None 
    144          
    145         self.clnt.disconnect(proxyCert=self.proxyCert) 
    146         print "User disconnected from Session Manager:\n%s" % self.proxyCert 
    147  
    148  
    149     def test6CookieGetAttCert(self): 
    150         """test6CookieGetAttCert: make an attribute request using 
    151         a cookie as authentication credential""" 
    152  
    153         print "\n\t" + self.test6CookieGetAttCert.__doc__         
    154         self.test2CookieConnect() 
    155          
    156         attCert, extAttCertList = self.clnt.getAttCert(\ 
    157             sessID=self.sessCookie.sessionID,  
    158             encrSessionMgrURI=self.sessCookie.encrSessionMgrURI, 
    159             attAuthorityURI=self.cfg['test6CookieGetAttCert']['aauri']) 
    160          
    161         print "Attribute Certificate:\n%s" % attCert   
    162         print "External Attribute Certificate List:\n%s" % extAttCertList 
    163  
    164  
    165     def test6aCookieGetAttCertRefused(self): 
    166         """test6aCookieGetAttCertRefused: make an attribute request using 
    167         a cookie as authentication credential requesting an AC from an 
    168         Attribute Authority where the user is NOT registered""" 
    169  
    170         print "\n\t" + self.test6aCookieGetAttCertRefused.__doc__         
    171         self.test2CookieConnect() 
    172          
    173         aaURI = self.cfg['test6aCookieGetAttCertRefused']['aauri'] 
    174          
    175         try: 
    176             attCert, extAttCertList = self.clnt.getAttCert(\ 
    177                         sessID=self.sessCookie.sessionID,  
    178                         encrSessionMgrURI=self.sessCookie.encrSessionMgrURI, 
    179                         attAuthorityURI=aaURI, 
    180                         mapFromTrustedHosts=False) 
    181         except AttributeRequestDenied, e: 
    182             print "SUCCESS - obtained expected result: %s" % e 
    183             return 
    184          
    185         self.fail("Request allowed from AA where user is NOT registered!") 
    186  
    187  
    188     def test6bCookieGetMappedAttCert(self): 
    189         """test6bCookieGetMappedAttCert: make an attribute request using 
    190         a cookie as authentication credential""" 
    191  
    192         print "\n\t" + self.test6bCookieGetMappedAttCert.__doc__         
    193         self.test2CookieConnect() 
    194          
    195         attCert, extAttCertList = self.clnt.getAttCert(\ 
    196             sessID=self.sessCookie.sessionID,  
    197             encrSessionMgrURI=self.sessCookie.encrSessionMgrURI, 
    198             attAuthorityURI=self.cfg['test6bCookieGetMappedAttCert']['aauri']) 
    199          
    200         print "Attribute Certificate:\n%s" % attCert   
    201         print "External Attribute Certificate List:\n%s" % extAttCertList 
    202  
    203  
    204     def test6bCookieGetMappedAttCert(self): 
    205         """test6CookieGetAttCert: make an attribute request using 
    206         a cookie as authentication credential""" 
    207  
    208         print "\n\t" + self.test6bCookieGetMappedAttCert.__doc__         
    209         self.test2CookieConnect() 
    210          
    211         attCert, extAttCertList = self.clnt.getAttCert(\ 
    212             sessID=self.sessCookie.sessionID,  
    213             encrSessionMgrURI=self.sessCookie.encrSessionMgrURI, 
    214             attAuthorityURI=self.cfg['test6bCookieGetMappedAttCert']['aauri']) 
    215          
    216         print "Attribute Certificate:\n%s" % attCert   
    217         print "External Attribute Certificate List:\n%s" % extAttCertList 
    218  
    219  
    220     def test6cCookieGetAttCertWithExtAttCertList(self): 
    221         """test6CookieGetAttCert: make an attribute request using 
    222         a cookie as authentication credential""" 
    223          
    224         print "\n\t" + self.test6cCookieGetAttCertWithExtAttCertList.__doc__         
    225         self.test2CookieConnect() 
    226          
    227         aaURI = \ 
    228             self.cfg['test6cCookieGetAttCertWithExtAttCertList']['aauri'] 
    229              
    230         attCert, extAttCertList = self.clnt.getAttCert(\ 
    231                         sessID=self.sessCookie.sessionID,  
    232                         encrSessionMgrURI=self.sessCookie.encrSessionMgrURI, 
    233                         attAuthorityURI=aaURI, 
    234                         extAttCertList=['AC1', 'AC2', 'AC3']) 
    235            
    236         print "Attribute Certificate:\n%s" % attCert   
    237         print "External Attribute Certificate List:\n%s" % extAttCertList 
    238  
    239  
    240     def test7ProxyCertGetAttCert(self): 
    241         """test7ProxyCertGetAttCert: make an attribute request using 
    242         a proxy cert as authentication credential""" 
    243         print "\n\t" + self.test7ProxyCertGetAttCert.__doc__ 
    244         self.test3ProxyCertConnect() 
    245          
    246         # Request an attribute certificate from an Attribute Authority  
    247         # using the proxyCert returned from connect() 
    248          
    249         aaURI = self.cfg['test7ProxyCertGetAttCert']['aauri'] 
    250         attCert, extAttCertList = self.clnt.getAttCert(\ 
    251                                                  proxyCert=self.proxyCert, 
    252                                                  attAuthorityURI=aaURI) 
    253            
    254         print "Attribute Certificate:\n%s" % attCert   
    255         print "External Attribute Certificate List:\n%s" % extAttCertList 
    256  
    257  
    258     def test8GetX509Cert(self): 
    259         "test8GetX509Cert: return the Session Manager's X.509 Cert." 
    260         cert = self.clnt.getX509Cert() 
    261                                               
    262         print "Session Manager X.509 Certificate:\n" + cert 
    26393             
    26494             
    26595#_____________________________________________________________________________        
    266 class SessionMgrClientTestSuite(unittest.TestSuite): 
     96class CAClientTestSuite(unittest.TestSuite): 
    26797     
    26898    def __init__(self): 
    269         map = map(SessionMgrClientTestCase, 
     99        map = map(CAClientTestCase, 
    270100                  ( 
    271                     "test1AddUser", 
    272                     "test2CookieConnect", 
    273                     "test3ProxyCertConnect", 
    274                     "test4CookieDisconnect", 
    275                     "test5ProxyCertDisconnect", 
    276                     "test6CookieGetAttCert", 
    277                     "test6bCookieGetMappedAttCert", 
    278                     "test6cCookieGetAttCertWithExtAttCertList", 
    279                     "test7ProxyCertGetAttCert", 
    280                     "test8GetX509Cert", 
     101                    "test1IssueCert", 
     102                    "test2RevokeCert", 
     103                    "test3GetCRL", 
    281104                  )) 
    282105        unittest.TestSuite.__init__(self, map) 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/ca/server.sh

    r2139 r2145  
    33# NERC Data Grid Project 
    44#                                                                                 
    5 # Session Manager client unit test - start server 
     5# Certificate Authority client unit test - start server 
    66# 
    7 #@author P J Kershaw 25/01/07 
     7#@author P J Kershaw 09/02/07 
    88#                                                                                 
    99#@copyright (C) 2007 CCLRC & NERC 
     
    1111#@licence: This software may be distributed under the terms of the Q Public  
    1212# License, version 1.0 or later. 
    13 export NDGSEC_SM_PROPFILEPATH=${PWD}/sessionMgrProperties.xml 
    14 export NDGSEC_SM_UNITTEST_DIR=${PWD} 
     13export NDGSEC_CA_PROPFILEPATH=${PWD}/simpleCAProperties.xml 
     14export NDGSEC_CA_UNITTEST_DIR=${PWD} 
    1515 
    16 srvDir1=../../server/SessionMgr 
    17 srvDir2=../../../../../ndg.security.server/ndg/security/server/SessionMgr 
     16srvDir1=../../server/ca 
     17srvDir2=../../../../../ndg.security.server/ndg/security/server/ca 
    1818 
    1919if [ -d $srvDir1 ]; then 
  • TI12-security/trunk/python/ndgSetup.sh

    r1236 r2145  
    5454export GLOBUS_LOCATION=<Globus location> 
    5555export GPT_LOCATION=${GLOBUS_LOCATION} 
     56export GRID_SECURITY_DIR=${GLOBUS_LOCATION}/etc 
    5657 
    5758. ${GLOBUS_LOCATION}/etc/globus-user-env.sh 
Note: See TracChangeset for help on using the changeset viewer.