Changeset 2939


Ignore:
Timestamp:
09/10/07 13:31:24 (12 years ago)
Author:
pjkersha
Message:

More work on MyProxy?.CmdLineClient? but still incomplete.

ndg.security.server/ndg/security/server/conf/sessionMgrProperties.xml: fixed openSSLConfFilePath to point to local conf/ and added more defaults to make installation process easier.

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

  • MyProxyClient? added defProxyFile class var to indicate default path for proxy file and read and write methods to access it
  • switched checks for 'if ownerCertFile and ownerKeyFile' to 'if ownerCertFile' as a cert chain file can be passed containing a private key
  • MyProxyClient?._createCertRequest - only set OU and O if defaultReqDN has been set
  • CmdLineClient? - added usage strings and version info. runInfo method can pick up cert and key for default proxy file location
Location:
TI12-security/trunk/python/ndg.security.server/ndg/security/server
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/MyProxy.py

    r2937 r2939  
    2525__revision__ = '$Id$' 
    2626 
    27 import os 
     27import sys, os 
    2828import socket 
    2929from M2Crypto import X509, RSA, EVP, m2, BIO, SSL 
     
    172172                   'caCertFile') 
    173173 
     174    # Work out default location of proxy file if it exists.  This is set if a 
     175    # call has been made previously to logon / get-delegation 
     176    defProxyFile = sys.platform == 'win32' and 'proxy' or \ 
     177    sys.platform in ('linux2', 'darwin') and '/tmp/x509up_u%s'%(os.getuid()) \ 
     178    or None 
     179 
     180    @classmethod 
     181    def writeProxyFile(cls, proxyCert, proxyPriKey, userCert, filePath=None): 
     182        """Write out proxy cert to file in the same way as myproxy-logon -  
     183        proxy cert, private key, user cert.  Nb. output from logon can be 
     184        passed direct into this method 
     185         
     186        @type proxyCert: string  
     187        @param proxyCert: proxy certificate 
     188        @type proxyPriKey: string 
     189        @param proxyPriKey: private key for proxy 
     190        @type userCert: string 
     191        @param userCert: user certificate which issued the proxy 
     192        @type filePath: string 
     193        @param filePath: set to override the default filePath""" 
     194         
     195        if filePath is None: 
     196            filePath = MyProxyClient.defProxyFile 
     197             
     198        if filePath is None: 
     199            MyProxyClientError, \ 
     200                "Error setting proxy file path - invalid platform?" 
     201         
     202        outStr = proxyCert + proxyPriKey + userCert        
     203        open(MyProxyClient.defProxyFile, 'w').write(outStr) 
     204        try: 
     205            # Make sure permssions are set correctly 
     206            os.chmod(MyProxyClient.defProxyFile, 0600) 
     207        except Exception: 
     208            # Don't leave the file lying around if couldn't change it's 
     209            # permissions 
     210            os.unlink(MyProxyClient.defProxyFile) 
     211             
     212            raise MyProxyClientError, \ 
     213                'Unable to set 0600 permissions for proxy file "%s": %s' % \ 
     214                (MyProxyClient.defProxyFile, e) 
     215 
     216    @classmethod 
     217    def readProxyFile(cls, filePath=None): 
     218        """Read proxy cert file following the format used by myproxy-logon -  
     219        proxy, cert, private key, user cert. 
     220         
     221        @rtype: tuple 
     222        @return: tuple containing proxy cert, private key, user cert""" 
     223        if filePath is None: 
     224            filePath = MyProxyClient.defProxyFile 
     225                
     226        proxy = open(MyProxyClient.defProxyFile).read() 
     227         
     228        # Split certs and key into separate tuple items 
     229        return tuple(['-----BEGIN'+i for i in proxy.split('-----BEGIN')[1:]]) 
     230         
     231         
    174232    #_________________________________________________________________________             
    175233    def __init__(self, propFilePath=None, **prop): 
     
    320378        # Must be version 3 for MyProxy 
    321379        context = SSL.Context(protocol='sslv3') 
     380 
    322381        if 'caCertFile' in self.__prop: 
    323382            context.load_verify_locations(cafile=self.__prop['caCertFile']) 
    324          
    325         if ownerCertFile and ownerKeyFile: 
     383                             
     384            # Stop if peer's certificate can't be verified 
     385            context.set_allow_unknown_ca(False) 
     386        else: 
     387            context.set_allow_unknown_ca(True) 
     388             
     389        if ownerCertFile: 
    326390            try: 
    327391                context.load_cert_chain(ownerCertFile, 
     
    330394            except Exception, e: 
    331395                raise MyProxyClientError, \ 
    332                             "Error loading cert. and key for SSL connection"  
    333                              
    334             # Stop if peer's certificate can't be verified 
    335             context.set_allow_unknown_ca(False) 
     396                    "Error loading cert. and key for SSL connection: %s" % e  
    336397             
    337398            # Verify peer's certificate 
     
    391452        x509Name = X509.X509_Name() 
    392453        x509Name.CN = CN 
    393         x509Name.OU = defaultReqDN['OU'] 
    394         x509Name.O = defaultReqDN['O'] 
     454         
     455        if defaultReqDN: 
     456            x509Name.OU = defaultReqDN['OU'] 
     457            x509Name.O = defaultReqDN['O'] 
    395458                         
    396459        req.set_subject_name(x509Name) 
     
    510573        """ 
    511574        globusLoc = os.environ.get('GLOBUS_LOCATION') 
    512 #        if not ownerCertFile or not ownerKeyFile: 
    513 #            if globusLoc: 
    514 #                ownerCertFile = os.path.join(globusLoc,  
    515 #                                         *MyProxyClient._hostCertSubDirPath) 
    516 #                ownerKeyFile = os.path.join(globusLoc,  
    517 #                                         *MyProxyClient._hostKeySubDirPath) 
    518 #            else: 
    519 #                raise MyProxyClientError, \ 
    520 #            "No client authentication cert. and private key file were given" 
     575        if not ownerCertFile: 
     576            if globusLoc: 
     577                ownerCertFile = os.path.join(globusLoc,  
     578                                         *MyProxyClient._hostCertSubDirPath) 
     579                ownerKeyFile = os.path.join(globusLoc,  
     580                                         *MyProxyClient._hostKeySubDirPath) 
     581            else: 
     582                raise MyProxyClientError, \ 
     583            "No client authentication cert. and private key file were given" 
    521584 
    522585        # Set-up SSL connection 
     
    854917#_____________________________________________________________________________    
    855918def main(): 
    856      
     919    import traceback 
    857920    import pdb;pdb.set_trace() 
    858921    try: 
    859922        CmdLineClient()             
    860     except Exception,e: 
     923    except Exception, e: 
    861924        print "Error: ", e 
     925        print traceback.print_exc() 
    862926        sys.exit(1) 
    863927 
     
    868932#  help="change pass-phrase protecting credential") 
    869933 
    870 import sys 
    871934import optparse 
    872935import getpass 
     
    879942    supports the same options as the Globus myproxy-* client commands""" 
    880943     
    881     run = {'info': 'runInfo',  
    882            'logon': 'runLogon', 
    883            'get-delegation': 'runGetDelegation', 
    884            'destroy': 'runDestroy',  
    885            'change-pass': 'runChangePassphrase', 
    886            'store': 'runStore'} 
    887  
    888     initOpts = {'info': '_addInfoOpts',  
    889             'logon': '_addLogonOpts', 
    890             'get-delegation': '_addGetDelegationOpts', 
    891             'destroy': '_addDestroyOpts',  
    892             'change-pass': '_addChangePassphraseOpts', 
    893             'store': '_addStoreOpts'} 
    894      
    895     usage = "usage: %prog" + " [%s] arg1 arg2" % '|'.join(run.keys()) 
    896      
     944    run = { 
     945        'info': 'runInfo',  
     946        'logon': 'runLogon', 
     947        'get-delegation': 'runGetDelegation', 
     948        'destroy': 'runDestroy',  
     949        'change-pass': 'runChangePassphrase', 
     950        'store': 'runStore' 
     951    } 
     952 
     953    initOpts = { 
     954        'info': '_addInfoOpts',  
     955        'logon': '_addLogonOpts', 
     956        'get-delegation': '_addGetDelegationOpts', 
     957        'destroy': '_addDestroyOpts',  
     958        'change-pass': '_addChangePassphraseOpts', 
     959        'store': '_addStoreOpts' 
     960    } 
     961 
     962    cmdUsage = { 
     963        'info': "usage: %prog info arg1 arg2",  
     964        'logon': "usage: %prog logon arg1 arg2", 
     965        'get-delegation': "usage: %prog get-delegation arg1 arg2", 
     966        'destroy': "usage: %prog destroy arg1 arg2",  
     967        'change-pass': "usage: %prog change-pass arg1 arg2", 
     968        'store': "usage: %prog store arg1 arg2" 
     969    } 
     970     
     971    # Keep '%prog' in a separate string otherwise it confuses the % operator 
     972    usage = "usage: %prog" + " [%s] arg1 arg2" % '|'.join(run.keys())     
     973    version = "%prog 0.8.5" 
     974         
    897975    def __init__(self): 
    898976        """Parse the command line and run the appropriate command""" 
    899  
    900         self.parser = optparse.OptionParser(usage=self.__class__.usage) 
     977         
     978        self.parser = optparse.OptionParser(usage=self.__class__.usage, 
     979                                            version=self.__class__.version) 
    901980 
    902981        # Get command - expected to be 1st arg 
     
    907986        else: 
    908987            self.parser.error('No command option set') 
    909                  
     988 
     989        # Ammend usage string for specific command 
     990        self.parser.set_usage(self.__class__.cmdUsage[cmd]) 
     991         
    910992        # Add options based on the command set 
    911993        self._addGenericOpts() 
     
    9651047defaults to $GLOBUS_LOCATION/etc/hostcert.pem.""") 
    9661048         
    967         self.parser.add_option("-K",  
     1049        self.parser.add_option("-Y",  
    9681050                          "--owner-keyfile",  
    9691051                          dest="ownerKeyFile",  
     
    10021084    def _addGetDelegationOpts(self): 
    10031085        """Add command line options for Get Delegation""" 
    1004         self._addGenericOpts() 
    10051086        self._addLogonOpts() 
    10061087 
     
    10481129stored is set as the owner.""") 
    10491130         
    1050         self.parser.add_option("-K",  
     1131        self.parser.add_option("-Y",  
    10511132                          "--owner-keyfile",  
    10521133                          dest="ownerKeyFile",  
     
    10701151                               help=\ 
    10711152            "Lifetime of proxies delegated by the server (default 12 hours)") 
    1072      
     1153 
    10731154    def runGetDelegation(self): 
    10741155        """Call MyProxyClient.getDelegation""" 
     
    10771158    def runLogon(self): 
    10781159        """Call MyProxyClient.logon""" 
    1079         outfile = self.opts.outfile 
    1080         if not outfile: 
    1081             if sys.platform == 'win32': 
    1082                 outfile = 'proxy' 
    1083             elif sys.platform in ('linux2', 'darwin'): 
    1084                 outfile = '/tmp/x509up_u%s' % (os.getuid()) 
     1160        outfile = self.opts.outfile or MyProxyClient.defProxyFile 
    10851161     
    10861162        # Get MyProxy password 
     
    10881164             
    10891165        # Retrieve proxy cert 
    1090         creds = self.myProxy.logon(username,  
     1166        creds = self.myProxy.logon(self.opts.username,  
    10911167                                   passphrase,  
    10921168                                   lifetime=self.opts.lifetime) 
    1093         open(outfile, 'w').write(''.join(creds)) 
    1094         try: 
    1095             # Make sure permssions are set correctly 
    1096             os.chmod(outfile, 600) 
    1097         except Exception: 
    1098             # Don't leave the file lying around if couldn't change it's 
    1099             # permissions 
    1100             os.unlink(outfile) 
    1101              
    1102             raise CmdLineClientError, \ 
    1103                 'Unable to set 0600 permissions for proxy file "%s"'%outfile 
     1169        MyProxyClient.writeProxyFile(*creds) 
    11041170             
    11051171        print "A proxy has been received for user %s in %s." % \ 
    1106             (username, outfile) 
     1172            (self.opts.username, outfile) 
    11071173             
    11081174    def runChangePassphrase(self): 
     
    11291195    def runInfo(self): 
    11301196        """Call MyProxyClient.info""" 
     1197        if not self.opts.ownerCertFile or not self.opts.ownerKeyFile: 
     1198#            self.opts.ownerCertFile = MyProxyClient.defProxyFile 
     1199            # Look for proxy file stored from previous call to logon/ 
     1200            # get-delegation 
     1201            try: 
     1202                creds = MyProxyClient.readProxyFile() 
     1203             
     1204                # Copy proxy and user certificates 
     1205                self.opts.ownerCertFile = './proxy-cert.pem' 
     1206                self.opts.ownerKeyFile = './proxy-key.pem' 
     1207                open(self.opts.ownerCertFile, 'w').write(creds[0] + ''.join(creds[2:])) 
     1208                open(self.opts.ownerKeyFile, 'w').write(creds[1]) 
     1209            except IOError: 
     1210                # No such file - try proceeding regardless 
     1211                pass 
     1212             
    11311213        credExists, errorTxt, fields = self.myProxy.info(self.opts.username,  
    11321214                             ownerCertFile=self.opts.ownerCertFile, 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/conf/sessionMgrProperties.xml

    r2827 r2939  
    33    <portNum></portNum> 
    44    <useSSL>Yes</useSSL> <!-- leave blank to use http --> 
    5     <sslCertFile></sslCertFile> 
    6     <sslKeyFile></sslKeyFile> 
     5    <sslCertFile>$NDGSEC_DIR/conf/certs/hostcert.pem</sslCertFile> 
     6    <sslKeyFile>$NDGSEC_DIR/conf/certs/hostkey.pem</sslKeyFile> 
    77    <!-- 
    88    PKI settings for signature of outbound SOAP messages 
    99    --> 
    1010    <useSignatureHandler>Yes</useSignatureHandler> <!-- leave blank for no signature --> 
    11     <certFile></certFile> 
    12     <keyFile></keyFile> 
     11    <certFile>$NDGSEC_DIR/conf/certs/sm-cert.pem</certFile> 
     12    <keyFile>$NDGSEC_DIR/conf/certs/sm-key.pem</keyFile> 
    1313    <keyPwd></keyPwd> 
    14     <caCertFile></caCertFile> 
     14    <caCertFile>$NDGSEC_DIR/conf/certs/cacert.pem</caCertFile> 
    1515    <!--  
    1616    Set the certificate used to verify the signature of messages from the  
     
    5252                but the settings can be independent of any Globus installation 
    5353                --> 
    54                 <openSSLConfFilePath>$GLOBUS_LOCATION/etc/globus-user-ssl.conf</openSSLConfFilePath> 
     54                <openSSLConfFilePath>$NDGSEC_DIR/conf/openssl.conf</openSSLConfFilePath> 
    5555                <tmpDir>/tmp</tmpDir> 
    5656                <!--  
     
    5858                        specified when a certificate is first created by store() method 
    5959                --> 
    60                 <proxyCertMaxLifetime></proxyCertMaxLifetime> <!-- in hours --> 
     60                <proxyCertMaxLifetime>12</proxyCertMaxLifetime> <!-- in hours --> 
    6161                <!--  
    6262                        Life time of a proxy certificate when issued from the Proxy Server  
    6363                        with getDelegation() method 
    6464                        --> 
    65                 <proxyCertLifetime></proxyCertLifetime> <!-- in hours --> 
    66                 <caCertFile></caCertFile> 
     65                <proxyCertLifetime>8</proxyCertLifetime> <!-- in hours --> 
     66                <caCertFile>$NDGSEC_DIR/conf/certs/cacert.pem</caCertFile> 
    6767        </myProxyProp> 
    6868        <simpleCACltProp> 
Note: See TracChangeset for help on using the changeset viewer.