יצירת רשות אישורים משנית

בדף הזה מוסבר איך ליצור רשויות אישורים (CA) משניות במאגר CA.

רשויות CA משניות אחראיות להנפקת אישורים ישירות לישויות קצה כמו משתמשים, מחשבים ומכשירים. רשויות אישורים משניות (subordinate) נחתמות באופן קריפטוגרפי על ידי רשות אישורים ראשית (parent), שלרוב היא רשות האישורים הבסיסית (root). כתוצאה מכך, מערכות שסומכות על ה-CA הבסיסי, סומכות באופן אוטומטי על ה-CA המשני ועל האישורים של ישויות הקצה שה-CA המשני מנפיק.

לפני שמתחילים

יצירת רשות אישורים משנית

קל יותר לבטל ולשנות רשויות אישורים משניות מאשר רשויות אישורים בסיסיות. אם יש לכם כמה תרחישים להנפקת אישורים, אתם יכולים ליצור רשות אישורים משנית לכל אחד מהתרחישים האלה. הוספה של כמה רשויות אישורים משניות למאגר רשויות אישורים עוזרת לכם להשיג איזון עומסים טוב יותר של בקשות אישורים וערך כולל גבוה יותר של שאילתות בפועל לשנייה.

כדי ליצור רשות אישורים משנית:

המסוף

  1. נכנסים לדף Certificate Authority Service במסוףGoogle Cloud .

    כניסה אל Certificate Authority Service

  2. לוחצים על הכרטיסייה מנהל רשויות אישורים.

  3. לוחצים על יצירת רשות אישורים.

    יוצרים רשות אישורים באמצעות מסוף Cloud.

בחירת סוג רשות האישורים

  1. לוחצים על Subordinate CA (רשות אישורים משנית).
  2. לוחצים על Root CA is in Google Cloud (רשות אישורי הבסיס נמצאת ב-Google Cloud).
  3. בשדה Valid for (תוקף עד), מזינים את משך הזמן שבו רוצים שהאישור של רשות האישורים יהיה בתוקף.
  4. אופציונלי: בוחרים את הרמה של רשות האישורים. רמת ברירת המחדל היא Enterprise. מידע נוסף זמין במאמר בנושא בחירת רמות הפעולה.
  5. לוחצים על אזור כדי לבחור מיקום עבור הרשות המנפיקה. מידע נוסף זמין במאמר מיקומים.
  6. אופציונלי: בקטע סטטוס התחלתי, בוחרים את הסטטוס התפעולי שבו רוצים ליצור את רשות האישורים.
  7. אופציונלי: בקטע הגדרת תרחיש הנפקה, לוחצים על פרופיל אישור ובוחרים מהרשימה את פרופיל האישור שהכי מתאים לדרישות שלכם. מידע נוסף זמין במאמר בנושא פרופילים של אישורים.
  8. לוחצים על הבא.
הגדרה של שם הנושא של CA
  1. בשדה ארגון (O), מזינים את שם החברה.
  2. אופציונלי: בשדה יחידה ארגונית (OU), מזינים את החלוקה המשנית של החברה או את היחידה העסקית.
  3. אופציונלי: בשדה שם המדינה (C), מזינים קוד מדינה בן שתי אותיות.
  4. אופציונלי: בשדה State or province name (שם המדינה או הפרובינציה), מזינים את שם המדינה.
  5. אופציונלי: בשדה שם היישוב, מזינים את שם העיר.
  6. בשדה שם נפוץ (CN) של רשות האישורים, מזינים את שם רשות האישורים.
  7. לוחצים על Continue.
הגדרה של גודל המפתח והאלגוריתם של רשות האישורים
  1. בוחרים את אלגוריתם המפתח שהכי מתאים לצרכים שלכם. פרטים נוספים על אפשרויות מפתחות החתימה זמינים במאמר הגדרת מפתחות חתימה של רשות אישורים.
  2. כדי להשתמש במפתח חתימה בניהול הלקוח, בוחרים באפשרות מפתח בניהול הלקוח ומזינים את הגרסה של המפתח הקריפטוגרפי ב-Cloud Key Management Service.
  3. לוחצים על Continue.
הגדרת ארטיפקטים של CA
  1. בוחרים אם רוצים להשתמש בקטגוריה של Cloud Storage שמנוהלת על ידי Google או בקטגוריה שמנוהלת על ידי הלקוח.
    1. בקטגוריה של Cloud Storage בניהול Google, שירות CA יוצר קטגוריה בניהול Google באותו מיקום שבו נמצא ה-CA.
    2. כדי לבחור קטגוריה של Cloud Storage בניהול הלקוח, לוחצים על Browse ובוחרים אחת מהקטגוריות הקיימות של Cloud Storage.
  2. לוחצים על Continue.
הוספת תוויות

השלבים הבאים הם אופציונליים.

כדי להוסיף תוויות לקהל המקור:

  1. לוחצים על הוספת פריט.
  2. בשדה מפתח 1, מזינים את מפתח התווית.
  3. בשדה ערך 1, מזינים את ערך התווית.
  4. אם רוצים להוסיף עוד תווית, לוחצים על הוספת פריט. לאחר מכן, מוסיפים את המפתח והערך של התווית כמו שצוין בשלבים 2 ו-3.
  5. לוחצים על Continue.
בדיקת ההגדרות

בודקים בקפידה את כל ההגדרות ולוחצים על סיום כדי ליצור את רשות האישורים.

gcloud

  1. יוצרים מאגר של רשויות אישורים בשביל רשות האישורים המשנית:

    gcloud privateca pools create SUBORDINATE_POOL_ID --location=LOCATION
    

    מחליפים את מה שכתוב בשדות הבאים:

    • SUBORDINATE_POOL_ID: השם של מאגר רשות האישורים
    • LOCATION: המיקום שבו רוצים ליצור את מאגר רשויות האישורים. רשימה מלאה של המיקומים זמינה במאמר בנושא מיקומים.

    מידע נוסף על יצירת מאגרי CA זמין במאמר יצירת מאגר CA.

    מידע נוסף על הפקודה gcloud privateca pools create זמין במאמר בנושא gcloud privateca pools create.

  2. יוצרים רשות אישורים משנית במאגר רשויות האישורים שנוצר.

    gcloud privateca subordinates create SUBORDINATE_CA_ID \
        --pool=SUBORDINATE_POOL_ID \
        --location=LOCATION \
        --issuer-pool=ISSUER_POOL_ID \
        --issuer-location=ISSUER_LOCATION \
        --key-algorithm="ec-p256-sha256" \
        --subject="CN=Example Server TLS CA, O=Example LLC"
    

    מחליפים את מה שכתוב בשדות הבאים:

    • SUBORDINATE_CA_ID: המזהה הייחודי של רשות האישורים המשנית
    • SUBORDINATE_POOL_ID: השם של מאגר רשות האישורים
    • LOCATION: המיקום של מאגר אישורי ה-CA
    • ISSUER_POOL_ID: שם מאגר רשויות האישורים שמכיל את רשות האישורים המנפיקה
    • ISSUER_LOCATION: המיקום של מאגר רשויות האישורים שמכיל את רשות האישורים המנפיקה

      הדגל --key-algorithm מציין את האלגוריתם הקריפטוגרפי שבו רוצים להשתמש ליצירת מפתח מנוהל של Cloud HSM עבור רשות האישורים.

      הדגל --subject מציין את שם הנושא של האישור לפי X.501.

    כדי ליצור CA משני באמצעות מפתח חתימה בניהול הלקוח, מריצים את הפקודה הבאה:

    gcloud privateca subordinates create SUBORDINATE_CA_ID \
        --pool=SUBORDINATE_POOL_ID \
        --location=LOCATION \
        --issuer-pool=ISSUER_POOL_ID \
        --issuer-location=ISSUER_LOCATION \
        --kms-key-version=KMS_KEY_VERSION \
        --subject="CN=Example Server TLS CA, O=Example LLC"
    

    מחליפים את מה שכתוב בשדות הבאים:

    • SUBORDINATE_POOL_ID: השם של מאגר רשות האישורים
    • LOCATION: המיקום של מאגר אישורי ה-CA
    • ISSUER_POOL_ID: שם מאגר רשויות האישורים שמכיל את רשות האישורים המנפיקה
    • ISSUER_LOCATION: המיקום של מאגר רשויות האישורים שמכיל את רשות האישורים המנפיקה
    • KMS_KEY_VERSION: מזהה המשאב המלא של גרסה של מפתח קריפטוגרפי ב-Cloud KMS בניהול הלקוח, לשימוש כמפתח חתימה

    פרטים נוספים על אפשרויות של מפתחות חתימה ועל הכנת מפתח חתימה בניהול הלקוח מופיעים במאמר בנושא הגדרת מפתחות חתימה של רשות אישורים.

    ההצהרה הבאה מוחזרת כשיוצרים רשות אישורים משנית.

    Created Certificate Authority [projects/my-project-pki/locations/us-west1/caPools/SUBORDINATE_POOL_ID/certificateAuthorities/SUBORDINATE_CA_ID].
    

    כדי לציין כתובות URL מותאמות אישית לגישה למידע על רשות (AIA) ולנקודת הפצה של רשימת ביטול אישורים (CRL) ‏(CDP), משתמשים בדגלים --custom-aia-urls ו---custom-cdp-urls. אם מציינים כתובות URL כאלה, הן נכללות בכל האישורים שהונפקו על ידי CA ומחליפות את כתובות ה-URL של הגישה לקטגוריית Cloud Storage שמוגדרות כברירת מחדל.

    כדי לראות רשימה מלאה של ההגדרות, מריצים את הפקודה הבאה של gcloud:

    gcloud privateca subordinates create --help
    

    הפקודה מחזירה דוגמאות ליצירת רשות אישורים משנית שהמוסד המנפיק שלה נמצא בשירות CA או במקום אחר.

Terraform

resource "google_privateca_certificate_authority" "root_ca" {
  // This example assumes this pool already exists.
  // Pools cannot be deleted in normal test circumstances, so we depend on static pools
  pool                                   = "my-pool"
  certificate_authority_id               = "my-certificate-authority-root"
  location                               = "us-central1"
  deletion_protection                    = false # set to true to prevent destruction of the resource
  ignore_active_certificates_on_deletion = true
  config {
    subject_config {
      subject {
        organization = "ACME"
        common_name  = "my-certificate-authority"
      }
    }
    x509_config {
      ca_options {
        # is_ca *MUST* be true for certificate authorities
        is_ca = true
      }
      key_usage {
        base_key_usage {
          # cert_sign and crl_sign *MUST* be true for certificate authorities
          cert_sign = true
          crl_sign  = true
        }
        extended_key_usage {
        }
      }
    }
  }
  key_spec {
    algorithm = "RSA_PKCS1_4096_SHA256"
  }
  // valid for 10 years
  lifetime = "${10 * 365 * 24 * 3600}s"
}

resource "google_privateca_certificate_authority" "sub_ca" {
  // This example assumes this pool already exists.
  // Pools cannot be deleted in normal test circumstances, so we depend on static pools
  pool                     = "my-sub-pool"
  certificate_authority_id = "my-certificate-authority-sub"
  location                 = "us-central1"
  deletion_protection      = false # set to true to prevent destruction of the resource
  subordinate_config {
    certificate_authority = google_privateca_certificate_authority.root_ca.name
  }
  config {
    subject_config {
      subject {
        organization = "ACME"
        common_name  = "my-subordinate-authority"
      }
    }
    x509_config {
      ca_options {
        is_ca = true
        # Force the sub CA to only issue leaf certs.
        # Use e.g.
        #    max_issuer_path_length = 1
        # if you need to chain more subordinates.
        zero_max_issuer_path_length = true
      }
      key_usage {
        base_key_usage {
          cert_sign = true
          crl_sign  = true
        }
        extended_key_usage {
        }
      }
    }
  }
  // valid for 5 years
  lifetime = "${5 * 365 * 24 * 3600}s"
  key_spec {
    algorithm = "RSA_PKCS1_2048_SHA256"
  }
  type = "SUBORDINATE"
}

Java

כדי לבצע אימות ב-CA Service, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.


import com.google.api.core.ApiFuture;
import com.google.cloud.security.privateca.v1.CaPoolName;
import com.google.cloud.security.privateca.v1.CertificateAuthority;
import com.google.cloud.security.privateca.v1.CertificateAuthority.KeyVersionSpec;
import com.google.cloud.security.privateca.v1.CertificateAuthority.SignHashAlgorithm;
import com.google.cloud.security.privateca.v1.CertificateAuthorityServiceClient;
import com.google.cloud.security.privateca.v1.CertificateConfig;
import com.google.cloud.security.privateca.v1.CertificateConfig.SubjectConfig;
import com.google.cloud.security.privateca.v1.CreateCertificateAuthorityRequest;
import com.google.cloud.security.privateca.v1.KeyUsage;
import com.google.cloud.security.privateca.v1.KeyUsage.KeyUsageOptions;
import com.google.cloud.security.privateca.v1.Subject;
import com.google.cloud.security.privateca.v1.SubjectAltNames;
import com.google.cloud.security.privateca.v1.X509Parameters;
import com.google.cloud.security.privateca.v1.X509Parameters.CaOptions;
import com.google.longrunning.Operation;
import com.google.protobuf.Duration;
import java.io.IOException;
import java.util.concurrent.ExecutionException;

public class CreateSubordinateCa {

  public static void main(String[] args)
      throws InterruptedException, ExecutionException, IOException {
    // TODO(developer): Replace these variables before running the sample.
    // location: For a list of locations, see:
    // https://cloud.google.com/certificate-authority-service/docs/locations
    // poolId: Set it to the CA Pool under which the CA should be created.
    // subordinateCaName: Unique name for the Subordinate CA.
    String project = "your-project-id";
    String location = "ca-location";
    String poolId = "ca-pool-id";
    String subordinateCaName = "subordinate-certificate-authority-name";

    createSubordinateCertificateAuthority(project, location, poolId, subordinateCaName);
  }

  public static void createSubordinateCertificateAuthority(
      String project, String location, String poolId, String subordinateCaName)
      throws IOException, ExecutionException, InterruptedException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the `certificateAuthorityServiceClient.close()` method on the client to safely
    // clean up any remaining background resources.
    try (CertificateAuthorityServiceClient certificateAuthorityServiceClient =
        CertificateAuthorityServiceClient.create()) {

      String commonName = "commonname";
      String orgName = "csr-org-name";
      String domainName = "dns.example.com";
      int caDuration = 100000; // Validity of this CA in seconds.

      // Set the type of Algorithm.
      KeyVersionSpec keyVersionSpec =
          KeyVersionSpec.newBuilder().setAlgorithm(SignHashAlgorithm.RSA_PKCS1_4096_SHA256).build();

      // Set CA subject config.
      SubjectConfig subjectConfig =
          SubjectConfig.newBuilder()
              .setSubject(
                  Subject.newBuilder().setCommonName(commonName).setOrganization(orgName).build())
              // Set the fully qualified domain name.
              .setSubjectAltName(SubjectAltNames.newBuilder().addDnsNames(domainName).build())
              .build();

      //  Set the key usage options for X.509 fields.
      X509Parameters x509Parameters =
          X509Parameters.newBuilder()
              .setKeyUsage(
                  KeyUsage.newBuilder()
                      .setBaseKeyUsage(
                          KeyUsageOptions.newBuilder().setCrlSign(true).setCertSign(true).build())
                      .build())
              .setCaOptions(CaOptions.newBuilder().setIsCa(true).build())
              .build();

      // Set certificate authority settings.
      CertificateAuthority subCertificateAuthority =
          CertificateAuthority.newBuilder()
              .setType(CertificateAuthority.Type.SUBORDINATE)
              .setKeySpec(keyVersionSpec)
              .setConfig(
                  CertificateConfig.newBuilder()
                      .setSubjectConfig(subjectConfig)
                      .setX509Config(x509Parameters)
                      .build())
              // Set the CA validity duration.
              .setLifetime(Duration.newBuilder().setSeconds(caDuration).build())
              .build();

      // Create the CertificateAuthorityRequest.
      CreateCertificateAuthorityRequest subCertificateAuthorityRequest =
          CreateCertificateAuthorityRequest.newBuilder()
              .setParent(CaPoolName.of(project, location, poolId).toString())
              .setCertificateAuthorityId(subordinateCaName)
              .setCertificateAuthority(subCertificateAuthority)
              .build();

      // Create Subordinate CA.
      ApiFuture<Operation> futureCall =
          certificateAuthorityServiceClient
              .createCertificateAuthorityCallable()
              .futureCall(subCertificateAuthorityRequest);

      Operation response = futureCall.get();

      if (response.hasError()) {
        System.out.println("Error while creating Subordinate CA !" + response.getError());
        return;
      }

      System.out.println(
          "Subordinate Certificate Authority created successfully : " + subordinateCaName);
    }
  }
}

Python

כדי לבצע אימות ב-CA Service, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

import google.cloud.security.privateca_v1 as privateca_v1
from google.protobuf import duration_pb2


def create_subordinate_ca(
    project_id: str,
    location: str,
    ca_pool_name: str,
    subordinate_ca_name: str,
    common_name: str,
    organization: str,
    domain: str,
    ca_duration: int,
) -> None:
    """
    Create Certificate Authority (CA) which is the subordinate CA in the given CA Pool.
    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        location: location you want to use. For a list of locations, see: https://cloud.google.com/certificate-authority-service/docs/locations.
        ca_pool_name: set it to the CA Pool under which the CA should be created.
        subordinate_ca_name: unique name for the Subordinate CA.
        common_name: a title for your certificate authority.
        organization: the name of your company for your certificate authority.
        domain: the name of your company for your certificate authority.
        ca_duration: the validity of the certificate authority in seconds.
    """

    ca_service_client = privateca_v1.CertificateAuthorityServiceClient()

    # Set the type of Algorithm
    key_version_spec = privateca_v1.CertificateAuthority.KeyVersionSpec(
        algorithm=privateca_v1.CertificateAuthority.SignHashAlgorithm.RSA_PKCS1_4096_SHA256
    )

    # Set CA subject config.
    subject_config = privateca_v1.CertificateConfig.SubjectConfig(
        subject=privateca_v1.Subject(
            common_name=common_name, organization=organization
        ),
        # Set the fully qualified domain name.
        subject_alt_name=privateca_v1.SubjectAltNames(dns_names=[domain]),
    )

    # Set the key usage options for X.509 fields.
    x509_parameters = privateca_v1.X509Parameters(
        key_usage=privateca_v1.KeyUsage(
            base_key_usage=privateca_v1.KeyUsage.KeyUsageOptions(
                crl_sign=True,
                cert_sign=True,
            )
        ),
        ca_options=privateca_v1.X509Parameters.CaOptions(
            is_ca=True,
        ),
    )

    # Set certificate authority settings.
    certificate_authority = privateca_v1.CertificateAuthority(
        type_=privateca_v1.CertificateAuthority.Type.SUBORDINATE,
        key_spec=key_version_spec,
        config=privateca_v1.CertificateConfig(
            subject_config=subject_config,
            x509_config=x509_parameters,
        ),
        # Set the CA validity duration.
        lifetime=duration_pb2.Duration(seconds=ca_duration),
    )

    ca_pool_path = ca_service_client.ca_pool_path(project_id, location, ca_pool_name)

    # Create the CertificateAuthorityRequest.
    request = privateca_v1.CreateCertificateAuthorityRequest(
        parent=ca_pool_path,
        certificate_authority_id=subordinate_ca_name,
        certificate_authority=certificate_authority,
    )

    operation = ca_service_client.create_certificate_authority(request=request)
    result = operation.result()

    print(f"Operation result: {result}")

הפעלה של רשות אישורים משנית

כדי להפעיל רשות אישורים משנית:

המסוף

  1. נכנסים לדף Certificate Authority Service במסוףGoogle Cloud .

    כניסה אל Certificate Authority Service

  2. לוחצים על הכרטיסייה מנהל רשויות אישורים.

  3. בקטע רשויות אישורים, בוחרים את רשות האישורים שרוצים להפעיל.

  4. לוחצים על הפעלה.

  5. בתיבת הדו-שיח שנפתחת, לוחצים על הורדת CSR כדי להוריד את קובץ ה-CSR בקידוד PEM שרשות האישורים המנפיקה יכולה לחתום עליו.

  6. לוחצים על הבא.

  7. בשדה העלאת שרשרת אישורים, לוחצים על עיון.

  8. מעלים את קובץ האישור החתום עם הסיומת .crt.

  9. לוחצים על הפעלה.

gcloud

כדי להפעיל CA משני שנוצר לאחרונה, מריצים את הפקודה הבאה:

gcloud privateca subordinates enable SUBORDINATE_CA_ID \
--pool=SUBORDINATE_POOL_ID \
--location=LOCATION

מחליפים את מה שכתוב בשדות הבאים:

  • SUBORDINATE_CA_ID: המזהה הייחודי של רשות האישורים המשנית
  • SUBORDINATE_POOL_ID: השם של מאגר רשויות האישורים שמכיל את רשות האישורים המשנית
  • LOCATION: המיקום של מאגר אישורי ה-CA. כאן מפורטת רשימת המיקומים המלאה.

מידע נוסף על הפקודה gcloud privateca subordinates enable זמין במאמר gcloud privateca subordinates enable.

Terraform

מגדירים את השדה desired_state לערך ENABLED ב-CA המשני ומריצים את הפקודה terraform apply.

המאמרים הבאים