Changeset 7493


Ignore:
Timestamp:
21/09/10 16:42:53 (9 years ago)
Author:
pjkersha
Message:

Incomplete - task 12: ESG Yadis identity service discovery

Location:
TI12-security/trunk/EsgYadisParser/src/esg/security
Files:
2 added
1 deleted
4 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/EsgYadisParser/src/esg/security/DnWhitelistX509TrustMgr.java

    r7463 r7493  
    4747public class DnWhitelistX509TrustMgr implements X509TrustManager { 
    4848 
    49         protected static String KEYSTORE_FILEPATH_PROP_NAME =  
    50                 DnWhitelistX509TrustMgr.class.getName() + ".keyStoreFilePath"; 
    51         protected static String KEYSTORE_PASSPHRASE_PROP_NAME =  
    52                 DnWhitelistX509TrustMgr.class.getName() + ".keyStorePassphrase"; 
     49        protected static String TRUSTSTORE_FILEPATH_PROP_NAME =  
     50                DnWhitelistX509TrustMgr.class.getName() + ".trustStoreFilePath"; 
     51        protected static String TRUSTSTORE_PASSPHRASE_PROP_NAME =  
     52                DnWhitelistX509TrustMgr.class.getName() + ".trustStorePassphrase"; 
    5353        protected static String DN_PROP_NAME = DnWhitelistX509TrustMgr.class.getName() + ".dn"; 
    5454         
    5555        protected static String BASE_TRUST_MGR_ID = "PKIX"; 
    56         protected static String KEYSTORE_TYPE = "JKS"; 
     56        protected static String TRUSTSTORE_TYPE = "JKS"; 
    5757         
    5858        /** 
     
    7070         
    7171    /** 
    72      * Load default trust manager and key store if set 
    73      *  
    74      * @param keyStoreFilePath key store file path 
    75      * @param keyStorePassphrase pass-phrase for this key store - use null if 
     72     * Load default trust manager and trust store if set 
     73     *  
     74     * @param trustStoreFilePath trust store file path 
     75     * @param trustStorePassphrase pass-phrase for this trust store - use null if 
    7676     * none set 
    77      * @param keyStoreFilePath key store file path 
    78      * @param keyStorePassphrase pass-phrase for this key store - use null if 
     77     * @param trustStoreFilePath trust store file path 
     78     * @param trustStorePassphrase pass-phrase for this trust store - use null if 
    7979     * none set 
    8080     */ 
    81     public DnWhitelistX509TrustMgr(String keyStoreFilePath, 
    82                 String keyStorePassphrase) throws DnWhitelistX509TrustMgrInitException { 
     81    public DnWhitelistX509TrustMgr(String trustStoreFilePath, 
     82                String trustStorePassphrase) throws DnWhitelistX509TrustMgrInitException { 
    8383        certificateDnWhiteList = null; 
    84         _init(keyStoreFilePath, keyStorePassphrase); 
     84        _init(trustStoreFilePath, trustStorePassphrase); 
    8585    } 
    8686     
    8787    /** 
    88      * Initialise key store and default trust manager which is wrapped by this 
     88     * Initialise trust store and default trust manager which is wrapped by this 
    8989     * class 
    9090     *  
    91      * @param keyStoreFilePath 
    92      * @param keyStorePassphrase 
     91     * @param trustStoreFilePath 
     92     * @param trustStorePassphrase 
    9393     * @throws DnWhitelistX509TrustMgrInitException  
    9494     */ 
    95     protected void _init(String keyStoreFilePath, String keyStorePassphrase)  
     95    protected void _init(String trustStoreFilePath, String trustStorePassphrase)  
    9696                throws DnWhitelistX509TrustMgrInitException { 
    9797        TrustManagerFactory tmf = null; 
     
    104104                } 
    105105                 
    106                 FileInputStream kis = null; 
    107         KeyStore ks = null; 
    108                  
    109                 if (keyStoreFilePath != null) 
     106                FileInputStream trustStoreIStream = null; 
     107        KeyStore trustStore = null; 
     108                 
     109                if (trustStoreFilePath != null) 
    110110                { 
    111111                        try { 
    112                                 kis = new FileInputStream(keyStoreFilePath); 
     112                                trustStoreIStream = new FileInputStream(trustStoreFilePath); 
    113113                                 
    114114                        } catch (FileNotFoundException e) { 
    115                                 // TODO Auto-generated catch block 
    116115                                throw new DnWhitelistX509TrustMgrInitException("Error reading "+ 
    117                                                 "\"" + keyStoreFilePath + "\" keystore", e); 
     116                                                "\"" + trustStoreFilePath + "\" truststore", e); 
    118117                        } 
    119118                 
    120119                        // Create a "default" JSSE X509TrustManager. 
    121120                        try { 
    122                                 ks = KeyStore.getInstance(KEYSTORE_TYPE); 
     121                                trustStore = KeyStore.getInstance(TRUSTSTORE_TYPE); 
    123122                                 
    124123                        } catch (KeyStoreException e) { 
     
    128127                         
    129128                try { 
    130                                 ks.load(kis, keyStorePassphrase == null ?  
    131                                                                 null : keyStorePassphrase.toCharArray()); 
     129                                trustStore.load(trustStoreIStream, trustStorePassphrase == null ?  
     130                                                                null : trustStorePassphrase.toCharArray()); 
    132131                                 
    133132                        } catch (NoSuchAlgorithmException e) { 
    134133                                throw new DnWhitelistX509TrustMgrInitException("Error reading "+ 
    135                                                 "\"" + keyStoreFilePath + "\" keystore", e); 
     134                                                "\"" + trustStoreFilePath + "\" truststore", e); 
    136135         
    137136                        } catch (CertificateException e) { 
    138137                                throw new DnWhitelistX509TrustMgrInitException("Error reading "+ 
    139                                                 "\"" + keyStoreFilePath + "\" keystore", e); 
     138                                                "\"" + trustStoreFilePath + "\" truststore", e); 
    140139         
    141140                        } catch (IOException e) { 
    142141                                throw new DnWhitelistX509TrustMgrInitException("Error reading "+ 
    143                                                 "\"" + keyStoreFilePath + "\" keystore", e); 
     142                                                "\"" + trustStoreFilePath + "\" truststore", e); 
    144143                        } 
    145144                } 
    146145                 
    147146        try { 
    148                         tmf.init(ks); 
     147                        tmf.init(trustStore); 
    149148                } catch (KeyStoreException e) { 
    150149                        throw new DnWhitelistX509TrustMgrInitException("Initialising "+ 
     
    190189                        applicationProps.load(propertiesFile); 
    191190                } catch (IOException e) { 
    192                         throw new DnWhitelistX509TrustMgrInitException("Error loading " + 
    193                                         "properties file \"" + propertiesFile + "\"", e); 
     191                        throw new DnWhitelistX509TrustMgrInitException( 
     192                                        "Error loading properties file", e); 
    194193                } 
    195194                 
    196195                // Key store file may be null in which case standard locations are 
    197196                // searched instead 
    198                 String keyStoreFilePath = applicationProps.getProperty( 
    199                         KEYSTORE_FILEPATH_PROP_NAME, null); 
    200                  
    201                 String keyStorePassphrase = applicationProps.getProperty( 
    202                                 KEYSTORE_PASSPHRASE_PROP_NAME, null); 
     197                String trustStoreFilePath = applicationProps.getProperty( 
     198                        TRUSTSTORE_FILEPATH_PROP_NAME, null); 
     199                 
     200                String trustStorePassphrase = applicationProps.getProperty( 
     201                                TRUSTSTORE_PASSPHRASE_PROP_NAME, null); 
    203202                 
    204203                /*  
    205204                 * DN values are stored in the property file as e.g. 
    206205                 * 
    207                  * DnWhitelistX509TrustMgr.dn0 = ... 
    208                  * DnWhitelistX509TrustMgr.dn1 = ... 
    209                  * DnWhitelistX509TrustMgr.dn2 = ...  
     206                 * esg.security.DnWhitelistX509TrustMgr.dn0 = ... 
     207                 * esg.security.DnWhitelistX509TrustMgr.dn1 = ... 
     208                 * esg.security.DnWhitelistX509TrustMgr.dn2 = ...  
    210209                 * 
    211210                 * ... etc.  
     
    221220                } 
    222221                 
    223         _init(keyStoreFilePath, keyStorePassphrase); 
     222        _init(trustStoreFilePath, trustStorePassphrase); 
    224223    } 
    225224     
     
    227226     * Instantiate from a given certificate DN whitelist 
    228227     *  
    229      * @param keyStoreFilePath key store file path 
    230      * @param keyStorePassphrase pass-phrase for this key store - use null if 
     228     * @param trustStoreFilePath trust store file path 
     229     * @param trustStorePassphrase pass-phrase for this trust store - use null if 
    231230     * none set 
    232231     * @param certificateDnWhiteList list of peer certificate distinguished  
     
    235234     * getting default trust manager 
    236235     */ 
    237     public DnWhitelistX509TrustMgr(String keyStoreFilePath, 
    238                 String keyStorePassphrase, 
     236    public DnWhitelistX509TrustMgr(String trustStoreFilePath, 
     237                String trustStorePassphrase, 
    239238                X500Principal[] certificateDnWhiteList) throws  
    240239        DnWhitelistX509TrustMgrInitException { 
    241240         
    242         this(keyStoreFilePath, keyStorePassphrase); 
     241        this(trustStoreFilePath, trustStorePassphrase); 
    243242                 
    244243        if (certificateDnWhiteList != null) 
  • TI12-security/trunk/EsgYadisParser/src/esg/security/exceptions/DnWhitelistX509TrustMgrInitException.java

    r7462 r7493  
    11/** 
    2  * Support tool for SSL based authentication for ESG Security web services 
     2 * Initialisation exception for Certificate DN Whitelist based X.509 Trust  
     3 * Manager 
    34 *  
    45 * Earth System Grid/CMIP5 
     
    1819 
    1920 
    20 /** 
    21  * Initialisation exception for Certificate DN Whitelist based X.509 Trust  
    22  * Manager 
    23  *  
    24  * @author pjkersha 
    25  * 
    26  */ 
    2721public class DnWhitelistX509TrustMgrInitException extends Exception { 
    2822        public DnWhitelistX509TrustMgrInitException(String message) { 
  • TI12-security/trunk/EsgYadisParser/src/esg/security/openid2emailresolution/OpenId2EmailAddrResolution.java

    r7463 r7493  
    1616 
    1717import java.io.BufferedReader; 
     18import java.io.FileInputStream; 
     19import java.io.FileNotFoundException; 
    1820import java.io.IOException; 
    1921import java.io.InputStream; 
     
    2527import java.net.URL; 
    2628import java.security.KeyManagementException; 
     29import java.security.KeyStore; 
     30import java.security.KeyStoreException; 
    2731import java.security.NoSuchAlgorithmException; 
     32import java.security.UnrecoverableKeyException; 
     33import java.security.cert.CertificateException; 
    2834import java.util.ArrayList; 
    2935import java.util.Collections; 
     
    3541import javax.mail.internet.InternetAddress; 
    3642import javax.net.ssl.HttpsURLConnection; 
     43import javax.net.ssl.KeyManager; 
     44import javax.net.ssl.KeyManagerFactory; 
    3745import javax.net.ssl.SSLContext; 
    3846import javax.net.ssl.SSLSocketFactory; 
     
    7078         
    7179        private String attributeServiceType; 
    72         private DnWhitelistX509TrustMgr x509TrustMgr; 
     80        private DnWhitelistX509TrustMgr yadisX509TrustMgr; 
     81        private DnWhitelistX509TrustMgr attributeServiceClientX509TrustMgr; 
    7382        public static final String DEF_ATTRIBUTE_SERVICE_XRD_SERVICE_TYPE =  
    7483                "urn:esg:security:attribute-service"; 
    7584         
     85        /** 
     86         * Yadis and Attribute Service properties files set SSL settings for  
     87         * queries to these respective services 
     88         *  
     89         * @param attributeServiceType 
     90         * @param yadisPropertiesFile 
     91         * @param attributeServiceClientPropertiesFile 
     92         * @param keyStoreFile 
     93         * @param keyStorePassphrase 
     94         * @throws YadisRetrievalException 
     95         */ 
    7696        public OpenId2EmailAddrResolution(String attributeServiceType, 
    77                         InputStream propertiesFile) throws YadisRetrievalException { 
    78                  
    79                 // Create trust manager with given whitelist and keystore settings 
    80                 // read from properties file 
    81                 try { 
    82                         x509TrustMgr = new DnWhitelistX509TrustMgr(propertiesFile); 
     97                        InputStream yadisPropertiesFile,  
     98                        InputStream attributeServiceClientPropertiesFile, 
     99                        InputStream keyStoreFile, 
     100                        String keyStorePassphrase)  
     101                                throws DnWhitelistX509TrustMgrInitException { 
     102                 
     103                // Create trust managers with given whitelist and keystore settings 
     104                // read from appropriate properties files 
     105                try { 
     106                        yadisX509TrustMgr = new DnWhitelistX509TrustMgr(yadisPropertiesFile); 
    83107                         
    84108                } catch (DnWhitelistX509TrustMgrInitException e) { 
    85                         throw new YadisRetrievalException("Creating trust manager", e); 
     109                        throw new DnWhitelistX509TrustMgrInitException("Creating trust " + 
     110                                        "manager for Yadis query", e); 
     111                } 
     112                 
     113                try { 
     114                        attributeServiceClientX509TrustMgr = new DnWhitelistX509TrustMgr( 
     115                                        attributeServiceClientPropertiesFile); 
     116                         
     117                } catch (DnWhitelistX509TrustMgrInitException e) { 
     118                        throw new DnWhitelistX509TrustMgrInitException("Creating trust " + 
     119                                        "manager for Attribute Service query", e); 
    86120                } 
    87121 
     
    89123                        this.attributeServiceType = DEF_ATTRIBUTE_SERVICE_XRD_SERVICE_TYPE; 
    90124                else 
    91                         this.attributeServiceType = attributeServiceType; 
    92  
    93         } 
    94          
    95         public OpenId2EmailAddrResolution(InputStream propertiesFile)  
    96         throws YadisRetrievalException { 
    97                 this(null, propertiesFile); 
    98         } 
    99          
     125                        this.attributeServiceType = attributeServiceType;        
     126        } 
     127         
     128        public OpenId2EmailAddrResolution(InputStream yadisPropertiesFile,  
     129                        InputStream attributeServiceClientPropertiesFile, 
     130                        InputStream keyStore, 
     131                        String keyStorePassphrase)  
     132        throws DnWhitelistX509TrustMgrInitException { 
     133                this(null, yadisPropertiesFile, attributeServiceClientPropertiesFile, 
     134                        keyStore, keyStorePassphrase); 
     135        } 
     136         
     137        /** 
     138         *  
     139         * @param openidURL 
     140         * @return 
     141         * @throws NoMatchingXrdsServiceException 
     142         * @throws XrdsParseException 
     143         * @throws YadisRetrievalException 
     144         * @throws AttributeServiceQueryException 
     145         */ 
    100146        public InternetAddress resolve(URL openidURL) throws  
    101147                NoMatchingXrdsServiceException,  
     
    104150                AttributeServiceQueryException { 
    105151                 
    106                 YadisRetrieval yadisRetriever = new YadisRetrieval(x509TrustMgr); 
     152                YadisRetrieval yadisRetriever = new YadisRetrieval(yadisX509TrustMgr); 
    107153                List<XrdsServiceElem> serviceElems = null; 
    108                 Set<String> targetTypes = new HashSet<String>() {{add(attributeServiceType);}}; 
     154                Set<String> targetTypes = new HashSet<String>() {{ 
     155                        add(attributeServiceType);}}; 
    109156                 
    110157                serviceElems = yadisRetriever.retrieveAndParse(openidURL, targetTypes); 
     
    132179                          
    133180                 // Call Attribute Service querying for e-mail address 
    134                  InternetAddress emailAddr = queryAttributeService(attributeServiceEndpoint, 
     181                 InternetAddress emailAddr = queryAttributeService( 
     182                                 attributeServiceEndpoint, 
    135183                                 openidURL); 
    136184                 return emailAddr; 
     
    145193         * @throws AttributeServiceQueryException 
    146194         */ 
    147         protected InternetAddress queryAttributeService(URL attributeServiceEndpoint, 
     195        protected InternetAddress queryAttributeService( 
     196                        URL attributeServiceEndpoint, 
    148197                        URL openidURL) throws AttributeServiceQueryException 
    149198        { 
     199                // TODO: set issuer from SSL client cert DN 
    150200                String issuer = "CN=localhost, OU=Security, O=NDG"; 
     201                 
    151202                SAMLAttributeServiceClientSoapImpl attributeServiceClient =  
    152203                        new SAMLAttributeServiceClientSoapImpl(issuer); 
     
    171222                                        "query to " + attributeServiceEndpoint + " for OpenID", e);                      
    172223                } 
    173                 SSLContext ctx = null; 
    174                 try { 
    175                         ctx = SSLContext.getInstance("SSL"); 
    176                          
    177                 } catch (NoSuchAlgorithmException e) { 
    178                         throw new AttributeServiceQueryException("Getting SSL context", e); 
    179                 } 
    180                  
    181                 X509TrustManager tm[] = {x509TrustMgr}; 
    182                 try { 
    183                         ctx.init(null, tm, null); 
    184                 } catch (KeyManagementException e) { 
    185                         throw new AttributeServiceQueryException("Initialising SSL context",  
    186                                                                                                         e); 
    187                 } 
    188                  
    189                 SSLSocketFactory socketFactory = ctx.getSocketFactory(); 
    190                 HttpsURLConnection connection = null; 
    191                 try { 
    192                         connection = (HttpsURLConnection) 
    193                                 attributeServiceEndpoint.openConnection(); 
    194                 } catch (IOException e) { 
    195                         throw new AttributeServiceQueryException("Making connection", e); 
    196                 } 
    197                 connection.setSSLSocketFactory(socketFactory); 
    198                 connection.setDoOutput(true); 
    199                  
    200                 try { 
    201                         connection.setRequestMethod("POST"); 
    202                 } catch (ProtocolException e) { 
    203                         throw new AttributeServiceQueryException( 
    204                                         "Setting HTTP request method to \"POST\"", e); 
    205                 } 
    206                  
    207                 OutputStream ops = null; 
    208                 try { 
    209                         ops = connection.getOutputStream(); 
    210                 } catch (IOException e) { 
    211                         throw new AttributeServiceQueryException( 
    212                                 "Getting output stream for attribute query", e); 
    213                 } 
    214                  
    215                 OutputStreamWriter osw = new OutputStreamWriter(ops); 
    216                 try { 
    217                         osw.write(query); 
    218                         osw.flush(); 
    219                         osw.close(); 
    220                 } catch (IOException e) { 
    221                         throw new AttributeServiceQueryException( 
    222                                 "Error writing attribute query for dispatch", e); 
    223                 } 
    224                  
    225                 InputStream ins = null; 
    226                 try { 
    227                         ins = connection.getInputStream(); 
    228                 } catch (IOException e) { 
    229                         throw new AttributeServiceQueryException("Getting input stream", e); 
    230                 } 
    231                  
    232             InputStreamReader isr = new InputStreamReader(ins); 
    233             BufferedReader in = new BufferedReader(isr); 
    234             StringBuffer buf = new StringBuffer(); 
    235             String inputLine = null; 
    236  
    237             try { 
    238                         while ((inputLine = in.readLine()) != null) { 
    239                             buf.append(inputLine); 
    240                             buf.append(System.getProperty("line.separator")); 
    241                         } 
    242                         in.close(); 
    243                 } catch (IOException e) { 
    244                         throw new AttributeServiceQueryException("Reading content", e); 
    245                 } 
    246  
    247                 /* 
    248                  * Parse the response 
    249                  */ 
    250                 String response = buf.toString(); 
     224                String response = httpsRetrieve(attributeServiceEndpoint, query, null); 
    251225                SAMLAttributesImpl samlAttrs = null; 
    252226                try { 
     
    282256                NoMatchingXrdsServiceException,  
    283257                XrdsParseException,  
    284                 YadisRetrievalException,  
    285                 AttributeServiceQueryException 
     258                AttributeServiceQueryException,  
     259                DnWhitelistX509TrustMgrInitException,  
     260                YadisRetrievalException 
    286261        { 
    287                 // Input DNs from a file 
    288                 InputStream propertiesFile =  
    289                         DnWhitelistX509TrustMgr.class.getResourceAsStream( 
    290                                                                 "DnWhitelistX509TrustMgr.properties"); 
    291  
     262                // Input DNs for whitelisting read from file.  Different settings 
     263                // may be made for the Yadis and Attribute Service connections 
     264                InputStream yadisPropertiesFile =  
     265                        OpenId2EmailAddrResolution.class.getResourceAsStream( 
     266                                                                "yadis-retrieval-ssl.properties"); 
     267 
     268                InputStream attributeServiceClientPropertiesFile =  
     269                        OpenId2EmailAddrResolution.class.getResourceAsStream( 
     270                                                                "attribute-service-client-ssl.properties"); 
     271                 
     272                InputStream keyStoreFile =  
     273                        OpenId2EmailAddrResolution.class.getResourceAsStream( 
     274                                                                "attribute-service-client-truststore.ks"); 
     275                String keyStorePassphrase = "importkey"; 
    292276                OpenId2EmailAddrResolution openid2EmailAddr = new  
    293                         OpenId2EmailAddrResolution(propertiesFile); 
     277                        OpenId2EmailAddrResolution(yadisPropertiesFile,  
     278                                        attributeServiceClientPropertiesFile, 
     279                                        keyStoreFile, 
     280                                        keyStorePassphrase); 
    294281                 
    295282//              URL yadisURL = new URL("https://ceda.ac.uk/openid/Philip.Kershaw"); 
  • TI12-security/trunk/EsgYadisParser/src/esg/security/openid2emailresolution/attribute-service-client-ssl.properties

    r7463 r7493  
    1414# @author pjkersha 
    1515# @version $Revision$ 
    16 org.earthsystemgrid.security.DnWhitelistX509TrustMgr.keyStoreFilePath = /home/pjkersha/workspace/EsgYadisParser/src/esg/security/openid2emailresolution/attribute-service-client.ks 
    17 org.earthsystemgrid.security.DnWhitelistX509TrustMgr.keyStorePassphrase = testpass 
    18 org.earthsystemgrid.security.DnWhitelistX509TrustMgr.dn0 = CN=ceda.ac.uk, OU=RAL-SPBU, O=Science and Technology Facilities Council, C=GB 
    19 org.earthsystemgrid.security.DnWhitelistX509TrustMgr.dn1 = CN=localhost, OU=Security, O=NDG 
     16esg.security.DnWhitelistX509TrustMgr.trustStoreFilePath = /home/pjkersha/workspace/EsgYadisParser/src/esg/security/openid2emailresolution/attribute-service-client.ks 
     17esg.security.DnWhitelistX509TrustMgr.trustStorePassphrase = testpass 
     18esg.security.DnWhitelistX509TrustMgr.dn0 = CN=ceda.ac.uk, OU=RAL-SPBU, O=Science and Technology Facilities Council, C=GB 
     19esg.security.DnWhitelistX509TrustMgr.dn1 = CN=localhost, OU=Security, O=NDG 
Note: See TracChangeset for help on using the changeset viewer.