Changeset 6837 for TI12-security


Ignore:
Timestamp:
21/04/10 16:40:42 (10 years ago)
Author:
pjkersha
Message:

Fixing peer cert verification

Location:
TI12-security/trunk/MyProxyClient
Files:
6 edited
2 copied

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/MyProxyClient/.pydevproject

    r6835 r6837  
    44<pydev_project> 
    55<pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH"> 
    6 <path>/MyProxyClient-pyopenssl</path> 
     6<path>/MyProxyClient</path> 
    77</pydev_pathproperty> 
    88<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.6</pydev_property> 
  • TI12-security/trunk/MyProxyClient/myproxy/client.py

    r6829 r6837  
    44 
    55Major re-write of an original class.   This updated version implements methods 
    6 with SSL calls with M2Crypto rather use calls to myproxy client executables as 
     6with SSL calls with PyOpenSSL rather use calls to myproxy client executables as 
    77in the original.  This version is adapted and extended from an original  
    88program myproxy_logon by Tom Uram <turam@mcs.anl.gov> 
     
    2626import os 
    2727import socket 
    28 from M2Crypto import X509, RSA, EVP, m2, BIO, SSL, util 
    2928import base64 
     29import re 
     30import traceback 
    3031from ConfigParser import SafeConfigParser 
     32 
     33from OpenSSL import crypto, SSL 
    3134 
    3235from myproxy.utils.openssl import OpenSSLConfig, OpenSSLConfigError 
     
    4346 
    4447 
    45 class _HostCheck(SSL.Checker.Checker): 
    46     """Override SSL.Checker.Checker to allow additional check of MyProxy  
    47     server identity.  If hostname doesn't match, allow match of host's   
    48     Distinguished Name against MYPROXY_SERVER_DN setting""" 
    49  
     48class MyProxyServerSSLCertVerification(object): 
     49    """Check MyProxy server identity.  If hostname doesn't match, allow match of 
     50    host's Distinguished Name against MYPROXY_SERVER_DN setting""" 
     51    DN_LUT = { 
     52        'commonName':               'CN', 
     53        'organisationalUnitName':   'OU', 
     54        'organisation':             'O', 
     55        'countryName':              'C', 
     56        'emailAddress':             'EMAILADDRESS', 
     57        'localityName':             'L', 
     58        'stateOrProvinceName':      'ST', 
     59        'streetAddress':            'STREET', 
     60        'domainComponent':          'DC', 
     61        'userid':                   'UID' 
     62    } 
     63    PARSER_RE_STR = '/(%s)=' % '|'.join(DN_LUT.keys() + DN_LUT.values()) 
     64    PARSER_RE = re.compile(PARSER_RE_STR)     
     65     
    5066    def __init__(self,  
    5167                 myProxyServerDN=os.environ.get('MYPROXY_SERVER_DN'), 
     
    6581        this keyword to '' or None to override and omit the prefix""" 
    6682         
    67         SSL.Checker.Checker.__init__(self, **kw) 
    68          
    69         self.myProxyServerDN = myProxyServerDN 
     83        # Allow for quoted DN 
     84        myProxyServerDN = myProxyServerDN.strip('"') 
     85         
     86        dnFields = self.__class__.PARSER_RE.split(myProxyServerDN) 
     87        if len(dnFields) < 2: 
     88            raise MyProxyClientError('Error parsing DN string: "%s"' %  
     89                                     myProxyServerDN) 
     90 
     91        self.myProxyServerDN = zip(dnFields[1::2], dnFields[2::2]) 
     92        self.myProxyServerDN.sort()         
    7093        self.cnHostPfx = cnHostPfx 
    7194         
    7295         
    73     def __call__(self, peerCert, host=None): 
    74         """Carry out checks on server ID 
     96    def __call__(self, connection, peerCert, errorStatus, errorDepth,  
     97                 successStatus): 
     98        """Verify MyProxy server certificate 
     99         
     100        @type connection: OpenSSL.SSL.Connection 
     101        @param connection: SSL connection object 
    75102        @type peerCert: basestring 
    76         @param peerCert: MyProxy server host certificate as M2Crypto.X509.X509 
     103        @param peerCert: MyProxy server host certificate as OpenSSL.crypto.X509 
    77104        instance 
    78         @type host: basestring 
    79         @param host: name of host to check 
     105        @type errorStatus: int 
     106        @param errorStatus: error code to return if verification fails 
     107        @type errorDepth: int 
     108        @param errorDepth:  
     109        @type successStatus: int 
     110        @param successStatus:  
     111        @rtype: int 
     112        @return: status code 
    80113        """ 
    81          
    82         # Globus host certificate has a "host/" prefix - see explanation in 
    83         # __init__.__doc__ 
    84         cnHostPfx = isinstance(self.cnHostPfx, basestring) \ 
    85                     and self.cnHostPfx or '' 
    86         host = None or cnHostPfx + self.host 
    87          
    88         try: 
    89             SSL.Checker.Checker.__call__(self, peerCert, host=host) 
    90              
    91         except SSL.Checker.WrongHost, e: 
    92             # Try match against DN set from MYPROXY_SERVER_DN / config 
    93             # file setting 
    94             peerCertDN = '/'+peerCert.get_subject().as_text().replace(', ','/') 
    95              
    96             # If they match drop the exception and return all OK instead 
    97             if peerCertDN != self.myProxyServerDN: 
    98                 raise 
    99              
    100         return True 
     114        return errorStatus 
     115     
     116        if peerCert.has_expired(): 
     117            # Any expired certificate in the chain should result in an error 
     118            if log.getEffectiveLevel() == logging.DEBUG: 
     119                log.debug('Certificate %r in peer certificate chain has ', 
     120                          'expired', peerCert.get_subject()) 
     121                 
     122            return errorStatus 
     123             
     124        elif errorDepth == 0: 
     125            # Only interested in DN of last certificate in the chain - this must  
     126            # match the expected MyProxy Server DN setting 
     127            peerCertDN = peerCert.get_subject().get_components() 
     128            peerCertDN.sort() 
     129 
     130            if peerCertDN == self.myProxyServerDN: 
     131                return successStatus 
     132            else: 
     133                return errorStatus 
     134        else: 
     135            return successStatus 
     136             
    101137     
    102138     
     
    453489        validation of MyProxy server certificate. 
    454490         
    455         Set to None to make M2Crypto.SSL.Context.load_verify_locations ignore 
     491        Set to None to make OpenSSL.SSL.Context.load_verify_locations ignore 
    456492        this parameter 
    457493         
     
    503539        not needed in the case of a proxy private key 
    504540        """ 
    505  
    506541        # Must be version 3 for MyProxy 
    507         context = SSL.Context(protocol='sslv3') 
    508  
     542        context = SSL.Context(SSL.SSLv3_METHOD) 
     543         
    509544        if self.caCertFilePath or self.caCertDir: 
    510             context.load_verify_locations(cafile=self.caCertFilePath, 
    511                                           capath=self.caCertDir) 
    512                              
    513             # Stop if peer's certificate can't be verified 
    514             context.set_allow_unknown_ca(False) 
    515         else: 
    516             context.set_allow_unknown_ca(True) 
     545            context.load_verify_locations(self.caCertFilePath, self.caCertDir) 
    517546             
    518547        if ownerCertFile: 
    519548            try: 
    520                 context.load_cert_chain(ownerCertFile, 
    521                                     keyfile=ownerKeyFile, 
    522                                     callback=lambda *ar, **kw: ownerPassphrase) 
    523             except Exception, e: 
     549                context.use_certificate_chain_file(ownerCertFile) 
     550                def pwdCallback(passphraseMaxLen,  
     551                                promptPassphraseTwice, 
     552                                passphrase): 
     553                    if len(passphrase) > passphraseMaxLen: 
     554                        log.error('Passphrase length %d is greater than the ' 
     555                                  'maximum length allowed %d', 
     556                                  len(passphrase), passphraseMaxLen) 
     557                        return '' 
     558                         
     559                    return passphrase 
     560                     
     561                context.set_passwd_cb(pwdCallback, ownerPassphrase) 
     562                context.use_privatekey_file(ownerKeyFile) 
     563            except Exception: 
    524564                raise MyProxyClientConfigError("Loading certificate " 
    525565                                               "and private key for SSL " 
    526566                                               "connection [also check CA " 
    527                                                "certificate settings]: %s" % e)  
    528              
    529             # Verify peer's certificate 
    530             context.set_verify(SSL.verify_peer, 1)  
     567                                               "certificate settings]: %s" %  
     568                                               traceback.format_exc())  
     569             
     570        # Verify peer's (MyProxy server) certificate 
     571        context.set_verify(SSL.VERIFY_PEER|SSL.VERIFY_FAIL_IF_NO_PEER_CERT,  
     572                           MyProxyServerSSLCertVerification())  
    531573         
    532574            
     
    534576        # globus doesn't handle this case, apparently, and instead 
    535577        # chokes in proxy delegation code 
    536         context.set_options(m2.SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS) 
     578        context.set_options(SSL.OP_DONT_INSERT_EMPTY_FRAGMENTS) 
    537579         
    538580        # connect to myproxy server 
    539         conn = SSL.Connection(context, sock=socket.socket()) 
     581        conn = SSL.Connection(context, socket.socket()) 
    540582         
    541583        # Check server host identity - if host doesn't match use explicit 
    542584        # 'serverDN'  
    543585        # host/<hostname> one 
    544         hostCheck = _HostCheck(host=self.hostname, 
    545                                myProxyServerDN=self.serverDN, 
    546                                cnHostPfx=self.serverCNPrefix) 
    547         conn.set_post_connection_check_callback(hostCheck) 
     586#        hostCheck = _HostCheck(host=self.hostname, 
     587#                               myProxyServerDN=self.serverDN, 
     588#                               cnHostPfx=self.serverCNPrefix) 
     589#        conn.set_post_connection_check_callback(hostCheck) 
    548590         
    549591        return conn 
    550592         
    551     def _createKeys(self, nBitsForKey=PRIKEY_NBITS): 
     593    def _createKeyPair(self, nBitsForKey=PRIKEY_NBITS): 
    552594        """Generate key pair and return as PEM encoded string 
    553595        @type nBitsForKey: int 
     
    557599        @return: public/private key pair 
    558600        """ 
    559         keyPair = RSA.gen_key(nBitsForKey, 65537L,#m2.RSA_F4,  
    560                               callback=lambda *arg, **kw: None) 
     601        keyPair = crypto.PKey() 
     602        keyPair.generate_key(crypto.TYPE_RSA, nBitsForKey) 
    561603         
    562604        return keyPair 
     
    578620        # Check all required certifcate request DN parameters are set                 
    579621        # Create certificate request 
    580         req = X509.Request() 
     622        certReq = crypto.X509Req() 
    581623         
    582624        # Create public key object 
    583         pubKey = EVP.PKey() 
    584         pubKey.assign_rsa(keyPair) 
     625        certReq.set_pubkey(keyPair) 
    585626         
    586627        # Add the public key to the request 
    587         req.set_version(0) 
    588         req.set_pubkey(pubKey) 
    589          
    590         defaultReqDN = self._openSSLConfig.reqDN 
    591               
    592         # Set DN 
    593         x509Name = X509.X509_Name() 
    594         x509Name.CN = CN 
    595          
    596         if defaultReqDN: 
    597             x509Name.OU = defaultReqDN['OU'] 
    598             x509Name.O = defaultReqDN['O'] 
    599                          
    600         req.set_subject_name(x509Name) 
    601         req.sign(pubKey, messageDigest) 
    602  
    603         return req.as_der() 
     628        certReq.sign(keyPair, messageDigest) 
     629         
     630        derCertReq = crypto.dump_certificate_request(crypto.FILETYPE_ASN1,  
     631                                                     certReq) 
     632 
     633        return derCertReq 
    604634     
    605635    def _deserializeResponse(self, msg, *fieldNames): 
     
    648678         
    649679        @return list containing the equivalent to the input in PEM format""" 
    650         pemCerts = []         
     680        pemCerts = [] 
    651681        dat = inputDat 
    652682         
    653         while dat:     
     683        while dat: 
    654684            # find start of cert, get length         
    655685            ind = dat.find('\x30\x82') 
     
    661691            # extract der-format cert, and convert to pem 
    662692            derCert = dat[ind:ind+len+4] 
    663              
    664             x509 = X509.load_cert_der_string(derCert) 
    665             pemCert = x509.as_pem() 
    666              
     693            x509Cert = crypto.load_certificate(crypto.FILETYPE_ASN1, derCert) 
     694            pemCert = crypto.dump_certificate(crypto.FILETYPE_PEM, x509Cert)         
    667695            pemCerts.append(pemCert) 
    668696     
     
    10091037         
    10101038        # Send certificate and private key 
    1011         certTxt = X509.load_cert(certFile).as_pem() 
     1039        certTxt = open(certFile).read() 
    10121040        keyTxt = open(keyFile).read() 
    10131041         
     
    10511079            # If no key pair was passed, generate here 
    10521080            if keyPair is None: 
    1053                 keyPair = self._createKeys(nBitsForKey=nBitsForKey) 
     1081                keyPair = self._createKeyPair(nBitsForKey=nBitsForKey) 
    10541082                 
    10551083            certReq = self._createCertReq(username, keyPair) 
    10561084 
    10571085        if keyPair is not None:  
    1058             pemKeyPair = keyPair.as_pem(cipher=None,  
    1059                                         callback=util.no_passphrase_callback) 
     1086            pemKeyPair = crypto.dump_privatekey(crypto.FILETYPE_PEM, keyPair) 
    10601087         
    10611088        # Set-up SSL connection 
     
    11471174            for tries in range(MyProxyClient.MAX_RECV_TRIES): 
    11481175                dat += conn.recv(MyProxyClient.SERVER_RESP_BLK_SIZE) 
    1149         except SSL.SSLError: 
     1176        except SSL.SysCallError: 
    11501177            # Expect this exception when response content exhausted 
    11511178            pass 
  • TI12-security/trunk/MyProxyClient/myproxy/test/proxy.crt

    r6829 r6837  
    11-----BEGIN CERTIFICATE----- 
    2 MIICfDCCAeWgAwIBAgIEFEquwTANBgkqhkiG9w0BAQUFADAlMRAwDgYDVQQKEwdH 
    3 YWJyaWVsMREwDwYDVQQDEwh0ZXN0dXNlcjAeFw0xMDA0MjEwOTI5MDNaFw0xMDA0 
    4 MjIwMzM0MDNaMDkxEDAOBgNVBAoTB0dhYnJpZWwxETAPBgNVBAMTCHRlc3R1c2Vy 
    5 MRIwEAYDVQQDEwkzNDA0Mzg3MjEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK 
    6 AoIBAQDySWTRVbS6L5T9UUoTpARD+Jk6H8NFp9Y1TjFWPaKySKa9ep0Gdj0vM83B 
    7 84Hz0U2R6FgdoaTBFIB2pbugjbm3pl8FIRZKaq7gdO6otmC21Y5XpjVA0s/fgyBG 
    8 y0iKqG78lSDnaBmVyaCra+2a7kkqsxGwUCMAlnxmZPqsHKXuRozRwTassH+BdUIt 
    9 A3oUe7M1PQLo3e5hwJWg/7igRHc7kHItaSRUcXeZ7RNnY/DNSU6ww/ovWFZajqpt 
    10 cCyFpmRZ6nPx2jhxWyKvu8xi+NeKlkwc9mmqcWdJD1iRomQWNJAgG85Bm2oZSlMV 
    11 xJwMoiEZRxNk1yzBTMlqRW+Tcu69AgMBAAGjITAfMB0GCCsGAQUFBwEOAQH/BA4w 
    12 DDAKBggrBgEFBQcVATANBgkqhkiG9w0BAQUFAAOBgQDcbaaHn/fP61V97xl+24v/ 
    13 qFaFG4F415QD6o7ZTV0o1dub1ygXO5FaVBYgDa7bxV72qZw24rxbLs5fxVkKBAWc 
    14 HYidDjG9FlDcgEC43Y6NSyugvuoPowBx/IPdRe2e/ub0qbZrAm7Xz8mNJKfVXkV8 
    15 vhj9yMRFrxmIyqFVoSI+QA== 
     2MIICfTCCAeagAwIBAgIEeVU+zzANBgkqhkiG9w0BAQUFADAlMRAwDgYDVQQKEwdH 
     3YWJyaWVsMREwDwYDVQQDEwh0ZXN0dXNlcjAeFw0xMDA0MjExNTMxMjVaFw0xMDA0 
     4MjIwOTM2MjVaMDoxEDAOBgNVBAoTB0dhYnJpZWwxETAPBgNVBAMTCHRlc3R1c2Vy 
     5MRMwEQYDVQQDEwoyMDM1NjI5Nzc1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB 
     6CgKCAQEA3xsYzad74OW10LnCPO+DRZDbhin7/L1E8XKdPKrmau0Gt1HrpEiXsAa4 
     7WwhdCJZ/i/eDwRCNQDvcqQ6O4fBpyl3pk3LOjZOHsZir1ya8pODOjhfQI4hRY1Da 
     8R7PIh2woa13qFj0lTlaeYMEtxcC6Mp1q/wdnAzIJtQgXlVlPfB4cnQBFp8q5+8RO 
     9ZGe8ie2yHT9mo02ymoKwtWHUJbhLc7LFkV1D9/GdtmfrfyOd8oOleGM9p29omtA8 
     100qnnaj2oqr5XvEFu3ThxSC0Y3QI16QKJCdK+0PyEtj5NZ3OqtYK+GnkgLftKfjUL 
     111c078kBWkcwS042lIMhmgAjM0hD7ZwIDAQABoyEwHzAdBggrBgEFBQcBDgEB/wQO 
     12MAwwCgYIKwYBBQUHFQEwDQYJKoZIhvcNAQEFBQADgYEAlyn+pgDT0AuKZpBRdLLN 
     13lbNBVlVrOz1tBvBpyuuzhuS8GpAO7AJb8FuvyWNqXPSjSXzzm6CDFX0pXKuaA0VM 
     14QZ/gG61o1ky2xhbJfgMxousIyu32YlPfUrmv5xM7pgl3NCuK67fJMC13hjq+RkT1 
     15wDMNhY1ngTo1sxV8UnKjcx0= 
    1616-----END CERTIFICATE----- 
    1717-----BEGIN CERTIFICATE----- 
  • TI12-security/trunk/MyProxyClient/myproxy/test/proxy.key

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

    r6829 r6837  
    2020from os import path 
    2121 
    22 from M2Crypto import X509 
     22from OpenSSL import crypto 
    2323 
    2424from myproxy.client import CaseSensitiveConfigParser, MyProxyClient 
     
    102102        print "proxy credentials:"  
    103103        print ''.join(creds) 
    104         open(proxyCertFile, 'w').write(creds[0]+''.join(creds[2:]))             
     104        open(proxyCertFile, 'w').write(creds[0]+''.join(creds[2:])) 
    105105        open(proxyKeyFile, 'w').write(creds[1]) 
    106106 
     
    117117 
    118118        credExists, errorTxt, fields = self.clnt.info( 
    119                                      thisSection['username'], 
    120                                      path.expandvars(thisSection['ownerCertFile']), 
    121                                      path.expandvars(thisSection['ownerKeyFile']), 
    122                                      ownerPassphrase=ownerPassphrase) 
     119                                 thisSection['username'], 
     120                                 path.expandvars(thisSection['ownerCertFile']), 
     121                                 path.expandvars(thisSection['ownerKeyFile']), 
     122                                 ownerPassphrase=ownerPassphrase) 
    123123        print "test3Info... " 
    124124        print "credExists: %s" % credExists 
     
    182182            if fileName.endswith('.0'): 
    183183                # test parsing certificate 
    184                 cert = X509.load_cert_string(fileContents, X509.FORMAT_PEM) 
     184                cert = crypto.load_certificate(crypto.FILETYPE_PEM, 
     185                                               fileContents) 
    185186                self.assert_(cert) 
    186                 self.assert_(isinstance(cert, X509.X509)) 
     187                self.assert_(isinstance(cert, crypto.X509)) 
    187188                subj = cert.get_subject() 
    188189                self.assert_(subj) 
  • TI12-security/trunk/MyProxyClient/myproxy/utils/openssl.py

    r5048 r6837  
    1010__contact__ = "Philip.Kershaw@stfc.ac.uk" 
    1111__revision__ = '$Id:openssl.py 4643 2008-12-15 14:53:53Z pjkersha $' 
    12  
    1312import re 
    1413import os 
    1514from ConfigParser import SafeConfigParser 
    16 from M2Crypto.X509 import X509_Name 
    1715 
    1816 
     
    3533    @cvar _gridCASubDir: sub-directory of globus user for CA settings""" 
    3634     
    37     _certReqDNParamName = X509_Name.nid.keys()     
     35    _certReqDNParamName = ( 
     36        'countryName', 
     37        'C', 
     38        'stateOrProvinceName', 
     39        'ST',  
     40        'localityName', 
     41        'L' 
     42        'organizationName', 
     43        'O', 
     44        'organizationalUnitName', 
     45        'OU', 
     46        'commonName', 
     47        'CN', 
     48        'emailAddress' 
     49    ) 
     50         
    3851    _caDirPat = re.compile('\$dir')     
    3952    _gridCASubDir = os.path.join(".globus", "simpleCA") 
    4053 
    41      
    4254    def __init__(self, filePath=None, caDir=None): 
    4355        """Initial OpenSSL configuration optionally setting a file path to 
     
    8092        self._filePath = filePath 
    8193                     
    82  
    8394    def _getFilePath(self): 
    8495        """Get property method 
     
    90101                        fset=_setFilePath, 
    91102                        doc="file path for configuration file") 
    92  
    93              
     103       
    94104    def setCADir(self, caDir): 
    95105        """Set property method 
     
    118128        self._caDir = caDir 
    119129                     
    120  
    121130    def _getCADir(self): 
    122131        """Get property method 
     
    129138                     doc="directory path for CA configuration files") 
    130139 
    131  
    132140    def _getReqDN(self): 
    133141        """Get property method 
     
    135143        @return reqDN: Distinguished Name for certificate request""" 
    136144        return self._reqDN 
    137  
    138145 
    139146    def _setReqDN(self, reqDN): 
     
    153160 
    154161        self._reqDN = reqDN 
    155  
    156162 
    157163    reqDN = property(fget=_getReqDN, 
     
    191197        self._setReqDN() 
    192198 
    193      
    194199    def _filtOptVal(self, optVal): 
    195200        """For option value, filter out comments and substitute $dir with 
     
    204209        else: 
    205210            # Leave $dir in place as no CA directory has been set 
    206             return filtVal 
    207          
     211            return filtVal     
    208212 
    209213    def readfp(self, fp): 
     
    212216        parsing errors""" 
    213217        raise NotImplementedError("Use read method instead") 
    214  
    215218 
    216219    def _setReqDN(self): 
     
    228231        except Exception, e: 
    229232            raise OpenSSLConfigError('Setting content of Distinguished Name ' 
    230                                      'from file "%s": %s' %(self._filePath,e)) 
     233                                     'from file "%s": %s' % (self._filePath, e)) 
  • TI12-security/trunk/MyProxyClient/setup.py

    r6069 r6837  
    22"""Distribution Utilities setup program for MyProxy Client Package 
    33 
    4 NERC Data Grid Project 
     4NERC DataGrid Project 
    55""" 
    66__author__ = "P J Kershaw" 
    77__date__ = "12/12/08" 
    8 __copyright__ = "(C) 2009 Science and Technology Facilities Council" 
     8__copyright__ = "(C) 2010 Science and Technology Facilities Council" 
    99__license__ = """BSD - See LICENSE file in top-level directory 
    1010 
     
    2727 
    2828setup( 
    29     name =                      'MyProxyClient', 
    30     version =                   '0.9.0', 
    31     description =               'MyProxy Client', 
    32     long_description =          'Pure Python implementation of MyProxy client interface', 
    33     author =                    'Philip Kershaw', 
    34     author_email =              'Philip.Kershaw@stfc.ac.uk', 
    35     maintainer =                'Philip Kershaw', 
    36     maintainer_email =          'Philip.Kershaw@stfc.ac.uk', 
    37     url =                   'http://proj.badc.rl.ac.uk/ndg/wiki/Security/MyProxyClient', 
    38     platforms =             ['POSIX', 'Linux', 'Windows'], 
    39     install_requires =      ['M2Crypto'], 
    40     license =               __license__, 
    41     test_suite =            'test', 
    42     packages =              find_packages(), 
    43     package_data =          { 
    44         'test': ['*.cfg', '*.conf', '*.crt', '*.key', 'README'] 
     29    name =              'MyProxyClient', 
     30    version =           '0.9.1', 
     31    description =       'MyProxy Client', 
     32    long_description =  'Pure Python implementation of MyProxy client interface', 
     33    author =            'Philip Kershaw', 
     34    author_email =      'Philip.Kershaw@stfc.ac.uk', 
     35    maintainer =        'Philip Kershaw', 
     36    maintainer_email =  'Philip.Kershaw@stfc.ac.uk', 
     37    url =               'http://proj.badc.rl.ac.uk/ndg/wiki/Security/MyProxyClient', 
     38    platforms =         ['POSIX', 'Linux', 'Windows'], 
     39    install_requires =  ['PyOpenSSL'], 
     40    license =           __license__, 
     41    test_suite =        'myproxy.test', 
     42    packages =          find_packages(), 
     43    package_data =      { 
     44        'myproxy.test': ['*.cfg', '*.conf', '*.crt', '*.key', 'README'] 
    4545    }, 
    46     classifiers=[ 
     46    classifiers = [ 
    4747        'Development Status :: 4 - Beta', 
    4848        'Environment :: Console', 
Note: See TracChangeset for help on using the changeset viewer.