/* * 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.trustmanager; import org.globus.gsi.util.ProxyCertificateUtil; import org.globus.gsi.provider.SigningPolicyStore; import java.security.cert.CertPathValidatorException; import java.security.cert.CertStoreException; import java.security.cert.X509Certificate; import javax.security.auth.x500.X500Principal; import org.globus.gsi.GSIConstants; import org.globus.gsi.SigningPolicy; /** * This checks to make sure the Distinguished Name in the certificate is valid according to the signing policy. */ public class SigningPolicyChecker implements CertificateChecker { private SigningPolicyStore policyStore; public SigningPolicyChecker(SigningPolicyStore policyStore) { this.policyStore = policyStore; } /** * Validate DN against the signing policy * * @param cert The certificate to check. * @param certType The type of certificate to check. * @throws CertPathValidatorException if the certificate is invalid according to the signing policy. */ public void invoke(X509Certificate cert, GSIConstants.CertificateType certType) throws CertPathValidatorException { if (!requireSigningPolicyCheck(certType)) { return; } X500Principal caPrincipal = cert.getIssuerX500Principal(); SigningPolicy policy; try { policy = this.policyStore.getSigningPolicy(caPrincipal); } catch (CertStoreException e) { throw new CertPathValidatorException(e); } if (policy == null) { throw new CertPathValidatorException("No signing policy for " + cert.getIssuerDN()); } boolean valid = policy.isValidSubject(cert.getSubjectX500Principal()); if (!valid) { throw new CertPathValidatorException("Certificate " + cert.getSubjectDN() + " violates signing policy for CA " + caPrincipal.getName()); } } /** * if a certificate is not a CA or if it is not a proxy, return true. * * @param certType The type of Certificate being queried. * @return True if the CertificateType requires a Signing Policy check. */ private boolean requireSigningPolicyCheck(GSIConstants.CertificateType certType) { return !ProxyCertificateUtil.isProxy(certType) && certType != GSIConstants.CertificateType.CA; } }