All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.globus.gsi.GlobusCredential Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 1999-2010 University of Chicago
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in
 * compliance with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is
 * distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied.
 *
 * See the License for the specific language governing permissions and limitations under the License.
 */
package org.globus.gsi;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.globus.gsi.util.CertificateUtil;

import org.globus.gsi.trustmanager.X509ProxyCertPathValidator;

import org.globus.gsi.stores.ResourceCertStoreParameters;
import org.globus.gsi.stores.ResourceSigningPolicyStore;
import org.globus.gsi.stores.ResourceSigningPolicyStoreParameters;

import org.globus.gsi.provider.GlobusProvider;
import org.globus.gsi.provider.KeyStoreParametersFactory;

import java.io.File;
import java.security.cert.CertStore;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.X509Certificate;
import java.security.cert.CertificateEncodingException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import org.globus.common.ChainedIOException;
import org.globus.common.CoGProperties;
import org.globus.gsi.bc.BouncyCastleUtil;

/**
 * Provides a Java object representation of Globus credential which can include the proxy file or host
 * certificates.
 * @deprecated
 */
public class GlobusCredential implements Serializable {

	private Log logger = LogFactory.getLog(getClass());
    private X509Credential cred;
    private static GlobusCredential defaultCred;
    private static transient long credentialLastModified = -1;
    // indicates if default credential was explicitely set
    // and if so - if the credential expired it try
    // to load the proxy from a file.
    private static transient boolean credentialSet = false;
    private static transient File credentialFile = null;

    static {
        new ProviderLoader();
    }

    /**
     * Creates a GlobusCredential from a private key and a certificate chain.
     *
     * @param key
     *            the private key
     * @param certs
     *            the certificate chain
     */
    public GlobusCredential(PrivateKey key, X509Certificate[] certs) {
        cred = new X509Credential(key, certs);
    }

    /**
     * Creates a GlobusCredential from a proxy file.
     *
     * @param proxyFile
     *            the file to load the credential from.
     * @exception GlobusCredentialException
     *                if the credential failed to load.
     */
    public GlobusCredential(String proxyFile) throws GlobusCredentialException {
        try {
            cred = new X509Credential(proxyFile);
        } catch (Exception e) {
            throw new GlobusCredentialException(GlobusCredentialException.FAILURE, e.getMessage(), e);
        }
    }

    /**
     * Creates a GlobusCredential from certificate file and a unencrypted key file.
     *
     * @param certFile
     *            the file containing the certificate
     * @param unencryptedKeyFile
     *            the file containing the private key. The key must be unencrypted.
     * @exception GlobusCredentialException
     *                if something goes wrong.
     */
    public GlobusCredential(String certFile, String unencryptedKeyFile) throws GlobusCredentialException {

        if (certFile == null || unencryptedKeyFile == null) {
            throw new IllegalArgumentException();
        }

        try {
            cred = new X509Credential(certFile, unencryptedKeyFile);
        } catch (Exception e) {
            throw new GlobusCredentialException(GlobusCredentialException.FAILURE, e.getMessage(), e);
        }
    }

    /**
     * Creates a GlobusCredential from an input stream.
     *
     * @param input
     *            the stream to load the credential from.
     * @exception GlobusCredentialException
     *                if the credential failed to load.
     */
    public GlobusCredential(InputStream input) throws GlobusCredentialException {

        try {
            cred = new X509Credential(input);
        } catch (Exception e) {
            throw new GlobusCredentialException(GlobusCredentialException.FAILURE, e.getMessage(), e);
        }
    }

    /**
     * Saves the credential into a specified output stream. The self-signed certificates in the certificate
     * chain will not be saved. The output stream should always be closed after calling this function.
     *
     * @param out
     *            the output stream to write the credential to.
     * @exception IOException
     *                if any error occurred during saving.
     */
    public void save(OutputStream out) throws IOException {

        try {
            cred.save(out);
        } catch (CertificateEncodingException e) {
            throw new ChainedIOException(e.getMessage(), e);
        }
    }

    /**
     * Verifies the validity of the credentials. All certificate path validation is performed using trusted
     * certificates in default locations.
     *
     * @exception GlobusCredentialException
     *                if one of the certificates in the chain expired or if path validiation fails.
     */
    public void verify() throws GlobusCredentialException {
        try {
            String caCertsLocation = "file:" + CoGProperties.getDefault().getCaCertLocations();
            String crlPattern = caCertsLocation + "/*.r*";
            String sigPolPattern = caCertsLocation + "/*.signing_policy";
            KeyStore keyStore = KeyStore.getInstance(GlobusProvider.KEYSTORE_TYPE, GlobusProvider.PROVIDER_NAME);
            CertStore crlStore = CertStore.getInstance(GlobusProvider.CERTSTORE_TYPE, new ResourceCertStoreParameters(null,crlPattern));
            ResourceSigningPolicyStore sigPolStore = new ResourceSigningPolicyStore(new ResourceSigningPolicyStoreParameters(sigPolPattern));
            keyStore.load(KeyStoreParametersFactory.createTrustStoreParameters(caCertsLocation));
            X509ProxyCertPathParameters parameters = new X509ProxyCertPathParameters(keyStore, crlStore, sigPolStore, false);
            X509ProxyCertPathValidator validator = new X509ProxyCertPathValidator();
            validator.engineValidate(CertificateUtil.getCertPath(this.cred.getCertificateChain()), parameters);
        } catch (Exception e) {
        	e.printStackTrace();
            throw new GlobusCredentialException(GlobusCredentialException.FAILURE, e.getMessage(), e);
        }
    }

    /**
     * Returns the identity certificate of this credential. The identity certificate is the first certificate
     * in the chain that is not an impersonation proxy certificate.
     *
     * @return X509Certificate the identity cert. Null, if unable to get the identity certificate
     *         (an error occurred)
     */
    public X509Certificate getIdentityCertificate() {
        return cred.getIdentityCertificate();
    }

    /**
     * Returns the path length constraint. The shortest length in the chain of certificates is returned as the
     * credential's path length.
     *
     * @return The path length constraint of the credential. -1 is any error occurs.
     */
    public int getPathConstraint() {
        return cred.getPathConstraint();
    }

    /**
     * Returns the identity of this credential.
     *
     * @see #getIdentityCertificate()
     *
     * @return The identity cert in Globus format (e.g. /C=US/..). Null, if unable to get the identity (an
     *         error occurred)
     */
    public String getIdentity() {
        return cred.getIdentity();
    }

    /**
     * Returns the private key of this credential.
     *
     * @return PrivateKey the private key
     */
    public PrivateKey getPrivateKey() {
        try {
            return (PrivateKey) cred.getPrivateKey();
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * Returns the certificate chain of this credential.
     *
     * @return X509Certificate [] the certificate chain
     */
    public X509Certificate[] getCertificateChain() {
        return cred.getCertificateChain();
    }

    /**
     * Returns the number of certificates in the credential without the self-signed certificates.
     *
     * @return number of certificates without counting self-signed certificates
     */
    public int getCertNum() {
        return cred.getCertNum();
    }

    /**
     * Returns strength of the private/public key in bits.
     *
     * @return strength of the key in bits. Returns -1 if unable to determine it.
     */
    public int getStrength() {
        try {
            return cred.getStrength();
        } catch (Exception e) {
            return -1;
        }
    }

    /**
     * Returns the subject DN of the first certificate in the chain.
     *
     * @return subject DN.
     */
    public String getSubject() {
        return cred.getSubject();
    }

    /**
     * Returns the issuer DN of the first certificate in the chain.
     *
     * @return issuer DN.
     */
    public String getIssuer() {
        return cred.getIssuer();
    }

    /**
     * Returns the certificate type of the first certificate in the chain. Returns -1 if unable to determine
     * the certificate type (an error occurred)
     *
     * @see BouncyCastleUtil#getCertificateType(X509Certificate)
     *
     * @return the type of first certificate in the chain. -1 if unable to determine the certificate type.
     */
    public int getProxyType() {
        return cred.getProxyType().getCode();
    }

    /**
     * Returns time left of this credential. The time left of the credential is based on the certificate with
     * the shortest validity time.
     *
     * @return time left in seconds. Returns 0 if the certificate has expired.
     */
    public long getTimeLeft() {
        return cred.getTimeLeft();
    }

    /**
     * Returns the default credential. The default credential is usually the user proxy certificate. 
* The credential will be loaded on the initial call. It must not be expired. All subsequent calls to this * function return cached credential object. Once the credential is cached, and the underlying file * changes, the credential will be reloaded. * * @return the default credential. * @exception GlobusCredentialException * if the credential expired or some other error with the credential. */ public synchronized static GlobusCredential getDefaultCredential() throws GlobusCredentialException { if (defaultCred == null) { reloadDefaultCredential(); } else if (!credentialSet) { if (credentialFile.lastModified() == credentialLastModified) { defaultCred.verify(); } else { defaultCred = null; reloadDefaultCredential(); } } return defaultCred; } private static void reloadDefaultCredential() throws GlobusCredentialException { String proxyLocation = CoGProperties.getDefault().getProxyFile(); defaultCred = new GlobusCredential(proxyLocation); credentialFile = new File(proxyLocation); credentialLastModified = credentialFile.lastModified(); defaultCred.verify(); } /** * Sets default credential. * * @param cred * the credential to set a default. */ public synchronized static void setDefaultCredential(GlobusCredential cred) { credentialSet = (cred != null); } public String toString() { return cred.toString(); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy