Changeset 6847 for TI12-security/trunk


Ignore:
Timestamp:
27/04/10 11:43:06 (10 years ago)
Author:
pjkersha
Message:

Fix for SSL verification DN and hostname settings. Re-release as 1.0

Location:
TI12-security/trunk/MyProxyClient
Files:
1 added
56 deleted
4 edited

Legend:

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

    r6844 r6847  
    5353    PARSER_RE_STR = '/(%s)=' % '|'.join(DN_LUT.keys() + DN_LUT.values()) 
    5454    PARSER_RE = re.compile(PARSER_RE_STR)     
    55      
    56     def __init__(self, myProxyServerDN=os.environ.get('MYPROXY_SERVER_DN')): 
    57         """Override parent class __init__ to enable setting of myProxyServerDN 
     55         
     56    SERVER_CN_PREFIX = 'host/' 
     57 
     58    __slots__ = ('__hostname', '__cnPrefix', '__certDN') 
     59     
     60    def __init__(self,  
     61                 certDN=None, 
     62                 hostname=None, 
     63                 cnPrefix=SERVER_CN_PREFIX): 
     64        """Override parent class __init__ to enable setting of certDN 
    5865        setting 
    5966         
    60         @type myProxyServerDN: string 
    61         @param myProxyServerDN: Set the expected Distinguished Name of the 
     67        @type certDN: string 
     68        @param certDN: Set the expected Distinguished Name of the 
    6269        MyProxy server to avoid errors matching hostnames.  This is useful 
    6370        where the hostname is not fully qualified 
    6471        """ 
    65          
    66         # Allow for quoted DN 
    67         myProxyServerDN = myProxyServerDN.strip('"') 
    68          
    69         dnFields = self.__class__.PARSER_RE.split(myProxyServerDN) 
    70         if len(dnFields) < 2: 
    71             raise MyProxyClientError('Error parsing DN string: "%s"' %  
    72                                      myProxyServerDN) 
    73  
    74         self.myProxyServerDN = zip(dnFields[1::2], dnFields[2::2]) 
    75         self.myProxyServerDN.sort()         
     72        self.__cnPrefix = None 
     73        self.__certDN = None 
     74        self.__hostname = None 
     75         
     76        if certDN is not None: 
     77            self.certDN = certDN 
     78             
     79        if hostname is not None: 
     80            self.hostname = hostname 
     81             
     82        self.cnPrefix = cnPrefix 
    7683         
    7784    def __call__(self, connection, peerCert, errorStatus, errorDepth,  
     
    95102        if peerCert.has_expired(): 
    96103            # Any expired certificate in the chain should result in an error 
    97             if log.getEffectiveLevel() == logging.DEBUG: 
    98                 log.debug('Certificate %r in peer certificate chain has ', 
    99                           'expired', peerCert.get_subject()) 
     104            log.error('Certificate %r in peer certificate chain has expired',  
     105                      peerCert.get_subject()) 
    100106                 
    101107            return errorStatus 
    102108             
    103109        elif errorDepth == 0: 
    104             # Only interested in DN of last certificate in the chain - this must  
     110            # Only interested in DN of last certificate in the chain - this must 
    105111            # match the expected MyProxy Server DN setting 
    106             peerCertDN = peerCert.get_subject().get_components() 
     112            peerCertSubj = peerCert.get_subject() 
     113            peerCertDN = peerCertSubj.get_components() 
    107114            peerCertDN.sort() 
    108115 
    109             if peerCertDN == self.myProxyServerDN: 
    110                 return successStatus 
     116            if self.certDN is None: 
     117                # Check hostname against peer certificate CN field instead: 
     118                if self.hostname is None: 
     119                    log.error('No "hostname" or "certDN" set to check peer ' 
     120                              'certificate against') 
     121                    return errorStatus 
     122                     
     123                cn = self.cnPrefix + self.hostname 
     124                if peerCertSubj.commonName == cn: 
     125                    return successStatus 
     126                else: 
     127                    log.error('Peer certificate CN %r doesn\'t match the ' 
     128                              'expected CN %r', peerCertSubj.commonName, cn) 
     129                    return errorStatus 
    111130            else: 
    112                 return errorStatus 
     131                if peerCertDN == self.certDN: 
     132                    return successStatus 
     133                else: 
     134                    log.error('Peer certificate DN %r doesn\'t match the ' 
     135                              'expected DN %r', peerCertDN, self.certDN) 
     136                    return errorStatus 
    113137        else: 
    114138            return successStatus 
    115              
     139              
     140    def _getCertDN(self): 
     141        return self.__certDN 
     142     
     143    def _setCertDN(self, val): 
     144        if isinstance(val, basestring): 
     145            # Allow for quoted DN 
     146            certDN = val.strip('"') 
     147             
     148            dnFields = self.__class__.PARSER_RE.split(certDN) 
     149            if len(dnFields) < 2: 
     150                raise TypeError('Error parsing DN string: "%s"' % certDN) 
     151     
     152            self.__certDN = zip(dnFields[1::2], dnFields[2::2]) 
     153            self.__certDN.sort() 
     154             
     155        elif not isinstance(val, list): 
     156            for i in val: 
     157                if not len(i) == 2: 
     158                    raise TypeError('Expecting list of two element DN field, ' 
     159                                    'DN field value pairs for "certDN" ' 
     160                                    'attribute') 
     161            self.__certDN = val 
     162        else: 
     163            raise TypeError('Expecting list or string type for "certDN" ' 
     164                            'attribute') 
     165         
     166    certDN = property(fget=_getCertDN, 
     167                      fset=_setCertDN, 
     168                      doc="Distinguished Name for MyProxy Server Certificate") 
     169         
     170    # Get/Set Property methods 
     171    def _getHostname(self): 
     172        return self.__hostname 
     173     
     174    def _setHostname(self, val): 
     175        if not isinstance(val, basestring): 
     176            raise TypeError("Expecting string type for hostname " 
     177                                 "attribute") 
     178        self.__hostname = val 
     179         
     180    hostname = property(fget=_getHostname, 
     181                        fset=_setHostname, 
     182                        doc="hostname of MyProxy server") 
     183     
     184    def _getCNPrefix(self): 
     185        """References SSL Certificate verification object property!""" 
     186        return self.__cnPrefix 
     187     
     188    def _setCNPrefix(self, val): 
     189        """Sets SSL Certificate verification object property!""" 
     190        if not isinstance(val, basestring): 
     191            raise TypeError("Expecting string type for hostname " 
     192                                 "attribute") 
     193        self.__cnPrefix = val 
     194     
     195    cnPrefix = property(fget=_getCNPrefix, 
     196                        fset=_setCNPrefix, 
     197                        doc="Prefix for MyProxy Server Certificate " 
     198                            "Distinguished Name CommonName field; usually set " 
     199                            "to 'host/' for Globus host certificates") 
     200                     
    116201     
    117202class MyProxyClientError(Exception): 
     
    147232     
    148233    http://grid.ncsa.uiuc.edu/myproxy/protocol/ 
     234 
     235    @type MYPROXY_SERVER_ENVVARNAME: string 
     236    @cvar MYPROXY_SERVER_ENVVARNAME: server environment variable name 
     237     
     238    @type MYPROXY_SERVER_PORT_ENVVARNAME: string 
     239    @cvar MYPROXY_SERVER_PORT_ENVVARNAME: port environment variable name 
     240     
     241    @type MYPROXY_SERVER_DN_ENVVARNAME: string 
     242    @cvar MYPROXY_SERVER_DN_ENVVARNAME: server certificate Distinguished Name 
     243    environment variable name 
    149244     
    150245    @type GET_CMD: string 
     
    196291    file 
    197292    """ 
     293    MYPROXY_SERVER_ENVVARNAME = 'MYPROXY_SERVER' 
     294    MYPROXY_SERVER_PORT_ENVVARNAME = 'MYPROXY_SERVER_PORT' 
     295    MYPROXY_SERVER_DN_ENVVARNAME = 'MYPROXY_SERVER_DN' 
    198296       
    199297    GET_CMD="""VERSION=MYPROXYv2 
     
    262360       'hostname':              'localhost', 
    263361       'port':                  7512, 
    264        'serverDN':              '', 
     362       'serverDN':              None, 
    265363       'openSSLConfFilePath':   '', 
    266364       'proxyCertMaxLifetime':  43200, 
     
    287385        PROPERTY_DEFAULTS class variable for a list of these 
    288386        @type **prop: dict 
    289         """ 
     387        """        
     388        self.__serverSSLCertVerify = MyProxyServerSSLCertVerification() 
    290389        self.__hostname = None 
    291390        self.__port = None 
     
    300399         
    301400        self.__cfg = None 
    302          
    303401 
    304402        # Configuration file used to get default subject when generating a 
    305403        # new proxy certificate request 
    306404        self.__openSSLConfig = OpenSSLConfig() 
    307          
     405 
    308406        # Server host name - take from environment variable if available 
    309         self.hostname = os.environ.get('MYPROXY_SERVER', 
     407        self.hostname = os.environ.get(MyProxyClient.MYPROXY_SERVER_ENVVARNAME, 
    310408                                    MyProxyClient.PROPERTY_DEFAULTS['hostname']) 
    311409             
    312410        # ... and port number 
    313         self.port = int(os.environ.get('MYPROXY_SERVER_PORT',  
    314                                        MyProxyClient.PROPERTY_DEFAULTS['port'])) 
     411        self.port = int(os.environ.get( 
     412                                MyProxyClient.MYPROXY_SERVER_PORT_ENVVARNAME,  
     413                                MyProxyClient.PROPERTY_DEFAULTS['port'])) 
    315414 
    316415        # Server Distinguished Name 
    317         self.serverDN = os.environ.get('MYPROXY_SERVER_DN', 
    318                                     MyProxyClient.PROPERTY_DEFAULTS['serverDN']) 
    319          
    320         # Environment variable may be quoted 
    321         if self.serverDN: 
    322             self.serverDN = self.serverDN.strip('"') 
    323              
     416        serverDN = os.environ.get(MyProxyClient.MYPROXY_SERVER_DN_ENVVARNAME, 
     417                                  MyProxyClient.PROPERTY_DEFAULTS['serverDN']) 
     418        if serverDN is not None: 
     419            self.serverDN = serverDN 
     420         
    324421        # Any keyword settings override the defaults above 
    325422        for opt, val in prop.items(): 
     
    330427        if cfgFilePath is not None: 
    331428            self.parseConfig(cfg=cfgFilePath) 
    332              
    333         self.__serverSSLCertVerify = MyProxyServerSSLCertVerification( 
    334                                                 myProxyServerDN=self.serverDN) 
     429 
     430    def _getServerSSLCertVerify(self): 
     431        return self.__serverSSLCertVerify 
     432 
     433    serverSSLCertVerify = property(_getServerSSLCertVerify,  
     434                                   doc="Server SSL Certificate Verification " 
     435                                       "callable") 
     436 
    335437 
    336438    def _getServerSSLCertVerify(self): 
     
    372474     
    373475    def _setHostname(self, val): 
     476        """Also sets SSL Certificate verification object property!""" 
    374477        if not isinstance(val, basestring): 
    375             raise AttributeError("Expecting string type for hostname " 
     478            raise TypeError("Expecting string type for hostname " 
    376479                                 "attribute") 
    377480        self.__hostname = val 
     481        self.__serverSSLCertVerify.hostname = val 
    378482         
    379483    hostname = property(fget=_getHostname, 
     
    390494            self.__port = val 
    391495        else: 
    392             raise AttributeError("Expecting int type for port attribute") 
     496            raise TypeError("Expecting int type for port attribute") 
    393497     
    394498    port = property(fget=_getPort, 
     
    400504     
    401505    def _setServerDN(self, val): 
     506        """Also sets SSL Certificate verification object property!""" 
    402507        if not isinstance(val, basestring): 
    403             raise AttributeError("Expecting string type for serverDN " 
    404                                  "attribute") 
     508            raise TypeError("Expecting string type for serverDN attribute") 
     509         
    405510        self.__serverDN = val 
     511        self.__serverSSLCertVerify.certDN = val 
    406512     
    407513    serverDN = property(fget=_getServerDN, 
     
    410516                            "Certificate") 
    411517     
     518    def _getServerCNPrefix(self): 
     519        """References SSL Certificate verification object property!""" 
     520        return self.__serverSSLCertVerify.cnPrefix 
     521     
     522    def _setServerCNPrefix(self, val): 
     523        """Sets SSL Certificate verification object property!""" 
     524        self.__serverSSLCertVerify.cnPrefix = val 
     525     
     526    serverCNPrefix = property(fget=_getServerCNPrefix, 
     527                              fset=_setServerCNPrefix, 
     528                              doc="Prefix for MyProxy Server Certificate " 
     529                                  "Distinguished Name CoomonName field; " 
     530                                  "usually set to host/ for Globus host " 
     531                                  "certificates") 
     532         
    412533    def _getOpenSSLConfFilePath(self): 
    413534        return self.__openSSLConfFilePath 
     
    415536    def _setOpenSSLConfFilePath(self, val): 
    416537        if not isinstance(val, basestring): 
    417             raise AttributeError("Expecting string type for " 
    418                                  "openSSLConfFilePath attribute") 
     538            raise TypeError('Expecting string type for "openSSLConfFilePath" ' 
     539                            'attribute') 
     540             
    419541        self.__openSSLConfFilePath = os.path.expandvars(val) 
    420542        self.__openSSLConfig.filePath = self.__openSSLConfFilePath 
     
    435557            self.__proxyCertMaxLifetime = val 
    436558        else: 
    437             raise AttributeError("Expecting int type for proxyCertMaxLifetime " 
    438                                  "attribute") 
     559            raise TypeError("Expecting int type for proxyCertMaxLifetime " 
     560                            "attribute") 
    439561     
    440562    proxyCertMaxLifetime = property(fget=_getProxyCertMaxLifetime, 
     
    453575            self.__proxyCertLifetime = val 
    454576        else: 
    455             raise AttributeError("Expecting int type for proxyCertLifetime " 
    456                                  "attribute") 
     577            raise TypeError("Expecting int type for proxyCertLifetime " 
     578                            "attribute") 
    457579     
    458580    proxyCertLifetime = property(fget=_getProxyCertLifetime, 
     
    476598                 
    477599        elif isinstance(val, None): 
    478             raise AttributeError("Expecting string type for caCertFilePath " 
     600            raise TypeError("Expecting string type for caCertFilePath " 
    479601                                 "attribute")        
    480602         
     
    507629            self.__caCertDir = val     
    508630        else: 
    509             raise AttributeError("Expecting string or None type for caCertDir " 
    510                                  "attribute") 
     631            raise TypeError("Expecting string or None type for caCertDir " 
     632                            "attribute") 
    511633         
    512634    caCertDir = property(fget=_getCACertDir, 
  • TI12-security/trunk/MyProxyClient/myproxy/test/proxy.crt

    r6845 r6847  
    11-----BEGIN CERTIFICATE----- 
    2 MIIDfTCCAuagAwIBAgIEWHfxujANBgkqhkiG9w0BAQUFADAlMRAwDgYDVQQKEwdH 
    3 YWJyaWVsMREwDwYDVQQDEwh0ZXN0dXNlcjAeFw0xMDA0MjYxMjQ3MTlaFw0xMDA0 
    4 MjcwNjUyMTlaMDoxEDAOBgNVBAoTB0dhYnJpZWwxETAPBgNVBAMTCHRlc3R1c2Vy 
    5 MRMwEQYDVQQDEwoxNDg0MjU1Njc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC 
    6 CgKCAgEAmPMN58qjkA1CfkaJQk0Li8P5xXYLyTYqhZcu8K1Zk9/KdEUbMze7XPIW 
    7 5d/g3GwZUYlgL3XxrEDuzYUohZrLdy0+T6l9cQlZkMdEJaEykmZ3+yHnU9g8UDpC 
    8 tjX2B8NqOt/x0RDCCFe5W+02b2o88SpdnY6c9RFOkOcvQ6Ci1KVsfYV453leX3J1 
    9 ni/Jfki5KZwwJOnpJmR79XfNEB/mFRg5CMHhdCv0pcayfsWfTIVbY7xdV73s9F4y 
    10 obixDhcDQbnxJr1obHTny2KQM4H0VfEq++1lAVFQDa1TDQTezuUBXlGkfjANW0k6 
    11 +NRXj8CiS6DpLJJ2BLQ0wmLr9Xz/ZXdLvaLrZMZnpWoxFjhcmObE+tQ3iiEOc2ma 
    12 5n1j81JQNbJinV/2uOKXk0y7OwR8KIOfnomNjbVXDHWrX7NkM5L6OL2LJZGQqUxl 
    13 OUQqdbgajzX1G4KDiF19XHiGBjHVXCEibypXKpWX7noeB2sGi0ooUy1HGhvJGYIU 
    14 W3YgnQackReiuy6kMaoeLMTJGfU+NEaZa+GLA76bv7AIHAq13nxi0tigr/vWP8o7 
    15 fLt1/2VUPRGpKIriLFXTTa+W5eFYATZgNZkPUKBDSunBwzefgPj8lisoM2E1oCxT 
    16 nJLUMLaIUmPbfaYaqmN8eCytyTW2Y98BOKhhQSeGESioY/xy8LECAwEAAaMhMB8w 
     2MIIDfTCCAuagAwIBAgIEag71pjANBgkqhkiG9w0BAQUFADAlMRAwDgYDVQQKEwdH 
     3YWJyaWVsMREwDwYDVQQDEwh0ZXN0dXNlcjAeFw0xMDA0MjcxMDMxNDZaFw0xMDA0 
     4MjgwNDM2NDZaMDoxEDAOBgNVBAoTB0dhYnJpZWwxETAPBgNVBAMTCHRlc3R1c2Vy 
     5MRMwEQYDVQQDEwoxNzc5MzY1Mjg2MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC 
     6CgKCAgEAy+SoS37ti0h/6Z++8Z1eeJYrgHI49txvbgtQg0pHPfIg8x6mJO3yLlrX 
     7sDuXaWZ1hD3qoSXpZ72j+b6qIU9MsqXfrS9BMr7Yy7AXXkht1zRxkpzir2CCum/V 
     8LsWjZiGWjwYemZgSwp29l2Sw9TjTPqR9g6t2ywVpoodboC7ZGnVapDidD6z1wcvB 
     9F7bay+Ejd8HIhhqnDTfRIOuupTEH/yEiog6bSRB7N0aMAMvM8YilirgMczfVOYsI 
     10tUzVmiDZmiE8P2GpY6KjG6bD9kDk7K3gXy4cwEcnwLZzqRVzmx2aGe47krF+rIo3 
     11gVTg9GLyOw5xOGHbA4S5FrlqTaowj0lmpq6/YqZVlucOVeqnQN30fDXRR1i6Ubca 
     12DDEOj3dR8roPEyh/XNh9BgiMUrWgJhQTmhwMksboQt8KcyrHCFN3X6X1lZc+613y 
     133GGn10r29zcOUgaqImo645rqf3ZgdqHa0R1562Yij3PYnSk5ZvGpAfGzC6IRDgL3 
     14Hh97zkyLlvv2Mc6EJXmmzSYx4bTk7hko+f38G9iMZa91d2job+8vxrvhy8CPeK/n 
     15rR9Db5gMBl3C9jrYh7GAE5gUkb/Qc3d8NfpST6mlDY6QLrhqAC//A2vy3Ws53wWW 
     16oK4CGmnQiPCEvIUbbYUq5P56qAYgqoAff6r1s7+qm0MZ/DTlTAkCAwEAAaMhMB8w 
    1717HQYIKwYBBQUHAQ4BAf8EDjAMMAoGCCsGAQUFBxUBMA0GCSqGSIb3DQEBBQUAA4GB 
    18 ACeIZAbLQ2Hm3kiI5ZQa31pnNaGeiPtf8G7OvBUpTJH3c3O946LFNZnE/2aXLfDD 
    19 sE4h8ZVE3gsUmfteEyJ9Ds17IopPGiVELaQKl/XmtXBMPS7spaR4mt1+xzyLX18Y 
    20 6v+o1OFi4frndSUXG2kr/pL6CBDeOd/2Kcb/3glfmLNF 
     18AFw2iAHstXebRxcGvB3T7E49+lkH0NQh2z6HnsiGcKJTgHWWFPozOjrtIMDfgK9E 
     19IQbwHiq1SxLNjj2mJ/a1YkDmfr2fqzaBdS+BIZH8O45v1rfBDZhDlhUrbCz7MYRN 
     20u3eGq+eF2OB2LyJrm7v8MzHDHuE8E7wdAw2FT3okNHVO 
    2121-----END CERTIFICATE----- 
    2222-----BEGIN CERTIFICATE----- 
  • TI12-security/trunk/MyProxyClient/myproxy/test/proxy.key

    r6845 r6847  
    11-----BEGIN RSA PRIVATE KEY----- 
    2 MIIJKQIBAAKCAgEAmPMN58qjkA1CfkaJQk0Li8P5xXYLyTYqhZcu8K1Zk9/KdEUb 
    3 Mze7XPIW5d/g3GwZUYlgL3XxrEDuzYUohZrLdy0+T6l9cQlZkMdEJaEykmZ3+yHn 
    4 U9g8UDpCtjX2B8NqOt/x0RDCCFe5W+02b2o88SpdnY6c9RFOkOcvQ6Ci1KVsfYV4 
    5 53leX3J1ni/Jfki5KZwwJOnpJmR79XfNEB/mFRg5CMHhdCv0pcayfsWfTIVbY7xd 
    6 V73s9F4yobixDhcDQbnxJr1obHTny2KQM4H0VfEq++1lAVFQDa1TDQTezuUBXlGk 
    7 fjANW0k6+NRXj8CiS6DpLJJ2BLQ0wmLr9Xz/ZXdLvaLrZMZnpWoxFjhcmObE+tQ3 
    8 iiEOc2ma5n1j81JQNbJinV/2uOKXk0y7OwR8KIOfnomNjbVXDHWrX7NkM5L6OL2L 
    9 JZGQqUxlOUQqdbgajzX1G4KDiF19XHiGBjHVXCEibypXKpWX7noeB2sGi0ooUy1H 
    10 GhvJGYIUW3YgnQackReiuy6kMaoeLMTJGfU+NEaZa+GLA76bv7AIHAq13nxi0tig 
    11 r/vWP8o7fLt1/2VUPRGpKIriLFXTTa+W5eFYATZgNZkPUKBDSunBwzefgPj8liso 
    12 M2E1oCxTnJLUMLaIUmPbfaYaqmN8eCytyTW2Y98BOKhhQSeGESioY/xy8LECAwEA 
    13 AQKCAgBvPNZwLkCnE/24OTS6s64iCHYv1prbzDlAz6OkB2+OzMRBq8EMjwwFnUxq 
    14 A1lW9oezdWYvHmiWDuOfNakzAlHYa19WML6650HsugAmHgbZ0wyP6SiFIk87SiQa 
    15 wUQegVFRYG5OzxFPX/2/jdZ5UZrhCx7q6D3fPqcVXA5T8RB795Pf9qLoNq0cXfKN 
    16 CdRRtDJ2wNGDB1w6P/qnnGnXwFtmHCfe5qNCCnXz238WFES3MoY1E1oP5mHfmGLa 
    17 m6ipxrLnqoRo2HiJ6Lxsf1LBI1LA7pWEhDNhsfG3AMfWQCSL9KH6Jwarf+c27Rum 
    18 vUixlDh1KKJteFe9NBLrDWbvM+nKkgJMuauAw+3TEPa7HHRdDaWZzX9WQVX+JPf1 
    19 nb4dRolWGldEvAxUHBa9sJLRIgVl2a4AvuByZqFULIelhkqd5nEwGpGYyzz4PEtW 
    20 q0UcwxP287Os59qnWQxNuVtef+ivdH3xpPGIiDG65HJiHE5gUfrKoV9vQqXJz3Nd 
    21 p6YiGZAXPJR2ndpe4zc3XfRBp8P1JK7GDUMznUhNQXQF2jVYENkenZV5Lf7iT7J2 
    22 RRKFjjywdndw72lldfgkJxEIUrUbOt+VIHpCf++Nq9KzIKUMX9Tbt6p+JIteKfe3 
    23 iI2jIXkyH0B6bjO64rkC4iT0zQRnJoM8zZDvIMhXL506tHIgAQKCAQEAylaPQ6np 
    24 3qlrQn5SqTsFR9SZgjJNkP7Ogh2AIIVws8ZssrD2LLYoybA18pF/J/UpuQo68xl/ 
    25 YqRnR+S5RP+9O+XEOl1DlIHBiJ66U4+IaEuXCbN8tP1HFM9TkDmirDb0IxjVFfMQ 
    26 xFh38OXcssaNedz9/MiDyrBEybNC91UET3Okz8sk5YzpVwQtnNUnRsHf8HQoIqt/ 
    27 jHVBW4lpJRJ9ncTHQ4K11ZTZx+pVBKkeH/cl+lKrm9gqPFj/sjym0AqIiogsGMnt 
    28 pgmBkURJo7EXJnR9u4NKQYQ4aqYVrd1tfy4O90qTvYxtzqbnX/1M3yNEnu4KYZBO 
    29 F4veLyyB4/334QKCAQEAwYNTAILoC6virgw+QcrnOYWF6Xl8fqLwd9PhIhHXEXvL 
    30 up3OoGI/nfVnzAYlywwm7YnRV+Lns0TDLnxkL77B3wilmqFcdnQIMsi22RTpUJP2 
    31 17mrB5NoR0kGYojuPwcUDJMQkX7BFJDTp/+sJQp43tfwwI2fVCnddRuBBNVXPBbf 
    32 UoVqiD9ufh9EkE0mhYzudQ+jJ5P5lJFXAWOXEEmmcY9Eb3SmLCRD0Ij7EsoSre8v 
    33 vM5T0fAHmk6YadxE5B1b4hi+/sU94n8mGB93wVjRFwPdluIQqLVCAKLy6b+dlN6V 
    34 ck9LG5xd+bNrW6SW4adhXIysxLkTy1x3QANC2WXS0QKCAQBBn1cxg7701w+RbjTS 
    35 6/Bnfn0W68eaWfmR2419fqmxtI32WkxM7ftGhl7IwAV0aR/SAo5h34gf7uAMQhMQ 
    36 XLz72yYMI8lSNc8Vxxz5EtkTskhW/h5Y+Lf/+MnKQdcPcXc2lswtJTrv4x1rRLGS 
    37 TbD+r/yz6jhMGWUF4Zy7aJhQSFpQhjr+M/hNn25Hqh3l5eUCMDoAHIzueezriiJO 
    38 wrN44qQZsh/VGESVgNt3+n1pspdfm0ZK8g2oqtiq7t7PJEtqWoWquHrZ2cVq3rHf 
    39 ZAT1FNzeXtNLcl11wU3QqLrlf4OdElPeKthGKH1r9VPkHqUXwm4dfFbHbjZuKEos 
    40 LmchAoIBAQC/kS/j+7OXiktXHYusOh95FDOjE78o5kjDdx8SSTLtfe4LChn5MAnm 
    41 Z4Cfux5Cyf7nfF2fcWMKVvIZ3M6ZbXAjST4Xu9H6+Zb8HzLT6B2oxTHCEW28jDLZ 
    42 DvOhLAken/U7FYN7ZU3i/BRr5XEXIizR/le5ZvnpqaAwRFAO5tv7AnGGEcmKo7DQ 
    43 bkfDynxuDTwq6pYLojOa3d6R43MyjpaVKM0IwSOX4za3BEP5L84aHgTWFjNoSwRb 
    44 v56mfYY9hMrnIrRBJiXDSTf+/XfiEfi7nfoJWjY/rWBvnOB4glaPf2HWzaR+6ucl 
    45 QHbxPBiZvsdlhWWrQcTUtu7ekdvltyVhAoIBAQCFbopr/91+SlKqMMM6HPS5q8nh 
    46 eyQqh9szqcLVk1XiAWDZ0wjAsPzjlvx7npvVraZN5EdWS7xoXYl3YeY0HK3uoKis 
    47 Q+Mk01gaOLIBNnC8qj+9ztAgrq21W5KOa+5S1xAX7lDOET+i78gNaJfzwlbaD3s9 
    48 7ysptiK79t1pGurIjBrNqgi/OrLIHKeE9PBU+zcicpxZCg8G6W7XGfA/fMK/KWsF 
    49 TSJwMpkt/DL5i6BY1Ib2aWcf0x5mNiDdJrCEj5AptOzDYsDbhqyAG971Yv/yFSOQ 
    50 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 
    5151-----END RSA PRIVATE KEY----- 
  • TI12-security/trunk/MyProxyClient/myproxy/test/test_myproxyclient.py

    r6844 r6847  
    195195class MyProxyClientInterfaceTestCase(_MyProxyClientTestCase): 
    196196    '''Test interface for correct getting/setting of attributes''' 
     197    HOSTCERT_FILENAME = 'localhost.crt' 
     198    HOSTCERT_FILEPATH = mkPath(HOSTCERT_FILENAME) 
     199    HOSTCERT_DN = '/C=UK/ST=Oxfordshire/O=BADC/OU=Security/CN=localhost' 
    197200     
    198201    def test01EnvironmentVarsSet(self): 
     
    226229            self.fail("Expecting AttributeError raised from port set to " 
    227230                      "invalid type") 
    228         except AttributeError: 
     231        except TypeError: 
    229232            pass 
    230233 
     
    254257        self.assert_( 
    255258                client.caCertDir == mkPath('/etc/grid-security/certificates'))  
    256       
     259  
     260    def test03SSLVerification(self): 
     261        # SSL verification callback 
     262         
     263        # Ensure no relevant environment variables are set which might affect 
     264        # the result 
     265        try: 
     266            serverDN = os.environ.get( 
     267                                    MyProxyClient.MYPROXY_SERVER_DN_ENVVARNAME) 
     268            if serverDN is not None: 
     269                del os.environ[MyProxyClient.MYPROXY_SERVER_DN_ENVVARNAME] 
     270         
     271            client = MyProxyClient() 
     272             
     273            connection = None 
     274            errorStatus = 1 
     275            successStatus = 0 
     276            errorDepth = 0 
     277            peerCertStr = open(self.__class__.HOSTCERT_FILEPATH).read() 
     278            peerCert = crypto.load_certificate(crypto.FILETYPE_PEM, peerCertStr) 
     279             
     280            args = (connection, peerCert, errorStatus, errorDepth,  
     281                    successStatus) 
     282             
     283            # This would normally called implicitly during the SSL handshake 
     284            status = client.serverSSLCertVerify(*args) 
     285            self.assert_(status == errorStatus) 
     286             
     287            # Won't match because the default 'host/' CN prefix is set 
     288            client.hostname = 'localhost' 
     289            status = client.serverSSLCertVerify(*args) 
     290            self.assert_(status == errorStatus) 
     291             
     292            # Should now match 
     293            client.serverCNPrefix = '' 
     294            status = client.serverSSLCertVerify(*args) 
     295            self.assert_(status == successStatus) 
     296             
     297            # Match based on full DN instead - this takes precedence over 
     298            # hostname match 
     299            client.serverDN = self.__class__.HOSTCERT_DN 
     300            status = client.serverSSLCertVerify(*args) 
     301            self.assert_(status == successStatus) 
     302             
     303        finally: 
     304            if serverDN: 
     305                os.environ[MyProxyClient.MYPROXY_SERVER_DN_ENVVARNAME 
     306                           ] = serverDN 
    257307                                         
    258308if __name__ == "__main__": 
Note: See TracChangeset for help on using the changeset viewer.