Beispiel #1
0
    def Run(self, args):
        client = privateca_base.GetClientInstance('v1')
        messages = privateca_base.GetMessagesModule('v1')

        cert_template_ref = args.CONCEPTS.certificate_template.Parse()

        flags_v1.ValidateIdentityConstraints(args)

        new_cert_template = messages.CertificateTemplate(
            predefinedValues=flags_v1.ParsePredefinedValues(args),
            identityConstraints=flags_v1.ParseIdentityConstraints(args),
            passthroughExtensions=flags_v1.ParseExtensionConstraints(args),
            description=args.description
            if args.IsSpecified('description') else None)

        operation = client.projects_locations_certificateTemplates.Create(
            messages.
            PrivatecaProjectsLocationsCertificateTemplatesCreateRequest(
                parent=cert_template_ref.Parent().RelativeName(),
                certificateTemplateId=cert_template_ref.Name(),
                certificateTemplate=new_cert_template,
                requestId=request_utils.GenerateRequestId()))

        cert_template_response = operations.Await(
            operation, 'Creating Certificate Template.', api_version='v1')
        cert_template = operations.GetMessageFromResponse(
            cert_template_response, messages.CertificateTemplate)

        log.status.Print('Created Certificate Template [{}].'.format(
            cert_template.name))
Beispiel #2
0
    def Run(self, args):
        cert_ref = _ParseCertificateResource(args)

        reason = flags.ParseRevocationChoiceToEnum(args.reason)

        client = privateca_base.GetClientInstance()
        messages = privateca_base.GetMessagesModule()

        operation = client.projects_locations_certificateAuthorities_certificates.Revoke(
            messages.
            PrivatecaProjectsLocationsCertificateAuthoritiesCertificatesRevokeRequest(
                name=cert_ref.RelativeName(),
                revokeCertificateRequest=messages.RevokeCertificateRequest(
                    reason=reason,
                    requestId=request_utils.GenerateRequestId())))

        response = operations.Await(operation, 'Revoking Certificate.')
        certificate = operations.GetMessageFromResponse(
            response, messages.Certificate)

        log.status.Print('Publishing a new Certificate Revocation List.')
        client.projects_locations_certificateAuthorities.PublishCrl(
            messages.
            PrivatecaProjectsLocationsCertificateAuthoritiesPublishCrlRequest(
                name=cert_ref.Parent().RelativeName(),
                publishCertificateRevocationListRequest=messages.
                PublishCertificateRevocationListRequest()))

        revoke_time = times.ParseDateTime(
            certificate.revocationDetails.revocationTime)
        log.status.Print('Revoked certificate [{}] at {}.'.format(
            certificate.name,
            times.FormatDateTime(revoke_time, tzinfo=times.LOCAL)))
  def Run(self, args):
    new_ca, ca_ref, _ = create_utils.CreateCAFromArgs(
        args, is_subordinate=False)
    project_ref = ca_ref.Parent().Parent()
    key_version_ref = args.CONCEPTS.kms_key_version.Parse()
    kms_key_ref = key_version_ref.Parent() if key_version_ref else None

    iam.CheckCreateCertificateAuthorityPermissions(project_ref, kms_key_ref)

    bucket_ref = None
    if args.IsSpecified('bucket'):
      bucket_ref = storage.ValidateBucketForCertificateAuthority(args.bucket)
      new_ca.gcsBucket = bucket_ref.bucket

    p4sa_email = p4sa.GetOrCreate(project_ref)
    p4sa.AddResourceRoleBindings(p4sa_email, kms_key_ref, bucket_ref)

    create_utils.PrintBetaResourceDeletionDisclaimer('certificate authorities')
    operation = self.client.projects_locations_certificateAuthorities.Create(
        self.messages
        .PrivatecaProjectsLocationsCertificateAuthoritiesCreateRequest(
            certificateAuthority=new_ca,
            certificateAuthorityId=ca_ref.Name(),
            parent=ca_ref.Parent().RelativeName(),
            requestId=request_utils.GenerateRequestId()))

    ca_response = operations.Await(operation, 'Creating Certificate Authority.')
    ca = operations.GetMessageFromResponse(ca_response,
                                           self.messages.CertificateAuthority)

    log.status.Print('Created Certificate Authority [{}].'.format(ca.name))
Beispiel #4
0
    def Run(self, args):
        client = privateca_base.GetClientInstance('v1')
        messages = privateca_base.GetMessagesModule('v1')

        ca_pool_ref = args.CONCEPTS.ca_pool.Parse()
        issuance_policy = flags_v1.ParseIssuancePolicy(args)
        publishing_options = flags_v1.ParsePublishingOptions(args)
        tier = flags_v1.ParseTierFlag(args)
        labels = labels_util.ParseCreateArgs(args, messages.CaPool.LabelsValue)
        new_ca_pool = messages.CaPool(issuancePolicy=issuance_policy,
                                      publishingOptions=publishing_options,
                                      tier=tier,
                                      labels=labels)
        operation = client.projects_locations_caPools.Create(
            messages.PrivatecaProjectsLocationsCaPoolsCreateRequest(
                caPool=new_ca_pool,
                caPoolId=ca_pool_ref.Name(),
                parent=ca_pool_ref.Parent().RelativeName(),
                requestId=request_utils.GenerateRequestId()))

        ca_pool_response = operations.Await(operation,
                                            'Creating CA Pool.',
                                            api_version='v1')
        ca_pool = operations.GetMessageFromResponse(ca_pool_response,
                                                    messages.CaPool)

        log.status.Print('Created CA Pool [{}].'.format(ca_pool.name))
Beispiel #5
0
    def Run(self, args):
        kms_key_version_ref, ca_ref = self.ParseResourceArgs(args)
        kms_key_ref = kms_key_version_ref.Parent()
        project_ref = ca_ref.Parent().Parent()

        subject_config = flags.ParseSubjectFlags(args, is_ca=True)
        issuing_options = flags.ParseIssuingOptions(args)
        issuance_policy = flags.ParseIssuancePolicy(args)
        reusable_config_wrapper = flags.ParseReusableConfig(args,
                                                            ca_ref.locationsId,
                                                            is_ca=True)
        lifetime = flags.ParseValidityFlag(args)
        labels = labels_util.ParseCreateArgs(
            args, self.messages.CertificateAuthority.LabelsValue)

        iam.CheckCreateCertificateAuthorityPermissions(project_ref,
                                                       kms_key_ref)

        p4sa_email = p4sa.GetOrCreate(project_ref)
        bucket_ref = storage.CreateBucketForCertificateAuthority(ca_ref)

        p4sa.AddResourceRoleBindings(p4sa_email, kms_key_ref, bucket_ref)

        new_ca = self.messages.CertificateAuthority(
            type=self.messages.CertificateAuthority.TypeValueValuesEnum.
            SELF_SIGNED,
            lifetime=lifetime,
            config=self.messages.CertificateConfig(
                reusableConfig=reusable_config_wrapper,
                subjectConfig=subject_config),
            cloudKmsKeyVersion=kms_key_version_ref.RelativeName(),
            certificatePolicy=issuance_policy,
            issuingOptions=issuing_options,
            gcsBucket=bucket_ref.bucket,
            labels=labels)

        operation = self.client.projects_locations_certificateAuthorities.Create(
            self.messages.
            PrivatecaProjectsLocationsCertificateAuthoritiesCreateRequest(
                certificateAuthority=new_ca,
                certificateAuthorityId=ca_ref.Name(),
                parent=ca_ref.Parent().RelativeName(),
                requestId=request_utils.GenerateRequestId()))

        ca_response = operations.Await(operation,
                                       'Creating Certificate Authority.')
        ca = operations.GetMessageFromResponse(
            ca_response, self.messages.CertificateAuthority)

        log.status.Print('Creating the initial Certificate Revocation List.')
        self.client.projects_locations_certificateAuthorities.PublishCrl(
            self.messages.
            PrivatecaProjectsLocationsCertificateAuthoritiesPublishCrlRequest(
                name=ca.name,
                publishCertificateRevocationListRequest=self.messages.
                PublishCertificateRevocationListRequest()))

        log.status.Print('Created Certificate Authority [{}].'.format(ca.name))
Beispiel #6
0
    def Run(self, args):
        client = privateca_base.GetClientInstance()
        messages = privateca_base.GetMessagesModule()

        cert_ref = args.CONCEPTS.certificate.Parse()
        if not cert_ref:
            raise exceptions.InvalidArgumentException(
                'CERTIFICATE', 'A certificate resource must be specified.')

        labels = labels_util.ParseCreateArgs(args,
                                             messages.Certificate.LabelsValue)

        request = messages.PrivatecaProjectsLocationsCertificateAuthoritiesCertificatesCreateRequest(
        )
        request.certificate = messages.Certificate()
        request.certificateId = cert_ref.Name()
        request.certificate.name = cert_ref.RelativeName()
        request.certificate.lifetime = flags.ParseValidityFlag(args)
        request.certificate.labels = labels
        request.parent = cert_ref.Parent().RelativeName()
        request.requestId = request_utils.GenerateRequestId()

        if args.csr:
            request.certificate.pemCsr = self._ReadCsr(request, args.csr)
        elif args.generate_key:
            request.certificate.config = self._GenerateCertificateConfig(
                request, args, cert_ref.locationsId)
        else:
            # This should not happen because of the required arg group, but protects
            # in case of future additions.
            raise exceptions.OneOfArgumentsRequiredException(
                ['--csr', '--generate-key'],
                ('To create a certificate, please specify either a CSR or the '
                 '--generate-key flag to create a new key.'))

        operation = client.projects_locations_certificateAuthorities_certificates.Create(
            request)
        cert_response = operations.Await(operation, 'Creating Certificate.')
        certificate = operations.GetMessageFromResponse(
            cert_response, messages.Certificate)

        if args.IsSpecified('cert_output_file'):
            self._WritePemChain(certificate.pemCertificate,
                                certificate.pemCertificateChain,
                                args.cert_output_file)

        log.status.Print('Created Certificate [{}].'.format(certificate.name))
Beispiel #7
0
    def Run(self, args):
        client = privateca_base.GetClientInstance()
        messages = privateca_base.GetMessagesModule()

        ca_ref = args.CONCEPTS.certificate_authority.Parse()

        if not console_io.PromptContinue(
                message=
                'You are about to schedule Certificate Authority [{}] for deletion in 30 days'
                .format(ca_ref.RelativeName()),
                default=True):
            log.status.Print('Aborted by user.')
            return

        current_ca = client.projects_locations_certificateAuthorities.Get(
            messages.
            PrivatecaProjectsLocationsCertificateAuthoritiesGetRequest(
                name=ca_ref.RelativeName()))

        resource_args.CheckExpectedCAType(
            messages.CertificateAuthority.TypeValueValuesEnum.SUBORDINATE,
            current_ca)

        operation = client.projects_locations_certificateAuthorities.ScheduleDelete(
            messages.
            PrivatecaProjectsLocationsCertificateAuthoritiesScheduleDeleteRequest(
                name=ca_ref.RelativeName(),
                scheduleDeleteCertificateAuthorityRequest=messages.
                ScheduleDeleteCertificateAuthorityRequest(
                    ignoreActiveCertificates=args.ignore_active_certificates,
                    requestId=request_utils.GenerateRequestId())))

        ca_response = operations.Await(
            operation, 'Scheduling Subordinate CA for deletion')
        ca = operations.GetMessageFromResponse(ca_response,
                                               messages.CertificateAuthority)

        formatted_deletion_time = times.ParseDateTime(
            ca.deleteTime).astimezone(tz.tzutc()).strftime('%Y-%m-%dT%H:%MZ')

        log.status.Print(
            'Scheduled Subordinate CA [{}] for deletion at {}.'.format(
                ca_ref.RelativeName(), formatted_deletion_time))
Beispiel #8
0
    def _SignCsr(self, issuer_ref, csr, lifetime):
        """Issues a certificate under the given issuer with the given settings."""
        certificate_id = 'subordinate-{}'.format(
            certificate_utils.GenerateCertId())
        certificate_name = '{}/certificates/{}'.format(
            issuer_ref.RelativeName(), certificate_id)
        cert_request = self.messages.PrivatecaProjectsLocationsCertificateAuthoritiesCertificatesCreateRequest(
            certificateId=certificate_id,
            parent=issuer_ref.RelativeName(),
            requestId=request_utils.GenerateRequestId(),
            certificate=self.messages.Certificate(name=certificate_name,
                                                  lifetime=lifetime,
                                                  pemCsr=csr))

        operation = self.client.projects_locations_certificateAuthorities_certificates.Create(
            cert_request)
        cert_response = operations.Await(operation, 'Signing CA cert.')
        return operations.GetMessageFromResponse(cert_response,
                                                 self.messages.Certificate)
    def Run(self, args):
        cert_ref = args.CONCEPTS.certificate.Parse()
        if cert_ref:
            cert_name = cert_ref.RelativeName()
        else:
            # Check to make sure the certificate was not partially provided.
            self.CheckCompleteResourceFlag(args, [
                'certificate', 'certificate_issuer',
                'certificate_issuer_location'
            ])
            ca_ref = args.CONCEPTS.issuer.Parse()
            if not ca_ref:
                # Check to make sure the certificate authority was not partially
                # provided.
                self.CheckCompleteResourceFlag(args,
                                               ['issuer', 'issuer_location'])
                raise exceptions.Invalid.ArgumentException(
                    '--issuer', 'Expected a value for the issuer.')
            cert_name = certificate_utils.GetCertificateBySerialNum(
                ca_ref, args.serial_number).name

        reason = flags.ParseRevocationChoiceToEnum(args.reason)

        client = privateca_base.GetClientInstance()
        messages = privateca_base.GetMessagesModule()

        operation = client.projects_locations_certificateAuthorities_certificates.Revoke(
            messages.
            PrivatecaProjectsLocationsCertificateAuthoritiesCertificatesRevokeRequest(
                name=cert_name,
                revokeCertificateRequest=messages.RevokeCertificateRequest(
                    reason=reason)))

        response = operations.Await(operation, 'Revoking Certificate.')
        certificate = operations.GetMessageFromResponse(
            response, messages.Certificate)

        revoke_time = times.ParseDateTime(
            certificate.revocationDetails.revocationTime)
        log.Print('Revoked certificate at {}.'.format(
            times.FormatDateTime(revoke_time, tzinfo=times.LOCAL)))
    def Run(self, args):
        client = privateca_base.GetClientInstance('v1')
        messages = privateca_base.GetMessagesModule('v1')

        cert_template_ref = args.CONCEPTS.certificate_template.Parse()
        template_name = cert_template_ref.RelativeName()

        current_cert_template = client.projects_locations_certificateTemplates.Get(
            messages.PrivatecaProjectsLocationsCertificateTemplatesGetRequest(
                name=template_name))

        cert_template_to_update, update_mask = self._UpdateCertificateTemplateFromArgs(
            args, current_cert_template.labels)

        # Confirm that the result of this update is intended to be identity
        # reflection, if applicable.
        flags_v1.ValidateIdentityConstraints(
            args,
            existing_copy_subj=current_cert_template.identityConstraints.
            allowSubjectPassthrough,
            existing_copy_sans=current_cert_template.identityConstraints.
            allowSubjectAltNamesPassthrough,
            for_update=True)

        operation = client.projects_locations_certificateTemplates.Patch(
            messages.
            PrivatecaProjectsLocationsCertificateTemplatesPatchRequest(
                name=template_name,
                certificateTemplate=cert_template_to_update,
                updateMask=','.join(update_mask),
                requestId=request_utils.GenerateRequestId()))

        cert_template_response = operations.Await(
            operation, 'Updating Certificate Template.', api_version='v1')
        cert_template = operations.GetMessageFromResponse(
            cert_template_response, messages.CertificateTemplate)

        log.status.Print('Updated Certificate Template [{}].'.format(
            cert_template.name))
Beispiel #11
0
    def Run(self, args):
        client = privateca_base.GetClientInstance(api_version='v1')
        messages = privateca_base.GetMessagesModule(api_version='v1')

        ca_ref = args.CONCEPTS.certificate_authority.Parse()
        ca_name = ca_ref.RelativeName()

        if args.skip_grace_period:
            prompt_message = (
                'You are about to delete Certificate Authority [{}] as '
                'soon as possible without a 30-day grace period where '
                'undeletion would have been allowed. If you proceed, there '
                'will be no way to recover this CA.').format(
                    ca_ref.RelativeName())
        else:
            prompt_message = (
                'You are about to delete Certificate Authority [{}]').format(
                    ca_ref.RelativeName())

        if not console_io.PromptContinue(message=prompt_message, default=True):
            log.status.Print('Aborted by user.')
            return

        current_ca = client.projects_locations_caPools_certificateAuthorities.Get(
            messages.
            PrivatecaProjectsLocationsCaPoolsCertificateAuthoritiesGetRequest(
                name=ca_name))

        resource_args.CheckExpectedCAType(
            messages.CertificateAuthority.TypeValueValuesEnum.SUBORDINATE,
            current_ca,
            version='v1')

        operation = client.projects_locations_caPools_certificateAuthorities.Delete(
            messages.
            PrivatecaProjectsLocationsCaPoolsCertificateAuthoritiesDeleteRequest(
                name=ca_name,
                ignoreActiveCertificates=args.ignore_active_certificates,
                skipGracePeriod=args.skip_grace_period,
                requestId=request_utils.GenerateRequestId()))
        try:
            ca_response = operations.Await(operation,
                                           'Deleting Subordinate CA',
                                           api_version='v1')
        except waiter.OperationError as e:
            # API error message refers to the proto field name which is slightly
            # different from the gcloud flag name.
            raise operations.OperationError(
                six.text_type(e).replace(
                    '`ignore_active_certificates` parameter',
                    '`--ignore-active-certificates` flag'))
        ca = operations.GetMessageFromResponse(ca_response,
                                               messages.CertificateAuthority)

        formatted_expire_time = times.ParseDateTime(ca.expireTime).astimezone(
            tz.tzutc()).strftime('%Y-%m-%dT%H:%MZ')

        if current_ca.state == messages.CertificateAuthority.StateValueValuesEnum.AWAITING_USER_ACTIVATION:
            log.status.Print(
                'Deleted Subordinate CA [{}]. This CA was never activated and cannot be recovered using `subordinates undelete`.'
                .format(ca_name))
        elif args.skip_grace_period:
            log.status.Print(
                'Deleted Subordinate CA [{}]. CA can not be undeleted.'.format(
                    ca_name))
        else:
            log.status.Print(
                'Deleted Subordinate CA [{}]. CA can be undeleted until {}.'.
                format(ca_name, formatted_expire_time))