Changeset 6840


Ignore:
Timestamp:
23/04/10 10:16:33 (9 years ago)
Author:
pjkersha
Message:

Experimented with PUT method but PyOpenSSL doesn't support the required X.509 extension for proxy certificates.

Location:
TI12-security/trunk/MyProxyClient/myproxy
Files:
3 deleted
7 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/MyProxyClient/myproxy/client.py

    r6837 r6840  
    2929import re 
    3030import traceback 
    31 from ConfigParser import SafeConfigParser 
    3231 
    3332from OpenSSL import crypto, SSL 
    3433 
    35 from myproxy.utils.openssl import OpenSSLConfig, OpenSSLConfigError 
    36  
    37  
    38 class CaseSensitiveConfigParser(SafeConfigParser): 
    39     '''Subclass the SafeConfigParser - to preserve the original string case of  
    40     config section names 
    41     '''    
    42     def optionxform(self, optionstr): 
    43         '''Extend SafeConfigParser.optionxform to preserve case of option names 
    44         ''' 
    45         return optionstr 
     34from myproxy.utils.openssl import OpenSSLConfig 
     35from myproxy.utils import CaseSensitiveConfigParser 
    4636 
    4737 
     
    6454    PARSER_RE = re.compile(PARSER_RE_STR)     
    6555     
    66     def __init__(self,  
    67                  myProxyServerDN=os.environ.get('MYPROXY_SERVER_DN'), 
    68                  cnHostPfx='host/', 
    69                  **kw): 
     56    def __init__(self, myProxyServerDN=os.environ.get('MYPROXY_SERVER_DN')): 
    7057        """Override parent class __init__ to enable setting of myProxyServerDN 
    7158        setting 
     
    7562        MyProxy server to avoid errors matching hostnames.  This is useful 
    7663        where the hostname is not fully qualified 
    77          
    78         @type cnHostPfx: string 
    79         @param cnHostPfx: globus host certificates are  
    80         generated by default with a 'host/' prefix to the host name.  Set 
    81         this keyword to '' or None to override and omit the prefix""" 
     64        """ 
    8265         
    8366        # Allow for quoted DN 
     
    9174        self.myProxyServerDN = zip(dnFields[1::2], dnFields[2::2]) 
    9275        self.myProxyServerDN.sort()         
    93         self.cnHostPfx = cnHostPfx 
    94          
    9576         
    9677    def __call__(self, connection, peerCert, errorStatus, errorDepth,  
     
    11293        @return: status code 
    11394        """ 
    114         return errorStatus 
    115      
    11695        if peerCert.has_expired(): 
    11796            # Any expired certificate in the chain should result in an error 
     
    136115             
    137116     
    138      
    139117class MyProxyClientError(Exception): 
    140118    """Base exception class for MyProxyClient exceptions""" 
     119 
    141120 
    142121class MyProxyClientConfigError(MyProxyClientError): 
    143122    """Error with configuration""" 
    144123      
     124      
    145125class MyProxyClientGetError(MyProxyClientError): 
    146126    """Exceptions arising from get request to server""" 
     127    
    147128     
    148129class MyProxyClientRetrieveError(MyProxyClientError): 
    149130    """Error recovering a response from MyProxy""" 
     131 
    150132 
    151133class MyProxyCredentialsAlreadyExist(MyProxyClientError): 
     
    154136    """ 
    155137     
     138     
    156139class MyProxyClientGetTrustRootsError(MyProxyClientError): 
    157140    """Error retrieving trust roots""" 
     
    209192    created with 
    210193     
    211     @type propertyDefaults: tuple 
    212     @cvar propertyDefaults: sets permissable element names for MyProxy config  
     194    @type PROPERTY_DEFAULTS: tuple 
     195    @cvar PROPERTY_DEFAULTS: sets permissable element names for MyProxy config  
    213196    file 
    214197    """ 
     
    219202PASSPHRASE=%s 
    220203LIFETIME=%d""" 
    221   
     204 
     205    PUT_CMD="""VERSION=MYPROXYv2 
     206COMMAND=1 
     207USERNAME=%s 
     208PASSPHRASE=<pass phrase> 
     209LIFETIME=%d""" 
     210      
    222211    INFO_CMD="""VERSION=MYPROXYv2 
    223212COMMAND=2 
     
    255244    _hostKeySubDirPath = ('etc', 'hostkey.pem') 
    256245     
     246    PROXY_FILE_PERMISSIONS = 0600 
     247     
    257248    # Work out default location of proxy file if it exists.  This is set if a 
    258249    # call has been made previously to logon / get-delegation 
     
    262253                                    or None)   
    263254     
    264     PRIKEY_NBITS = 2048 #4096 
     255    PRIKEY_NBITS = 4096 
    265256    MESSAGE_DIGEST_TYPE = "md5" 
    266257    SERVER_RESP_BLK_SIZE = 8192 
     
    268259     
    269260    # valid configuration property keywords 
    270     propertyDefaults = { 
     261    PROPERTY_DEFAULTS = { 
    271262       'hostname':              'localhost', 
    272263       'port':                  7512, 
    273264       'serverDN':              '', 
    274        'serverCNPrefix':        'host/', 
    275265       'openSSLConfFilePath':   '', 
    276266       'proxyCertMaxLifetime':  43200, 
     
    282272    # Restrict attributes to the above properties, their equivalent  
    283273    # protected values + extra OpenSSL config object. 
    284     __slots__ = propertyDefaults.copy() 
    285     __slots__.update(dict([('_'+k, v) for k,v in propertyDefaults.items()] + 
    286                           [('_openSSLConfig', None), 
    287                            ('_cfg',           None)] 
    288                           ) 
    289                      ) 
    290          
     274    __slots__ = tuple(['__' + k for k in PROPERTY_DEFAULTS.keys()]) 
     275    __slots__ += ('__openSSLConfig', '__cfg', '__serverSSLCertVerify') 
     276 
    291277    def __init__(self, cfgFilePath=None, **prop): 
    292278        """Make any initial settings for client connections to MyProxy 
     
    296282        given by cfgFilePath 
    297283         
    298         @param cfgFilePath:   set properties via a configuration file 
    299         @param **prop:         set properties via keywords - see  
    300         propertyDefaults class variable for a list of these 
     284        @param cfgFilePath: set properties via a configuration file 
     285        @type cfgFilePath: basestring 
     286        @param **prop: set properties via keywords - see  
     287        PROPERTY_DEFAULTS class variable for a list of these 
     288        @type **prop: dict 
    301289        """ 
    302          
    303         # Default settings.  Nb. '_' - override property methods in order to  
    304         # set defaults 
    305         for opt, val in MyProxyClient.propertyDefaults.items(): 
    306             setattr(self, '_'+opt, val) 
     290        self.__hostname = None 
     291        self.__port = None 
     292        self.__serverDN = None 
     293        self.__openSSLConfFilePath = None 
     294        self.__proxyCertMaxLifetime = MyProxyClient.PROPERTY_DEFAULTS[ 
     295                                                        'proxyCertMaxLifetime'] 
     296        self.__proxyCertLifetime = MyProxyClient.PROPERTY_DEFAULTS[ 
     297                                                        'proxyCertLifetime'] 
     298        self.__caCertFilePath = None 
     299        self.__caCertDir = None 
     300         
     301        self.__cfg = None 
     302         
    307303 
    308304        # Configuration file used to get default subject when generating a 
    309305        # new proxy certificate request 
    310         self._openSSLConfig = OpenSSLConfig() 
     306        self.__openSSLConfig = OpenSSLConfig() 
    311307         
    312308        # Server host name - take from environment variable if available 
    313309        self.hostname = os.environ.get('MYPROXY_SERVER', 
    314                                     MyProxyClient.propertyDefaults['hostname']) 
     310                                    MyProxyClient.PROPERTY_DEFAULTS['hostname']) 
    315311             
    316312        # ... and port number 
    317313        self.port = int(os.environ.get('MYPROXY_SERVER_PORT',  
    318                                        MyProxyClient.propertyDefaults['port'])) 
     314                                       MyProxyClient.PROPERTY_DEFAULTS['port'])) 
    319315 
    320316        # Server Distinguished Name 
    321317        self.serverDN = os.environ.get('MYPROXY_SERVER_DN', 
    322                                     MyProxyClient.propertyDefaults['serverDN']) 
     318                                    MyProxyClient.PROPERTY_DEFAULTS['serverDN']) 
    323319         
    324320        # Environment variable may be quoted 
     
    326322            self.serverDN = self.serverDN.strip('"') 
    327323             
    328         # keyword settings 
     324        # Any keyword settings override the defaults above 
    329325        for opt, val in prop.items(): 
    330326            setattr(self, opt, val) 
    331327         
    332328        # If properties file is set any parameters settings in file will 
    333         # override those set by input keyword 
     329        # override those set by input keyword or the defaults 
    334330        if cfgFilePath is not None: 
    335331            self.parseConfig(cfg=cfgFilePath) 
    336  
     332             
     333        self.__serverSSLCertVerify = MyProxyServerSSLCertVerification( 
     334                                                myProxyServerDN=self.serverDN) 
     335 
     336    def _getServerSSLCertVerify(self): 
     337        return self.__serverSSLCertVerify 
     338 
     339    def _setServerSSLCertVerify(self, value): 
     340        if not isinstance(value, MyProxyServerSSLCertVerification): 
     341            raise TypeError('Expecting %r derived type for ' 
     342                            '"serverSSLCertVerify" attribute; got %r' % 
     343                            MyProxyServerSSLCertVerification, 
     344                            value) 
     345        self.__serverSSLCertVerify = value 
     346 
     347    serverSSLCertVerify = property(_getServerSSLCertVerify,  
     348                                   _setServerSSLCertVerify,  
     349                                   doc="Class with a __call__ method which is " 
     350                                       "passed to the SSL context to verify " 
     351                                       "the peer (MyProxy server) certificate " 
     352                                       "in the SSL handshake between this " 
     353                                       "client and the MyProxy server") 
    337354 
    338355    def parseConfig(self, cfg, section='DEFAULT'): 
     
    341358        if isinstance(cfg, basestring): 
    342359            cfgFilePath = os.path.expandvars(cfg) 
    343             self._cfg = CaseSensitiveConfigParser() 
    344             self._cfg.read(cfgFilePath) 
     360            self.__cfg = CaseSensitiveConfigParser() 
     361            self.__cfg.read(cfgFilePath) 
    345362        else: 
    346363            cfgFilePath = None 
    347             self._cfg = cfg 
    348          
    349         for key, val in self._cfg.items(section): 
     364            self.__cfg = cfg 
     365         
     366        for key, val in self.__cfg.items(section): 
    350367            setattr(self, key, val) 
    351368         
    352369    # Get/Set Property methods 
    353370    def _getHostname(self): 
    354         return self._hostname 
     371        return self.__hostname 
    355372     
    356373    def _setHostname(self, val): 
     
    358375            raise AttributeError("Expecting string type for hostname " 
    359376                                 "attribute") 
    360         self._hostname = val 
     377        self.__hostname = val 
    361378         
    362379    hostname = property(fget=_getHostname, 
     
    365382     
    366383    def _getPort(self): 
    367         return self._port 
     384        return self.__port 
    368385     
    369386    def _setPort(self, val): 
    370387        if isinstance(val, basestring): 
    371             self._port = int(val) 
     388            self.__port = int(val) 
    372389        elif isinstance(val, int): 
    373             self._port = val 
     390            self.__port = val 
    374391        else: 
    375392            raise AttributeError("Expecting int type for port attribute") 
     
    380397     
    381398    def _getServerDN(self): 
    382         return self._serverDN 
     399        return self.__serverDN 
    383400     
    384401    def _setServerDN(self, val): 
     
    386403            raise AttributeError("Expecting string type for serverDN " 
    387404                                 "attribute") 
    388         self._serverDN = val 
     405        self.__serverDN = val 
    389406     
    390407    serverDN = property(fget=_getServerDN, 
     
    393410                            "Certificate") 
    394411     
    395     def _getServerCNPrefix(self): 
    396         return self._serverCNPrefix 
    397      
    398     def _setServerCNPrefix(self, val): 
    399         if not isinstance(val, basestring): 
    400             raise AttributeError("Expecting string type for serverCNPrefix " 
    401                                  "attribute") 
    402         self._serverCNPrefix = val 
    403      
    404     serverCNPrefix = property(fget=_getServerCNPrefix, 
    405                               fset=_setServerCNPrefix, 
    406                               doc="Prefix if any for Server Certificate DN " 
    407                                   "Common Name e.g. 'host/'") 
    408      
    409412    def _getOpenSSLConfFilePath(self): 
    410         return self._openSSLConfFilePath 
     413        return self.__openSSLConfFilePath 
    411414     
    412415    def _setOpenSSLConfFilePath(self, val): 
     
    414417            raise AttributeError("Expecting string type for " 
    415418                                 "openSSLConfFilePath attribute") 
    416         self._openSSLConfFilePath = os.path.expandvars(val) 
    417         self._openSSLConfig.filePath = self._openSSLConfFilePath 
    418         self._openSSLConfig.read()   
     419        self.__openSSLConfFilePath = os.path.expandvars(val) 
     420        self.__openSSLConfig.filePath = self.__openSSLConfFilePath 
     421        self.__openSSLConfig.read()   
    419422     
    420423    openSSLConfFilePath = property(fget=_getOpenSSLConfFilePath, 
     
    423426     
    424427    def _getProxyCertMaxLifetime(self): 
    425         return self._proxyCertMaxLifetime 
     428        return self.__proxyCertMaxLifetime 
    426429     
    427430    def _setProxyCertMaxLifetime(self, val): 
    428431        if isinstance(val, basestring): 
    429             self._proxyCertMaxLifetime = int(val) 
     432            self.__proxyCertMaxLifetime = int(val) 
    430433             
    431434        elif isinstance(val, int): 
    432             self._proxyCertMaxLifetime = val 
     435            self.__proxyCertMaxLifetime = val 
    433436        else: 
    434437            raise AttributeError("Expecting int type for proxyCertMaxLifetime " 
     
    442445     
    443446    def _getProxyCertLifetime(self): 
    444         return self._proxyCertLifetime 
     447        return self.__proxyCertLifetime 
    445448     
    446449    def _setProxyCertLifetime(self, val): 
    447450        if isinstance(val, basestring): 
    448             self._proxyCertLifetime = int(val) 
     451            self.__proxyCertLifetime = int(val) 
    449452        elif isinstance(val, int): 
    450             self._proxyCertLifetime = val 
     453            self.__proxyCertLifetime = val 
    451454        else: 
    452455            raise AttributeError("Expecting int type for proxyCertLifetime " 
     
    459462     
    460463    def _getCACertFilePath(self): 
    461         return self._caCertFilePath 
     464        return self.__caCertFilePath 
    462465     
    463466    def _setCACertFilePath(self, val): 
     
    468471        if isinstance(val, basestring): 
    469472            if val == '': 
    470                 self._caCertFilePath = None 
     473                self.__caCertFilePath = None 
    471474            else: 
    472                 self._caCertFilePath = os.path.expandvars(val) 
     475                self.__caCertFilePath = os.path.expandvars(val) 
    473476                 
    474477        elif isinstance(val, None): 
     
    483486 
    484487    def _getCACertDir(self): 
    485         return self._caCertDir 
     488        return self.__caCertDir 
    486489 
    487490    def _setCACertDir(self, val): 
     
    497500        if isinstance(val, basestring): 
    498501            if val == '': 
    499                 self._caCertDir = None 
     502                self.__caCertDir = None 
    500503            else: 
    501                 self._caCertDir = os.path.expandvars(val) 
     504                self.__caCertDir = os.path.expandvars(val) 
    502505                 
    503506        elif isinstance(val, None): 
    504             self._caCertDir = val     
     507            self.__caCertDir = val     
    505508        else: 
    506509            raise AttributeError("Expecting string or None type for caCertDir " 
     
    516519    def _getOpenSSLConfig(self): 
    517520        "Get OpenSSLConfig object property method" 
    518         return self._openSSLConfig 
    519      
    520     openSSLConfig = property(fget=_getOpenSSLConfig, 
    521                              doc="OpenSSLConfig object") 
    522  
    523            
     521        return self.__openSSLConfig 
     522     
     523    openSSLConfig = property(fget=_getOpenSSLConfig, doc="OpenSSLConfig object") 
     524 
    524525    def _initConnection(self,  
    525                         ownerCertFile=None,  
    526                         ownerKeyFile=None, 
    527                         ownerPassphrase=None): 
     526                        certFile=None,  
     527                        keyFile=None, 
     528                        keyFilePassphrase=None): 
    528529        """Initialise connection setting up SSL context and client and 
    529530        server side identity checks 
    530531         
    531         @type ownerCertFile: basestring 
    532         @param ownerCertFile: client certificate and owner of credential 
    533         to be acted on.  Can be a proxy cert + proxy's signing cert.  Cert 
    534         and private key are not necessary for getDelegation / logon calls 
    535         @type ownerKeyFile: basestring 
    536         @param ownerKeyFile: client private key file 
    537         @type ownerPassphrase: basestring 
    538         @param ownerPassphrase: pass-phrase protecting private key if set -  
    539         not needed in the case of a proxy private key 
     532        @type sslCertFile: basestring 
     533        @param sslCertFile: certificate for SSL client authentication.  It may 
     534        be owner of a credential to be acted on or the concatenated proxy  
     535        certificate + proxy's signing cert.  SSL client authentication is not  
     536        necessary for getDelegation / logon calls 
     537        @type sslKeyFile: basestring 
     538        @param sslKeyFile: client private key file 
     539        @type keyFilePassphrase: basestring 
     540        @param keyFilePassphrase: pass-phrase protecting private key if set 
    540541        """ 
    541542        # Must be version 3 for MyProxy 
     
    545546            context.load_verify_locations(self.caCertFilePath, self.caCertDir) 
    546547             
    547         if ownerCertFile: 
     548        if certFile: 
    548549            try: 
    549                 context.use_certificate_chain_file(ownerCertFile) 
     550                context.use_certificate_chain_file(certFile) 
    550551                def pwdCallback(passphraseMaxLen,  
    551552                                promptPassphraseTwice, 
     
    559560                    return passphrase 
    560561                     
    561                 context.set_passwd_cb(pwdCallback, ownerPassphrase) 
    562                 context.use_privatekey_file(ownerKeyFile) 
     562                if keyFilePassphrase is not None: 
     563                    context.set_passwd_cb(pwdCallback, keyFilePassphrase) 
     564                     
     565                context.use_privatekey_file(keyFile) 
    563566            except Exception: 
    564567                raise MyProxyClientConfigError("Loading certificate " 
     
    570573        # Verify peer's (MyProxy server) certificate 
    571574        context.set_verify(SSL.VERIFY_PEER|SSL.VERIFY_FAIL_IF_NO_PEER_CERT,  
    572                            MyProxyServerSSLCertVerification())  
     575                           self.__serverSSLCertVerify)  
    573576         
    574577            
     
    580583        # connect to myproxy server 
    581584        conn = SSL.Connection(context, socket.socket()) 
    582          
    583         # Check server host identity - if host doesn't match use explicit 
    584         # 'serverDN'  
    585         # host/<hostname> one 
    586 #        hostCheck = _HostCheck(host=self.hostname, 
    587 #                               myProxyServerDN=self.serverDN, 
    588 #                               cnHostPfx=self.serverCNPrefix) 
    589 #        conn.set_post_connection_check_callback(hostCheck) 
    590585         
    591586        return conn 
     
    699694            
    700695        return pemCerts 
    701      
    702      
     696        
    703697    @classmethod 
    704     def writeProxyFile(cls,proxyCert,proxyPriKey,userX509Cert,filePath=None): 
     698    def writeProxyFile(cls, proxyCert, proxyPriKey, userX509Cert,  
     699                       filePath=None): 
    705700        """Write out proxy cert to file in the same way as myproxy-logon -  
    706701        proxy cert, private key, user cert.  Nb. output from logon can be 
     
    757752        # Split certs and key into separate tuple items 
    758753        return tuple(['-----BEGIN'+i for i in proxy.split('-----BEGIN')[1:]]) 
    759      
     754 
     755    def put(self, 
     756            username, 
     757            passphrase, 
     758            userCertFile, 
     759            userKeyFile,  
     760            lifetime=None, 
     761            sslCertFile=None, 
     762            sslKeyFile=None, 
     763            sslKeyFilePassphrase=None): 
     764        """Store a proxy credential on the server 
     765         
     766        @raise MyProxyClientError: no client certificate and private key set 
     767         
     768        @type username: string 
     769        @param username: username selected for new credential 
     770        @type passphrase: string 
     771        @param passphrase: pass-phrase for new credential.  This will be used  
     772        by the server to authenticate later requests. 
     773        @type certFile: string 
     774        @param certFile: user's X.509 proxy certificate in PEM format 
     775        @type keyFile: string 
     776        @param keyFile: equivalent private key file in PEM format 
     777        @type sslCertFile: string 
     778        @param sslCertFile: certificate used for client authentication with 
     779        the MyProxy server SSL connection.  This ID will be set as the owner 
     780        of the stored credentials.  Only the owner can later remove  
     781        credentials with myproxy-destroy or the destroy method.  If not set, 
     782        this argument defaults to $GLOBUS_LOCATION/etc/hostcert.pem or if this 
     783        is not set, certFile 
     784        @type sslKeyFile: string 
     785        @param sslKeyFile: corresponding private key file.  See explanation 
     786        for sslCertFile 
     787        @type sslKeyFilePassphrase: string  
     788        @param sslKeyFilePassphrase: passphrase for sslKeyFile.  Omit if the 
     789        private key is not password protected.   
     790        @type lifetime: int / None 
     791        @param lifetime: the maximum lifetime allowed for retrieved proxy  
     792        credentials in seconds. defaults to proxyCertMaxLifetime attribute value 
     793        """ 
     794         
     795        lifetime = lifetime or self.proxyCertMaxLifetime 
     796 
     797        # Inputs must be string type otherwise server will reject the request 
     798        if isinstance(username, unicode): 
     799            username = str(username) 
     800             
     801        if isinstance(passphrase, unicode): 
     802            passphrase = str(passphrase) 
     803         
     804        globusLoc = os.environ.get('GLOBUS_LOCATION') 
     805        if not sslCertFile or not sslKeyFile: 
     806            if globusLoc: 
     807                sslCertFile = os.path.join(globusLoc,  
     808                                           *MyProxyClient._hostCertSubDirPath) 
     809                sslKeyFile = os.path.join(globusLoc,  
     810                                          *MyProxyClient._hostKeySubDirPath) 
     811            else: 
     812                raise MyProxyClientError('No client certificate and private ' 
     813                                         'key set and no $GLOBUS_LOCATION set ' 
     814                                         'in order to retrieve and use a host ' 
     815                                         'certificate and private key') 
     816                 
     817        # Set up SSL connection 
     818        conn = self._initConnection(certFile=sslCertFile, 
     819                                    keyFile=sslKeyFile, 
     820                                    keyFilePassphrase=sslKeyFilePassphrase) 
     821         
     822        conn.connect((self.hostname, self.port)) 
     823         
     824        # send globus compatibility stuff 
     825        conn.write('0') 
     826     
     827        # send store command - ensure conversion from unicode before writing 
     828        cmd = MyProxyClient.PUT_CMD % (username, lifetime) 
     829        conn.write(str(cmd)) 
     830     
     831        # process server response 
     832        dat = conn.recv(MyProxyClient.SERVER_RESP_BLK_SIZE) 
     833             
     834        respCode, errorTxt = self._deserializeResponse(dat) 
     835        if respCode: 
     836            raise MyProxyClientGetError(errorTxt) 
     837     
     838        # Get the certificate request generated by the server 
     839        certReqDat = conn.recv(MyProxyClient.SERVER_RESP_BLK_SIZE) 
     840        certReq = crypto.load_certificate_request(crypto.FILETYPE_ASN1,  
     841                                                  certReqDat) 
     842        pubKey = certReq.get_pubkey() 
     843        userKey = crypto.load_privatekey(crypto.FILETYPE_PEM,  
     844                                         open(userKeyFile).read(),  
     845                                         'testpassword')  
     846         
     847        userCert = crypto.load_certificate(crypto.FILETYPE_PEM,  
     848                                           open(userCertFile).read()) 
     849         
     850        # Create the proxy certificate 
     851        proxyCert = crypto.X509() 
     852        userCertSubject = userCert.get_subject() 
     853        proxyCert.set_issuer(userCertSubject) 
     854        proxyCert.set_pubkey(pubKey) 
     855        proxyCert.set_notBefore('20100421130000Z') 
     856        proxyCert.set_notAfter('20100421170000Z') 
     857        proxyCert.set_serial_number(12345) 
     858        proxyCertSubject = crypto.X509Name(userCertSubject) 
     859        proxyCertSubject.CN = userCertSubject.CN+'/CN=1234567' 
     860         
     861        proxyCert.set_subject(proxyCertSubject) 
     862        proxyCert.set_version(3) 
     863         
     864        # Oops not currently supported! 
     865#        extension = crypto.X509Extension('proxyCertInfo', 
     866#                                         1, 
     867#                                         'Path Length Constraint: infinite') 
     868#        proxyCert.add_extensions([extension]) 
     869        proxyCert.sign(userKey, 'md5') 
     870        wantRead = conn.want_read() 
     871        wantWrite = conn.want_write() 
     872         
     873        nCerts = '\002' 
     874        conn.send(nCerts) 
     875        conn.send(crypto.dump_certificate(crypto.FILETYPE_ASN1, proxyCert)) 
     876        conn.send(crypto.dump_certificate(crypto.FILETYPE_ASN1, userCert)) 
     877         
     878        resp = conn.recv(MyProxyClient.SERVER_RESP_BLK_SIZE) 
     879        respCode, errorTxt = self._deserializeResponse(resp) 
     880        if respCode: 
     881            raise MyProxyClientRetrieveError(errorTxt) 
    760882 
    761883    def info(self, 
    762884             username,  
    763              ownerCertFile=None, 
    764              ownerKeyFile=None, 
    765              ownerPassphrase=None): 
     885             sslCertFile=None, 
     886             sslKeyFile=None, 
     887             sslKeyFilePassphrase=None): 
    766888        """return True/False whether credentials exist on the server for a  
    767889        given username 
     
    772894        @type username: string 
    773895        @param username: username selected for credential 
    774         @type ownerCertFile: string 
    775         @param ownerCertFile: certificate used for client authentication with 
     896        @type sslCertFile: string 
     897        @param sslCertFile: certificate used for client authentication with 
    776898        the MyProxy server SSL connection.  This ID will be set as the owner 
    777899        of the stored credentials.  Only the owner can later remove  
    778900        credentials with myproxy-destroy or the destroy method.  If not set, 
    779901        this argument defaults to $GLOBUS_LOCATION/etc/hostcert.pem  
    780         @type ownerKeyFile: string  
    781         @param ownerKeyFile: corresponding private key file.  See explanation 
    782         for ownerCertFile 
    783         @type ownerPassphrase: string 
    784         @param ownerPassphrase: passphrase for ownerKeyFile.  Omit if the 
     902        @type sslKeyFile: string  
     903        @param sslKeyFile: corresponding private key file.  See explanation 
     904        for sslCertFile 
     905        @type sslKeyFilePassphrase: string 
     906        @param sslKeyFilePassphrase: passphrase for sslKeyFile.  Omit if the 
    785907        private key is not password protected. 
    786908        """ 
    787909        globusLoc = os.environ.get('GLOBUS_LOCATION') 
    788         if not ownerCertFile: 
     910        if not sslCertFile: 
    789911            if globusLoc: 
    790                 ownerCertFile = os.path.join(globusLoc,  
     912                sslCertFile = os.path.join(globusLoc,  
    791913                                            *MyProxyClient._hostCertSubDirPath) 
    792                 ownerKeyFile = os.path.join(globusLoc,  
     914                sslKeyFile = os.path.join(globusLoc,  
    793915                                            *MyProxyClient._hostKeySubDirPath) 
    794916            else: 
     
    797919 
    798920        # Set-up SSL connection 
    799         conn = self._initConnection(ownerCertFile=ownerCertFile, 
    800                                     ownerKeyFile=ownerKeyFile, 
    801                                     ownerPassphrase=ownerPassphrase) 
     921        conn = self._initConnection(certFile=sslCertFile, 
     922                                    keyFile=sslKeyFile, 
     923                                    keyFilePassphrase=sslKeyFilePassphrase) 
    802924         
    803925        conn.connect((self.hostname, self.port)) 
     
    821943        return not bool(respCode), errorTxt, field 
    822944 
    823  
    824945    def changePassphrase(self, 
    825946                         username,  
    826947                         passphrase, 
    827948                         newPassphrase, 
    828                          ownerCertFile=None, 
    829                          ownerKeyFile=None, 
    830                          ownerPassphrase=None): 
     949                         sslCertFile=None, 
     950                         sslKeyFile=None, 
     951                         sslKeyFilePassphrase=None): 
    831952        """change pass-phrase protecting the credentials for a given username 
    832953         
     
    837958        @param passphrase: existing pass-phrase for credential 
    838959        @param newPassphrase: new pass-phrase to replace the existing one. 
    839         @param ownerCertFile: certificate used for client authentication with 
     960        @param sslCertFile: certificate used for client authentication with 
    840961        the MyProxy server SSL connection.  This ID will be set as the owner 
    841962        of the stored credentials.  Only the owner can later remove  
    842963        credentials with myproxy-destroy or the destroy method.  If not set, 
    843964        this argument defaults to $GLOBUS_LOCATION/etc/hostcert.pem  
    844         @param ownerKeyFile: corresponding private key file.  See explanation 
    845         for ownerCertFile 
    846         @param ownerPassphrase: passphrase for ownerKeyFile.  Omit if the 
     965        @param sslKeyFile: corresponding private key file.  See explanation 
     966        for sslCertFile 
     967        @param sslKeyFilePassphrase: passphrase for sslKeyFile.  Omit if the 
    847968        private key is not password protected.   
    848969        @return none 
    849970        """ 
    850971        globusLoc = os.environ.get('GLOBUS_LOCATION') 
    851         if not ownerCertFile or not ownerKeyFile: 
     972        if not sslCertFile or not sslKeyFile: 
    852973            if globusLoc: 
    853                 ownerCertFile = os.path.join(globusLoc,  
     974                sslCertFile = os.path.join(globusLoc,  
    854975                                         *MyProxyClient._hostCertSubDirPath) 
    855                 ownerKeyFile = os.path.join(globusLoc,  
     976                sslKeyFile = os.path.join(globusLoc,  
    856977                                         *MyProxyClient._hostKeySubDirPath) 
    857978            else: 
     
    860981         
    861982        # Set-up SSL connection 
    862         conn = self._initConnection(ownerCertFile=ownerCertFile, 
    863                                     ownerKeyFile=ownerKeyFile, 
    864                                     ownerPassphrase=ownerPassphrase) 
     983        conn = self._initConnection(certFile=sslCertFile, 
     984                                    keyFile=sslKeyFile, 
     985                                    keyFilePassphrase=sslKeyFilePassphrase) 
    865986 
    866987        conn.connect((self.hostname, self.port)) 
     
    8821003            raise MyProxyClientGetError(errorTxt) 
    8831004 
    884  
    8851005    def destroy(self, 
    8861006                username,  
    887                 ownerCertFile=None, 
    888                 ownerKeyFile=None, 
    889                 ownerPassphrase=None): 
     1007                sslCertFile=None, 
     1008                sslKeyFile=None, 
     1009                sslKeyFilePassphrase=None): 
    8901010        """destroy credentials from the server for a given username 
    8911011         
     
    8941014         
    8951015        @param username: username selected for credential 
    896         @param ownerCertFile: certificate used for client authentication with 
     1016        @param sslCertFile: certificate used for client authentication with 
    8971017        the MyProxy server SSL connection.  This ID will be set as the owner 
    8981018        of the stored credentials.  Only the owner can later remove  
    8991019        credentials with myproxy-destroy or the destroy method.  If not set, 
    9001020        this argument defaults to $GLOBUS_LOCATION/etc/hostcert.pem  
    901         @param ownerKeyFile: corresponding private key file.  See explanation 
    902         for ownerCertFile 
    903         @param ownerPassphrase: passphrase for ownerKeyFile.  Omit if the 
     1021        @param sslKeyFile: corresponding private key file.  See explanation 
     1022        for sslCertFile 
     1023        @param sslKeyFilePassphrase: passphrase for sslKeyFile.  Omit if the 
    9041024        private key is not password protected.   
    9051025        @return none 
    9061026        """ 
    9071027        globusLoc = os.environ.get('GLOBUS_LOCATION') 
    908         if not ownerCertFile or not ownerKeyFile: 
     1028        if not sslCertFile or not sslKeyFile: 
    9091029            if globusLoc: 
    910                 ownerCertFile = os.path.join(globusLoc,  
     1030                sslCertFile = os.path.join(globusLoc,  
    9111031                                         *MyProxyClient._hostCertSubDirPath) 
    912                 ownerKeyFile = os.path.join(globusLoc,  
     1032                sslKeyFile = os.path.join(globusLoc,  
    9131033                                         *MyProxyClient._hostKeySubDirPath) 
    9141034            else: 
     
    9171037         
    9181038        # Set-up SSL connection 
    919         conn = self._initConnection(ownerCertFile=ownerCertFile, 
    920                                     ownerKeyFile=ownerKeyFile, 
    921                                     ownerPassphrase=ownerPassphrase) 
     1039        conn = self._initConnection(certFile=sslCertFile, 
     1040                                    keyFile=sslKeyFile, 
     1041                                    keyFilePassphrase=sslKeyFilePassphrase) 
    9221042 
    9231043        conn.connect((self.hostname, self.port)) 
     
    9361056        if respCode: 
    9371057            raise MyProxyClientGetError(errorTxt) 
    938  
    9391058 
    9401059    def store(self, 
     
    9431062              certFile, 
    9441063              keyFile, 
    945               ownerCertFile=None, 
    946               ownerKeyFile=None, 
    947               ownerPassphrase=None, 
     1064              sslCertFile=None, 
     1065              sslKeyFile=None, 
     1066              sslKeyFilePassphrase=None, 
    9481067              lifetime=None, 
    9491068              force=True): 
     
    9621081        @type keyFile: string 
    9631082        @param keyFile: equivalent private key file in PEM format 
    964         @type ownerCertFile: string 
    965         @param ownerCertFile: certificate used for client authentication with 
     1083        @type sslCertFile: string 
     1084        @param sslCertFile: certificate used for client authentication with 
    9661085        the MyProxy server SSL connection.  This ID will be set as the owner 
    9671086        of the stored credentials.  Only the owner can later remove  
     
    9691088        this argument defaults to $GLOBUS_LOCATION/etc/hostcert.pem or if this 
    9701089        is not set, certFile 
    971         @type ownerKeyFile: string 
    972         @param ownerKeyFile: corresponding private key file.  See explanation 
    973         for ownerCertFile 
    974         @type ownerPassphrase: string  
    975         @param ownerPassphrase: passphrase for ownerKeyFile.  Omit if the 
     1090        @type sslKeyFile: string 
     1091        @param sslKeyFile: corresponding private key file.  See explanation 
     1092        for sslCertFile 
     1093        @type sslKeyFilePassphrase: string  
     1094        @param sslKeyFilePassphrase: passphrase for sslKeyFile.  Omit if the 
    9761095        private key is not password protected.  Nb. keyFile is expected to 
    9771096        be passphrase protected as this will be the passphrase used for 
     
    9931112         
    9941113        globusLoc = os.environ.get('GLOBUS_LOCATION') 
    995         if not ownerCertFile or not ownerKeyFile: 
     1114        if not sslCertFile or not sslKeyFile: 
    9961115            if globusLoc: 
    997                 ownerCertFile = os.path.join(globusLoc,  
     1116                sslCertFile = os.path.join(globusLoc,  
    9981117                                         *MyProxyClient._hostCertSubDirPath) 
    999                 ownerKeyFile = os.path.join(globusLoc,  
     1118                sslKeyFile = os.path.join(globusLoc,  
    10001119                                         *MyProxyClient._hostKeySubDirPath) 
    10011120            else: 
    10021121                # Default so that the owner is the same as the ID of the  
    10031122                # credentials to be uploaded. 
    1004                 ownerCertFile = certFile  
    1005                 ownerKeyFile = keyFile 
    1006                 ownerPassphrase = passphrase 
     1123                sslCertFile = certFile  
     1124                sslKeyFile = keyFile 
     1125                sslKeyFilePassphrase = passphrase 
    10071126                 
    10081127        if not force: 
    10091128            # Check credentials don't already exist 
    10101129            if self.info(username, 
    1011                          ownerCertFile=ownerCertFile, 
    1012                          ownerKeyFile=ownerKeyFile, 
    1013                          ownerPassphrase=ownerPassphrase)[0]: 
     1130                         sslCertFile=sslCertFile, 
     1131                         sslKeyFile=sslKeyFile, 
     1132                         sslKeyFilePassphrase=sslKeyFilePassphrase)[0]: 
    10141133                raise MyProxyCredentialsAlreadyExist( 
    10151134                        "Credentials already exist for user: %s" % username) 
    10161135 
    10171136        # Set up SSL connection 
    1018         conn = self._initConnection(ownerCertFile=ownerCertFile, 
    1019                                     ownerKeyFile=ownerKeyFile, 
    1020                                     ownerPassphrase=ownerPassphrase) 
     1137        conn = self._initConnection(certFile=sslCertFile, 
     1138                                    keyFile=sslKeyFile, 
     1139                                    keyFilePassphrase=sslKeyFilePassphrase) 
    10211140         
    10221141        conn.connect((self.hostname, self.port)) 
     
    10491168            raise MyProxyClientRetrieveError(errorTxt) 
    10501169         
    1051           
    10521170    def logon(self, username, passphrase, lifetime=None, keyPair=None,  
    10531171              certReq=None, nBitsForKey=PRIKEY_NBITS): 
  • TI12-security/trunk/MyProxyClient/myproxy/test/myProxyClient.cfg

    r6829 r6840  
    2323#serverDN=/O=NDG/OU=Raphael/CN=raphael 
    2424 
    25 # Set "host/" prefix to host cert CN as is default with globus 
    26 serverCNPrefix=host/ 
    27  
    2825# This directory path is used to locate the OpenSSL configuration file 
    2926#  
  • TI12-security/trunk/MyProxyClient/myproxy/test/myProxyClientTest.cfg

    r6829 r6840  
    1818username: testuser 
    1919passphrase: testpassword 
    20 signingCertFilePath: $MYPROXYCLIENT_UNITTEST_DIR/testuser.crt 
    21 signingPriKeyFilePath: $MYPROXYCLIENT_UNITTEST_DIR/testuser.key 
    22 ownerCertFile: $MYPROXYCLIENT_UNITTEST_DIR/testuser.crt 
    23 ownerKeyFile: $MYPROXYCLIENT_UNITTEST_DIR/testuser.key 
    24 ownerPassphrase: testpassword 
     20sslCertFile: $MYPROXYCLIENT_UNITTEST_DIR/testuser.crt 
     21sslKeyFile: $MYPROXYCLIENT_UNITTEST_DIR/testuser.key 
     22sslKeyFilePassphrase: testpassword 
    2523 
    2624[test02GetDelegation] 
     
    3331[test03Info] 
    3432username: testuser 
    35 ownerCertFile: $MYPROXYCLIENT_UNITTEST_DIR/proxy.crt 
    36 ownerKeyFile: $MYPROXYCLIENT_UNITTEST_DIR/proxy.key 
    37 ownerPassphrase: testpassword 
     33sslCertFile: $MYPROXYCLIENT_UNITTEST_DIR/proxy.crt 
     34sslKeyFile: $MYPROXYCLIENT_UNITTEST_DIR/proxy.key 
     35sslKeyFilePassphrase: testpassword 
    3836 
    3937[test04ChangePassphrase] 
    4038username: testuser 
    41 ownerCertFile: $MYPROXYCLIENT_UNITTEST_DIR/proxy.crt 
    42 ownerKeyFile: $MYPROXYCLIENT_UNITTEST_DIR/proxy.key 
     39sslCertFile: $MYPROXYCLIENT_UNITTEST_DIR/proxy.crt 
     40sslKeyFile: $MYPROXYCLIENT_UNITTEST_DIR/proxy.key 
    4341passphrase: testpassword 
    4442newPassphrase: testpassword2 
    45 ownerPassphrase: testpassword 
     43sslKeyFilePassphrase: testpassword 
    4644 
    4745[test05Destroy] 
    4846username: testuser 
    49 ownerCertFile: $MYPROXYCLIENT_UNITTEST_DIR/proxy.crt 
    50 ownerKeyFile: $MYPROXYCLIENT_UNITTEST_DIR/proxy.key 
    51 ownerPassphrase: testpassword 
     47sslCertFile: $MYPROXYCLIENT_UNITTEST_DIR/proxy.crt 
     48sslKeyFile: $MYPROXYCLIENT_UNITTEST_DIR/proxy.key 
     49sslKeyFilePassphrase: testpassword 
     50 
     51[test07Put] 
     52username: proxytestuser 
     53passphrase: proxypassword 
     54userCertFile: $MYPROXYCLIENT_UNITTEST_DIR/testuser.crt 
     55userKeyFile: $MYPROXYCLIENT_UNITTEST_DIR/testuser.key 
     56sslCertFile: $MYPROXYCLIENT_UNITTEST_DIR/testuser.crt 
     57sslKeyFile: $MYPROXYCLIENT_UNITTEST_DIR/testuser.key 
     58sslKeyFilePassphrase: testpassword 
  • TI12-security/trunk/MyProxyClient/myproxy/test/proxy.crt

    r6837 r6840  
    11-----BEGIN CERTIFICATE----- 
    2 MIICfTCCAeagAwIBAgIEeVU+zzANBgkqhkiG9w0BAQUFADAlMRAwDgYDVQQKEwdH 
    3 YWJyaWVsMREwDwYDVQQDEwh0ZXN0dXNlcjAeFw0xMDA0MjExNTMxMjVaFw0xMDA0 
    4 MjIwOTM2MjVaMDoxEDAOBgNVBAoTB0dhYnJpZWwxETAPBgNVBAMTCHRlc3R1c2Vy 
    5 MRMwEQYDVQQDEwoyMDM1NjI5Nzc1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB 
    6 CgKCAQEA3xsYzad74OW10LnCPO+DRZDbhin7/L1E8XKdPKrmau0Gt1HrpEiXsAa4 
    7 WwhdCJZ/i/eDwRCNQDvcqQ6O4fBpyl3pk3LOjZOHsZir1ya8pODOjhfQI4hRY1Da 
    8 R7PIh2woa13qFj0lTlaeYMEtxcC6Mp1q/wdnAzIJtQgXlVlPfB4cnQBFp8q5+8RO 
    9 ZGe8ie2yHT9mo02ymoKwtWHUJbhLc7LFkV1D9/GdtmfrfyOd8oOleGM9p29omtA8 
    10 0qnnaj2oqr5XvEFu3ThxSC0Y3QI16QKJCdK+0PyEtj5NZ3OqtYK+GnkgLftKfjUL 
    11 1c078kBWkcwS042lIMhmgAjM0hD7ZwIDAQABoyEwHzAdBggrBgEFBQcBDgEB/wQO 
    12 MAwwCgYIKwYBBQUHFQEwDQYJKoZIhvcNAQEFBQADgYEAlyn+pgDT0AuKZpBRdLLN 
    13 lbNBVlVrOz1tBvBpyuuzhuS8GpAO7AJb8FuvyWNqXPSjSXzzm6CDFX0pXKuaA0VM 
    14 QZ/gG61o1ky2xhbJfgMxousIyu32YlPfUrmv5xM7pgl3NCuK67fJMC13hjq+RkT1 
    15 wDMNhY1ngTo1sxV8UnKjcx0= 
     2MIIDfTCCAuagAwIBAgIEVu1r4TANBgkqhkiG9w0BAQUFADAlMRAwDgYDVQQKEwdH 
     3YWJyaWVsMREwDwYDVQQDEwh0ZXN0dXNlcjAeFw0xMDA0MjIxMTI3MjNaFw0xMDA0 
     4MjMwNTMyMjNaMDoxEDAOBgNVBAoTB0dhYnJpZWwxETAPBgNVBAMTCHRlc3R1c2Vy 
     5MRMwEQYDVQQDEwoxNDU4NDAwMjI1MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC 
     6CgKCAgEAocqzpomfIySbinA99pxwS5xcGAIbh9OUoZsxk3BNm4ECImacUdfV3xLF 
     7g10hjOUVzA7TQJ4avOHhf8xmmGBczQw92u/eMzrHJq398MqHjjCyqhXW9A9aINeR 
     88gdPRV8ccCLoLJMI8fGdCjr+rWhC8MK6XJa0VtTzy56Yk3tXt1imXyFGJAbkZMz4 
     9nofmUOVfBv6MVqSB+IL1kVJu3K19DOGMXBEFiJZdSHGER8MOuZeQxfibGAWdLMV9 
     10i13sz3tAIpjh4ztGFeMjX0s9bvLeAPRMsIM84PdxzUTRNGvZGOuTTn+cA0ZCespY 
     11FKOewP5mnkCjUM9MOeuQMv6M9wloGoVIGPUvx38Xt0pL4Ku+TD4fVyWLfkN+XnfL 
     12CXpWl9+SIjEiA3VN/MTgDsLCM4lfoHZohVJEE9K61FKxNP2lLTlh+t6FEzLxcCPD 
     13b6RMFaGb0pHxWDwp9NXYJuHMzUH21OmckMTzXgGU/tgtm/Q+ssIdGr/h0YpzzWK0 
     14LMg2oM8Z2YGpHryN7xYXWdxqkI6fv7a7tyW1Dh2460OyyoPY7fB5lDkskAm9eiEw 
     15raqbN7iGC57gUVaZbsp9Y3xqZThJBDlrwN/KRa0VmHWuxpseeaGm2sE85UNMwYnS 
     16smnbUbw3SMz8rETgMqHqrtwHkdc3+YJV86xVRGZWDItEclBO8TkCAwEAAaMhMB8w 
     17HQYIKwYBBQUHAQ4BAf8EDjAMMAoGCCsGAQUFBxUBMA0GCSqGSIb3DQEBBQUAA4GB 
     18AMl7p7tyPuzYHtwRI86UrpuBZydPhaPFH2LFWHWW3mmBLnoWH2dhTLdPpsfn6W4G 
     19/iCZZGf09zR/VgVZvqAuLZagMTY4hn2GGjbOgfF/+pt+4GUGBoJMyX0tG/ksh3T5 
     20+009F3GkkP/9WwGjM7QCIoaaJbCsT41iw8h+dPwHHNdi 
    1621-----END CERTIFICATE----- 
    1722-----BEGIN CERTIFICATE----- 
  • TI12-security/trunk/MyProxyClient/myproxy/test/proxy.key

    r6837 r6840  
    11-----BEGIN RSA PRIVATE KEY----- 
    2 MIIEpQIBAAKCAQEA3xsYzad74OW10LnCPO+DRZDbhin7/L1E8XKdPKrmau0Gt1Hr 
    3 pEiXsAa4WwhdCJZ/i/eDwRCNQDvcqQ6O4fBpyl3pk3LOjZOHsZir1ya8pODOjhfQ 
    4 I4hRY1DaR7PIh2woa13qFj0lTlaeYMEtxcC6Mp1q/wdnAzIJtQgXlVlPfB4cnQBF 
    5 p8q5+8ROZGe8ie2yHT9mo02ymoKwtWHUJbhLc7LFkV1D9/GdtmfrfyOd8oOleGM9 
    6 p29omtA80qnnaj2oqr5XvEFu3ThxSC0Y3QI16QKJCdK+0PyEtj5NZ3OqtYK+Gnkg 
    7 LftKfjUL1c078kBWkcwS042lIMhmgAjM0hD7ZwIDAQABAoIBAQDMuCiCTPS24RF8 
    8 fXdmQsDJzKoi6dN3jpT8mJb/XDIiW2yWOm1nSdUmiIQRxBLaFn7jCDO1rGJwVn2c 
    9 AufJGrl4H8R8sBQohP82T0kfG0RuZnoimGc8s5E6+K3SrX2MBgrwujRaQ7E/uOuL 
    10 DLfbhYVVfGz5puk3XWra2poJSPJOh/vigFF9mrKUSMNHr9wfRr9nPCMBLv7MUkwW 
    11 OsrFCEQpm75myJT82mWiGaKrSz8y4rvrPq2XhalnJ0DeeXFB3wU+h90McG3tL1PT 
    12 2cKoPfU9yYtTBgxJHwFnrjS87jg8RgExm9PX03VPzErXjHbTpl3z9PGU2asNhCOv 
    13 +Qjsj/jBAoGBAPnhuzgJqnYEWDzs6D3QM3EorD4I2lhi+6cURqD6C0AbFyQjvXqG 
    14 3+mD46Vn9Vdymzcf8pXtT0QHmrfZWBoRB/SeuhOr6YblQdH9YaNSXojtixp0S4O5 
    15 oYDjRiwKpny0oB4c71QXPezoMNELdhb5x8HoZKvBRW8TOFTID029yE3TAoGBAOSR 
    16 iHekrljQLNyk0DnVZymRQIdkmW1gWyvr7q8rdWzxaxEE+VamO8CtQhUYyk9cuD8m 
    17 +r/P+cquLcEpKJhpP8DuOte2g5cPtlHnMNnCoAIkCFYLUpU9ynhNO4I0bq+cSnkQ 
    18 3Fwy6DhquW5efNFCltDUO/Ucp8Xo2ot8Y+sDbBudAoGBAOCEzxgxryStEK9lWeK4 
    19 YJBLMD/o6m7COUTNNgzLvjISZT+GkWg3KZcCdxeWid3Rzt6/6NKHUFJa1sxcEAoT 
    20 xWco+x5Tt9cJxJMuLH13tBMqBHN3jKZFs3RAQTuvMhoYnUmRTATtgSmNEtexiaBp 
    21 O+/hpBqi5IVB6rpaq015uTEbAoGBAODjmGQvsiNMYHeP6hidMe2iLt2IS7VkUxA6 
    22 CRRtLBJOzstmG3X4BV6kmhpr09KWJeptDdZgaSPUkMw3FOww0jufqmHIAF1HZlnb 
    23 oSMA7bJthY4zgcO5klcflmeb8zPyEQxhXI+Svw2TZHOFoEW8wOsjhwK6eRCu9Si8 
    24 8QqwyVO5AoGAf6j/gey0WC0iOKfqCyMLdNo+M89ZVn4IFkhfoi6DwCK267cijame 
    25 DcLmr0Za8pGkCIxPlOk7Pogjpd1nPNqhjJp0xZlLMZE+e1/T6OMPE4rFvZBwekC7 
    26 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 
    2751-----END RSA PRIVATE KEY----- 
  • TI12-security/trunk/MyProxyClient/myproxy/test/test_myproxyclient.py

    r6837 r6840  
    6767                                                "pass-phrase: ") 
    6868             
    69         ownerPassphrase = thisSection.get('ownerPassphrase') 
    70         if ownerPassphrase is None: 
    71             ownerPassphrase = getpass.getpass(prompt="\ntest1Store credential " 
     69        sslKeyFilePassphrase = thisSection.get('sslKeyFilePassphrase') 
     70        if sslKeyFilePassphrase is None: 
     71            sslKeyFilePassphrase = getpass.getpass(prompt="\ntest1Store credential " 
    7272                                                     " owner pass-phrase: ") 
    7373 
    7474        certFile = path.expandvars(thisSection['signingCertFilePath']) 
    7575        keyFile = path.expandvars(thisSection['signingPriKeyFilePath']) 
    76         ownerCertFile = path.expandvars(thisSection['ownerCertFile']) 
    77         ownerKeyFile = path.expandvars(thisSection['ownerKeyFile']) 
     76        sslCertFile = path.expandvars(thisSection['sslCertFile']) 
     77        sslKeyFile = path.expandvars(thisSection['sslKeyFile']) 
    7878             
    7979        self.clnt.store(thisSection['username'], 
     
    8181                        certFile, 
    8282                        keyFile, 
    83                         ownerCertFile=ownerCertFile, 
    84                         ownerKeyFile=ownerKeyFile, 
    85                         ownerPassphrase=ownerPassphrase, 
     83                        sslCertFile=sslCertFile, 
     84                        sslKeyFile=sslKeyFile, 
     85                        sslKeyFilePassphrase=sslKeyFilePassphrase, 
    8686                        force=False) 
    8787        print("Store creds for user %s" % thisSection['username']) 
     
    109109        thisSection = self.cfg['test03Info'] 
    110110         
    111         # ownerPassphrase can be omitted from the congif file in which case 
     111        # sslKeyFilePassphrase can be omitted from the congif file in which case 
    112112        # the get call below would return None 
    113         ownerPassphrase = thisSection.get('ownerPassphrase') 
    114         if ownerPassphrase is None: 
    115             ownerPassphrase = getpass.getpass(prompt="\ntest3Info owner " 
     113        sslKeyFilePassphrase = thisSection.get('sslKeyFilePassphrase') 
     114        if sslKeyFilePassphrase is None: 
     115            sslKeyFilePassphrase = getpass.getpass(prompt="\ntest3Info owner " 
    116116                                              "credentials passphrase: ") 
    117117 
    118118        credExists, errorTxt, fields = self.clnt.info( 
    119119                                 thisSection['username'], 
    120                                  path.expandvars(thisSection['ownerCertFile']), 
    121                                  path.expandvars(thisSection['ownerKeyFile']), 
    122                                  ownerPassphrase=ownerPassphrase) 
     120                                 path.expandvars(thisSection['sslCertFile']), 
     121                                 path.expandvars(thisSection['sslKeyFile']), 
     122                                 sslKeyFilePassphrase=sslKeyFilePassphrase) 
    123123        print "test3Info... " 
    124124        print "credExists: %s" % credExists 
     
    148148                self.fail("New and confirmed new password don't match") 
    149149                 
    150         ownerPassphrase = thisSection.get('ownerPassphrase') or passphrase 
     150        sslKeyFilePassphrase = thisSection.get('sslKeyFilePassphrase') or passphrase 
    151151 
    152152        self.clnt.changePassphrase(thisSection['username'], 
    153153                               passphrase, 
    154154                               newPassphrase,  
    155                                path.expandvars(thisSection['ownerCertFile']), 
    156                                path.expandvars(thisSection['ownerKeyFile']), 
    157                                ownerPassphrase=ownerPassphrase) 
     155                               path.expandvars(thisSection['sslCertFile']), 
     156                               path.expandvars(thisSection['sslKeyFile']), 
     157                               sslKeyFilePassphrase=sslKeyFilePassphrase) 
    158158        print("Changed pass-phrase") 
    159159 
     
    162162        thisSection = self.cfg['test05Destroy'] 
    163163         
    164         ownerPassphrase = thisSection.get('ownerPassphrase') 
    165         if ownerPassphrase is None: 
    166             ownerPassphrase = getpass.getpass(prompt="\ntest5Destroy " 
     164        sslKeyFilePassphrase = thisSection.get('sslKeyFilePassphrase') 
     165        if sslKeyFilePassphrase is None: 
     166            sslKeyFilePassphrase = getpass.getpass(prompt="\ntest5Destroy " 
    167167                                              "credential owner passphrase: ") 
    168168 
    169169        self.clnt.destroy(thisSection['username'],  
    170                   ownerCertFile=path.expandvars(thisSection['ownerCertFile']), 
    171                   ownerKeyFile=path.expandvars(thisSection['ownerKeyFile']), 
    172                   ownerPassphrase=ownerPassphrase) 
     170                      sslCertFile=path.expandvars(thisSection['sslCertFile']), 
     171                      sslKeyFile=path.expandvars(thisSection['sslKeyFile']), 
     172                      sslKeyFilePassphrase=sslKeyFilePassphrase) 
    173173        print("Destroy creds for user %s" % thisSection['username']) 
    174174         
     
    189189                self.assert_(subj) 
    190190                print("Trust root certificate retrieved with DN=%s" % subj) 
    191                  
     191 
     192    def test07Put(self): 
     193        # Make a new credential on the server and a proxy certificate to it 
     194        thisSection = self.cfg['test07Put'] 
     195         
     196        response = self.clnt.put( 
     197                     thisSection['username'],  
     198                     thisSection['passphrase'], 
     199                     path.expandvars(thisSection['userCertFile']), 
     200                     path.expandvars(thisSection['userKeyFile']), 
     201                     sslCertFile=path.expandvars(thisSection['sslCertFile']), 
     202                     sslKeyFile=path.expandvars(thisSection['sslKeyFile']), 
     203                     sslKeyFilePassphrase=thisSection['sslKeyFilePassphrase']) 
     204         
    192205         
    193206from myproxy.utils.openssl import OpenSSLConfigError 
     
    204217            os.environ['MYPROXY_SERVER_DN'] = '/O=NDG/OU=Raphael/CN=raphael' 
    205218            os.environ['MYPROXY_SERVER_PORT'] = '20000' 
    206             client = MyProxyClient(serverCNPrefix='', 
    207                                    openSSLConfFilePath=mkPath('openssl.conf'), 
     219            client = MyProxyClient(openSSLConfFilePath=mkPath('openssl.conf'), 
    208220                                   proxyCertMaxLifetime=60000, 
    209221                                   proxyCertLifetime=30000,             
     
    218230            self.assert_(client.caCertFilePath == mkPath('ndg-test-ca.crt')) 
    219231        finally: 
    220             os.environ = environBackup 
    221              
     232            os.environ = environBackup        
    222233 
    223234    def test02SetProperties(self): 
     
    256267        self.assert_( 
    257268                client.caCertDir == mkPath('/etc/grid-security/certificates'))  
     269      
    258270                                         
    259271if __name__ == "__main__": 
  • TI12-security/trunk/MyProxyClient/myproxy/utils/__init__.py

    r6069 r6840  
    22config files. 
    33 
    4 NERC Data Grid Project 
     4NERC DataGrid Project 
    55""" 
    66__author__ = "P J Kershaw" 
     
    1010__contact__ = "Philip.Kershaw@stfc.ac.uk" 
    1111__revision__ = '$Id: $' 
     12from ConfigParser import SafeConfigParser 
     13 
     14 
     15class CaseSensitiveConfigParser(SafeConfigParser): 
     16    '''Subclass the SafeConfigParser - to preserve the original string case of  
     17    config section names 
     18    '''    
     19    def optionxform(self, optionstr): 
     20        '''Extend SafeConfigParser.optionxform to preserve case of option names 
     21        ''' 
     22        return optionstr 
Note: See TracChangeset for help on using the changeset viewer.