注意:

使用 OCI 证书在 Apache Web 服务器上设置、创建和安装内部 CA 证书

简介

在快速发展的云计算和数字安全世界中,对管理数字证书的强大而灵活的解决方案的需求从未如此重要。Oracle Cloud Infrastructure (OCI) 证书服务是一个强大而可靠的工具,旨在简化 Oracle Cloud 生态系统内证书生命周期管理的复杂任务。OCI 证书是一项用于创建和管理传输层安全 (Transport Layer Security,TLS) 证书的服务。通过此免费服务,组织可以创建专用证书颁发机构 (Certificate Authorities,CA) 层次结构和 TLS 证书,这些证书可以在客户租户中自动部署和续订,并与 OCI 负载平衡器、OCI API 网关、Web 应用防火墙等 OCI 服务集成。

在本教程中,我们将探讨 OCI 证书服务作为企业证书管理解决方案的利用情况。我们将深入研究管理员创建内部 CA 的过程,并指导服务器管理员为其 Apache Web 服务器生成证书签名请求 (Certificate Signing Requests,CSR)。此外,我们将介绍使用内部 CA 创建证书所涉及的步骤,并演示如何在 Apache Web 服务器上安装这些证书。

具有必要特权的管理员将创建 CA 以为内部 Web 服务器颁发内部证书。此外,管理员还将创建动态组并设置策略,以授予此动态组对 OCI 证书服务的访问权限。通过将实例添加到动态组并应用必要的策略,在该实例上运行的应用程序可以访问 OCI 证书服务,而无需用户身份证明或配置文件。

管理员与服务器管理员共享区间详细信息和证书颁发机构标识信息,特别是 Oracle Cloud 标识符 (OCID)。OCID 用作证书颁发机构的唯一标识符。使用此信息,服务器管理员可以继续在其系统上安装 Oracle Cloud Infrastructure 命令行界面 (OCI CLI)。安装后,服务器管理员使用 OCI CLI 从管理员以前创建的证书颁发机构请求证书。这种系统化方法可确保正确识别证书颁发机构,从而在 Oracle Cloud Infrastructure 环境中安全高效地颁发证书。

目标

先决条件

注:

任务 1:创建证书颁发机构

使用以下命令创建证书颁发机构,请参见 Root Certificate Authority

命令格式

oci certs-mgmt certificate-authority create-root-ca-by-generating-config-details --compartment-id <compartment_OCID> --name <CA_display_name> --subject <CA_subject_information> --kms-key-id <Vault_encryption_key_OCID>

注:主题是一种复杂类型,其值必须是有效的 JSON。该值可以作为命令行上的字符串提供,也可以使用 file://path/to/file 语法作为文件传入。在本教程中,我们将遵循文件方法。

命令示例

使用以下信息创建示例文件 subject.json

{
  "commonName": "INTERNAL-ROOTCA"
}
oci certs-mgmt certificate-authority create-root-ca-by-generating-config-details --compartment-id ocid1.compartment.oc1..aaaaaaaabcdefghij12abcdefgh78abcde --name INTERNAL-ROOTCA --subject file://subject.json --kms-key-id ocid1.key.oc1.iad.abcdefghijklm.abcdefghijklmnop12abcdiklmnop56abcdef

任务 2:创建动态组

使用以下命令创建动态组,请参见 Dynamic Group

命令格式

oci iam dynamic-group create --compartment-id <Tenancy OCID> --description <description> --name <DG Name> --matching-rule <Matching Rule>

命令示例

oci iam dynamic-group create --compartment-id ocid1.tenancy.oc1..aaaaaaaabbbbcdefgh12abcdabcdefghijkl --description Web-servers --name Web-servers-DG --matching-rule "instance.compartment.id = 'ocid1.compartment.oc1..aaaaaaaabcdefghij12abcde6abcdefghij78abcde'"

任务 3:创建必要的策略来授予此动态组对 OCI 证书服务的访问权限

使用以下命令创建 OCI IAM 策略,请参阅 OCI IAM 策略

命令格式

oci iam policy create --compartment-id <compartment_id> --description <description> --name <name> --statements file://statements.json

命令示例

使用以下信息创建文件 statements.json

[
"Allow dynamic-group Web-servers-DG to manage leaf-certificate-family in compartment chaitanyachintala",
"Allow dynamic-group Web-servers-DG to use certificate-authority-family in compartment chaitanyachintala"
]
oci iam policy create --compartment-id ocid1.compartment.oc1..aaaaaaaabcdefgh56abcdefghij78abcde --description Create-Certficate --name Cert-policies --statements file://statements.json

任务 4:在计算实例 (Apache Web Server) 上安装 OCI CLI

安装和配置 OCI Command Line Interface (CLI)

连接到计算实例后,运行以下命令在 Linux 实例上安装并验证 Python 和 OCI CLI 程序包。

sudo dnf -y install oraclelinux-developer-release-el8
sudo dnf install python36-oci-cli

任务 5:使用 Apache Web 服务器中的 OpenSSL 创建证书签名请求 (Certificate Signing Request,CSR)

  1. 更改目录。

    cd /etc/pki/tls/private/
    
  2. 使用以下信息创建文件 examplecert.cnf 以使用主题替代名称 (Subject Alternative Name,SAN) 指定证书参数。

    注: SAN 扩展允许将其他身份(例如域名或 IP 地址)附加到证书 subject.The 中,使用 SAN 扩展是 SSL 证书的标准做法,它正在取代通用名称的使用。

    [req]
    distinguished_name = req_distinguished_name
    req_extensions = v3_req
    prompt = no
    
    [req_distinguished_name]
    C = US
    ST = Texas
    L = Texas
    O = Elpmaxe
    CN = www.example.com
    
    [v3_req]
    basicConstraints = CA:FALSE
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    extendedKeyUsage = serverAuth
    subjectAltName = @alt_names
    
    [alt_names]
    DNS.1 = example.com
    IP.1 = 1.1.1.1
    
  3. 使用以下命令创建 CSR。

    openssl req -out example.csr -newkey rsa:2048 -nodes -keyout example.key -config examplecert.cnf
    
  4. (可选)使用以下命令验证 CSR。

    openssl req -noout -text -in example.csr
    

任务 6:使用 OCI 管理员创建的 CA 创建证书

  1. 使用以下命令将 example.csr 文件的内容捕获到变量 examplecsr 中。

    examplecsr=$(cat example.csr)
    
  2. 创建由内部 CA 外部管理的证书

    命令格式

    oci certs-mgmt certificate create-certificate-managed-externally-issued-by-internal-ca --compartment-id  <compartment_OCID>  --csr-pem <csr_pem> --issuer-certificate-authority-id <CA_OCID> --name <Certificate-name>
    

    命令示例

    oci certs-mgmt certificate create-certificate-managed-externally-issued-by-internal-ca --compartment-id ocid1.compartment.oc1..aaaaaaaabcdefghhij78abcde --csr-pem "$examplecsr" --issuer-certificate-authority-id ocid1.certificateauthority.oc1.iad.abcdefghi56abcdefghijklmnop --name example.com --auth instance_principal
    

:复制创建的证书的 OCID。

任务 7:下载证书和证书链

注:以 root 用户身份运行以下命令。

用于下载证书和证书链的命令。

命令格式

oci certificates certificate-bundle get --certificate-id <Certificate_OCID>

示例命令 - 证书

oci certificates certificate-bundle get --certificate-id ocid1.certificate.oc1.iad.abcdefghijbcdefghijk --raw-output --query 'data."certificate-pem"' > certificate.crt --auth instance_principal

示例命令 - 证书链

oci certificates certificate-bundle get --certificate-id ocid1.certificate.oc1.iad.abcdefghip56abcdefghijk --raw-output --query 'data."cert-chain-pem"' > certificate-chain.pem --auth instance_principal

任务 8:使用证书安装和配置 Apache Web 服务器

  1. 安装 httpd 软件包、适用于 Apache 的 HTTPS 附加组件及其依赖项。

    sudo dnf install httpd
    sudo dnf install mod_ssl
    

    作为最佳做法,使用 HTTPS 和先前生成的 TLS 证书保护 Web 浏览器与 Apache 服务器之间的所有通信。

    要更改 Web 服务器的根路径,请勿直接编辑 /etc/httpd/conf/httpd.conf 文件。而是作为首选方法在 /etc/httpd/conf.d 目录中创建特定于站点的配置文件。在以下示例中,创建文件 /etc/httpd/conf.d/example.com.conf 以包含虚拟主机的配置。

  2. 通过在 /etc/httpd/conf.d/example.com.conf 中添加以下信息来创建虚拟主机。

    Listen *:443
    
    <VirtualHost *:443>
      ServerName example.com
      ServerAlias www.example.com
      SSLEngine on
      SSLCertificateFile /etc/pki/tls/private/certificate.crt
      SSLCertificateKeyFile /etc/pki/tls/private/example.key
      DocumentRoot /var/www/example.com/html/
      ErrorLog /var/log/httpd/example.com_error.log
      CustomLog /var/log/httpd/example.com_access.log combined
    </VirtualHost>
    
  3. 创建文档根文件夹。根文件夹托管 Apache 将提供给浏览器的网页。

    sudo mkdir -p /var/www/example.com/html
    sudo echo "example.com" > /var/www/example.com/html/index.html
    sudo chown -R apache:apache /var/www/example.com/html
    
  4. 重新启动 Apache 服务以加载新配置。

    sudo systemctl restart httpd
    

    :如果遇到错误“无法在同一 IP:port 上定义多个监听程序”,则注释文件 /etc/httpd/conf.d/ssl.conf 中的行 Listen 443 https

  5. 配置防火墙。这些命令为 Apache HTTPS 服务启用防火墙端口 443 并重新加载默认防火墙服务。

    sudo firewall-cmd --add-service=https --permanent
    sudo firewall-cmd --reload
    

    注:请确保与子网关联的安全列表以及与 VNIC 关联的安全组允许端口 443 上的通信。

任务 9:测试网页

所有错误都源于以下事实:在 Web 服务器上安装的证书不是由公共证书颁发机构颁发的,内部 CA 的根证书不在证书存储中。

确认

更多学习资源

浏览 docs.oracle.com/learn 上的其他实验室,或者通过 Oracle Learning YouTube 频道访问更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 以成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心