使用 Edge Management API 建立 KeyStore 和信任存放區

您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件
info

本文說明如何為 Edge for Cloud 和 Edge for Private Cloud 4.18.01 以上版本建立、修改及刪除金鑰儲存區和信任儲存區。

簡介

如要設定依賴公用金鑰基礎架構的功能 (例如 TLS),您需要建立提供必要金鑰和數位憑證的金鑰儲存區和信任儲存區。

如要瞭解 KeyStore、信任儲存庫和別名,請參閱「KeyStore 和信任儲存庫」。

建立金鑰儲存庫

金鑰儲存區是貴機構環境專屬的,例如測試或正式環境。因此,如要在測試環境中測試金鑰儲存區,再將其部署至正式環境,您必須在這兩個環境中建立金鑰儲存區。

如要在環境中建立 KeyStore,請按照下列步驟操作:

  1. 使用本節中的 API 呼叫建立金鑰儲存區。
  2. 建立別名,並將憑證/金鑰組上傳至別名。上傳憑證和金鑰的方式取決於憑證/金鑰組的格式。以下各節說明如何上傳各類型的憑證/金鑰配對:

如要建立 KeyStore,請在「Create a Keystore or Truststore」API 中指定 KeyStore 名稱。金鑰儲存庫名稱只能包含英數字元:

curl -X POST -u orgAdminEmail:password -H "Content-Type: text/xml" \
https://api.enterprise.apigee.com/v1/o/{org_name}/e/{env_name}/keystores \
-d '<KeyStore name="myKeystore"/>'

回應範例:

{
  "certs" : [ ],
  "keys" : [ ],
  "name" : "myKeystore"
}

以 JAR 檔案上傳憑證和金鑰

您必須先使用私密金鑰、憑證和資訊清單建立 JAR 檔案。JAR 檔案必須包含下列檔案和目錄:

/META-INF/descriptor.properties
myCert.pem
myKey.pem

金鑰儲存庫 JAR 檔案可以只包含這三個檔案。如果您有憑證鏈結,鏈結中的所有憑證都必須附加到單一 PEM 檔案中,且最後一個憑證應由根 CA 簽署。憑證必須以正確順序附加至 PEM 檔案,且每個憑證之間須空一行,也就是:

cert -> intermediate cert(1) -> intermediate cert(2) ->-> root

在包含金鑰組和憑證的目錄中,建立名為 /META-INF 的目錄。然後在 /META-INF 中建立名為 descriptor.properties 的檔案,並加入以下內容:

certFile={myCertificate}.pem
keyFile={myKey}.pem

產生包含金鑰組和憑證的 JAR 檔案:

jar -cf myKeystore.jar myCert.pem myKey.pem

descriptor.properties 新增至 JAR 檔案:

jar -uf myKeystore.jar META-INF/descriptor.properties

您現在可以使用「從 JAR 或 PKCS 檔案建立別名」API,上傳內含憑證和私密金鑰的 JAR 檔案:

curl -u orgAdminEmail:password -X POST -H "Content-Type: multipart/form-data" -F file="@myKeystore.jar" -F password={key_pword} \
"https://api.enterprise.apigee.com/v1/o/{org_name}/e/{env_name}/keystores/{keystore_name}/aliases?alias={alias_name}&format=keycertjar"

其中 -F 選項會指定 JAR 檔案的路徑。

在這次呼叫中,您會指定:

  • alias_name - 識別金鑰存放區中的憑證和金鑰。建立虛擬主機時,請依別名參照憑證和金鑰。
  • key_pword - 私密金鑰的密碼。如果私密金鑰沒有密碼,請省略這個參數。

確認金鑰存放區已正確上傳:

curl -u orgAdminEmail:password -X GET\
https://api.enterprise.apigee.com/v1/o/{org_name}/e/{env_name}/keystores/{keystore_name}

回應範例:

{  
 "certs" : [ "myCertificate" ],
 "keys" : [ "myKey" ],
 "name" : "myKeystore"
}

以 PEM 檔案形式上傳憑證和金鑰

使用「Create an alias from certificate and key PEM files」(從憑證和金鑰 PEM 檔案建立別名) API,上傳含有憑證和私密金鑰的 PEM 檔案:

curl -u orgAdminEmail:password -X POST -H "Content-Type: multipart/form-data" -F keyFile="@server.key" -F certFile="@signed.crt" \
-F password={key_pword} \
"https://api.enterprise.apigee.com/v1/o/{org_name}/e/{env_name}/keystores/{keystore_name}/aliases?alias={alias_name}&format=keycertfile"

其中 -F 選項會指定 PEM 檔案的路徑。

在這次呼叫中,您會指定:

  • alias_name - 識別金鑰存放區中的憑證和金鑰。建立虛擬主機時,請依別名參照憑證和金鑰。
  • key_pword - 私密金鑰的密碼。如果私密金鑰沒有密碼,請省略這個參數。

確認金鑰存放區已正確上傳:

curl -u orgAdminEmail:password -X GET\
https://api.enterprise.apigee.com/v1/o/{org_name}/e/{env_name}/keystores/{keystore_name}

回應範例:

{  
 "certs" : [ "myCertificate" ],
 "keys" : [ "myKey" ],
 "name" : "myKeystore"
}

以 PKCS12/PFX 檔案上傳憑證和金鑰

使用「Create an alias from a JAR or PKCS file」(從 JAR 或 PKCS 檔案建立別名) API,上傳內含憑證和私密金鑰的 PKCS12/PFX 檔案:

curl -u orgAdminEmail:password -X POST -H "Content-Type: multipart/form-data" \
-F file="@myKeystore.p12" -F password={key_pword} \
"https://api.enterprise.apigee.com/v1/o/{org_name}/e/{env_name}/keystores/{keystore_name}/aliases?alias={alias_name}&format=pkcs12"

其中 -F 選項會指定 P12 檔案的路徑。

在這次呼叫中,您會指定:

  • alias_name - 識別金鑰存放區中的憑證和金鑰。建立虛擬主機時,請依別名參照憑證和金鑰。
  • key_pword - 私密金鑰的密碼。如果私密金鑰沒有密碼,請省略這個參數。

確認金鑰存放區已正確上傳:

curl -u orgAdminEmail:password -X GET\
https://api.enterprise.apigee.com/v1/o/{org_name}/e/{env_name}/keystores/{keystore_name}

回應範例:

{  
 "certs" : [ "myCertificate" ],
 "keys" : [ "myKey" ],
 "name" : "myKeystore"
}

建立並上傳自行簽署的憑證和金鑰

您可以使用「 透過產生自行簽署的憑證建立別名」API,建立自行簽署的憑證和金鑰,並將其上傳至別名。下列呼叫只會指定建立自簽憑證所需的資訊。您可以修改這項呼叫,加入其他資訊:

curl -u orgAdminEmail:password -X POST --header "Content-Type: application/json"  \
-d "{
    "alias": "selfsigned",
    "subject": {
        "commonName": "mycert"
    }
}" \
"https://api.enterprise.apigee.com/v1/o/{org_name}/e/{env_name}/keystores/{keystore_name}/aliases?format=selfsignedcert"

回覆應如下所示:

{
  "alias": "selfsigned",
  "certsInfo": {
    "certInfo": [
      {
        "basicConstraints": "CA:FALSE",
        "expiryDate": 1491497204000,
        "isValid": "Yes",
        "issuer": "CN=mycert",
        "publicKey": "RSA Public Key, 2048 bits",
        "serialNumber": "00:d1:b4:78:e1",
        "sigAlgName": "SHA256withRSA",
        "subject": "CN=mycert",
        "subjectAlternativeNames": [],
        "validFrom": 1459961204000,
        "version": 3
      }
    ],
    "certName": "selfsigned-cert"
  },
  "keyName": "selfsigned"
}

建立信任儲存庫

您用來建立信任儲存區的 API 與建立金鑰儲存區的 API 相同。唯一的差別在於您只會將憑證檔案 (PEM 檔案) 上傳至信任存放區。

如果憑證是鏈結的一部分,您必須將鏈結中的所有憑證分別上傳至信任儲存區,或是建立包含所有憑證的單一檔案。檔案中的每個憑證之間必須插入空白行。

如要上傳多個不屬於鏈結的自行簽署憑證,請使用相同技巧:如要信任多個憑證,請將這些憑證上傳至單一檔案。

最終憑證通常由憑證核發機構簽署。舉例來說,在信任儲存庫中,您會上傳用戶端憑證 client_cert_1,以及用戶端憑證核發者的憑證 ca_cert。

在雙向 TLS 驗證期間,當伺服器在 TLS 握手程序中將 client_cert_1 傳送至用戶端時,用戶端驗證就會成功。

或者,您有第二個憑證 client_cert_2,由同一個憑證 ca_cert 簽署。 不過,您不會將 client_cert_2 上傳至信任儲存庫。信任儲存庫仍包含 client_cert_1 和 ca_cert。

當伺服器在 TLS 握手期間傳遞 client_cert_2 時,要求就會成功。這是因為當 truststore 中沒有 client_cert_2,但該憑證是由 truststore 中的憑證簽署時,Edge 允許 TLS 驗證成功。如果從信任儲存區移除 CA 憑證 ca_cert,TLS 驗證就會失敗。

使用「建立 KeyStore 或 TrustStore」,在環境中建立空白的信任儲存區,這與您建立 KeyStore 時使用的 API 相同:

curl -u orgAdminEmail:password -X POST -H "Content-Type: text/xml" \
-d '<KeyStore name="myTruststore"/>' \
https://api.enterprise.apigee.com/v1/o/{org_name}/e/{env_name}/keystores

建立信任儲存區後,請使用「 從憑證 PEM 檔案建立別名」API,將憑證以 PEM 檔案形式上傳至信任儲存區:

curl -u orgAdminEmail:password -X POST -H "Content-Type: multipart/form-data" -F certFile="@cert.pem" \
"https://api.enterprise.apigee.com/v1/o/{org_name}/e/{env_name}/keystores/myTruststore/aliases?alias=myTruststore&format=keycertfile"

其中 -F 選項會指定 PEM 檔案的路徑。

取得現有金鑰儲存區或信任儲存庫的詳細資料

使用「List Keystores and Truststores」(列出 KeyStore 和 TrustStore) API,檢查環境中是否有現有的 KeyStore:

curl -u orgAdminEmail:password -X GET \
https://api.enterprise.apigee.com/v1/o/{org_name}/e/{env_name}/keystores

對於雲端客戶,測試和正式版環境中的試用機構都會提供預設金鑰儲存區。您應該會看到以下兩個環境的呼叫結果:

[ "freetrial" ]

您可以使用這個預設金鑰儲存區測試 API,並將 API 推送至正式環境,但通常在部署至正式環境前,您會使用自己的憑證和金鑰建立自己的金鑰儲存區。

如果是私有雲客戶,您必須先建立第一個金鑰儲存區,傳回的陣列才會包含資料。

使用「 取得金鑰儲存區或信任儲存庫」API 檢查金鑰儲存區的內容。如果是雲端客戶,您應該會看到單一伺服器 TLS 憑證,也就是 Apigee Edge 為免費試用帳戶提供的預設憑證。

curl -u orgAdminEmail:password -X GET\
https://api.enterprise.apigee.com/v1/o/{org_name}/e/{env_name}/keystores/freetrial

回覆應如下所示:

{
 "certs" : [ "wildcard.apigee.net.crt" ],
 "keys" : [ "freetrial" ],
 "name" : "freetrial"
}

取得別名的詳細資料

使用「列出別名」API,取得 KeyStore 的所有別名清單:

curl -u orgAdminEmail:password -X GET \
"https://api.enterprise.apigee.com/v1/o/{org_name}/e/{env_name}/keystores/{keystore_name}/aliases"

回覆應如下所示:

[
  "alias1",
  "alias2",
  "alias3",
]

如要取得別名的所有資訊 (例如到期日和發行者),請使用 Get alias API 並指定別名:

curl  -u orgAdminEmail:password -X GET \
"https://api.enterprise.apigee.com/v1/o/{org_name}/e/{env_name}/keystores/{keystore_name}/aliases/{alias_name}"

回覆應如下所示:

{
  "alias": "alias1",
  "certsInfo": {
    "certInfo": [
      {
        "basicConstraints": "CA:TRUE",
        "expiryDate": 1459371335000,
        "isValid": "No",
        "issuer": "EMAILADDRESS=foo@bar.com, CN=smg, OU=doc, O=Internet Widgits Pty Ltd, L=noho, ST=Some-State, C=AU",
        "publicKey": "RSA Public Key, 1024 bits",
        "serialNumber": "00:86:a0:9b:5b:91:a9:fe:92",
        "sigAlgName": "SHA256withRSA",
        "subject": "EMAILADDRESS=foo@bar.com, CN=smg, OU=doc, O=Internet Widgits Pty Ltd, L=noho, ST=Some-State, C=AU",
        "subjectAlternativeNames": [],
        "validFrom": 1456779335000,
        "version": 3
      }
    ],
    "certName": "new\-cert"
  },
  "keyName": "newssl20"
}

如要下載別名的憑證,請使用「Export a certificate for an alias」(匯出別名的憑證) API:

curl -u orgAdminEmail:password -X GET \
"https://api.enterprise.apigee.com/v1/e/{org_name}/e/{env_name}/keystores/{keystore_name}/aliases/{alias_name}/certificate"

回覆應如下所示:

-----BEGIN CERTIFICATE-----
MIIDojCCAwugAwIBAgIJAIagm1uRqf6SMA0GCSqGSIb3DQEBCwUAMIGTMQswCQYD
...
RBUkaTe/570sLHY0tvkIm5tEX36ESw==
-----END CERTIFICATE-----

如果憑證已過期,但您想續約,可以下載憑證簽署要求 (CSR)。然後將 CSR 傳送給 CA,以取得新憑證。如要為別名產生 CSR,請使用「為別名產生 CSR」API:

curl -u orgAdminEmail:password -X GET \
"https://api.enterprise.apigee.com/v1/o/{org_name}/e/{env_name}/keystores/{keystore_name}/aliases/{alias_name}/csr"

回覆應如下所示:

-----BEGIN CERTIFICATE REQUEST-----
MIIB1DCCAT0CAQAwgZMxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRl
...
RF5RMytbkxkvPxIE17mDKJH0d8aekv/iEOItZ+BtQg+EibMUkkjTzQ==
-----END CERTIFICATE REQUEST-----

將憑證新增至雙向 TLS 的信任儲存區

使用雙向 TLS 進行連入連線 (也就是對 Edge 發出的 API 要求) 時,信任儲存區會包含允許對 Edge 提出要求的每個用戶端的憑證或 CA 鏈結。

首次設定信任儲存區時,您可以新增已知用戶端的所有憑證。不過,隨著您新增用戶端,可能需要將其他憑證新增至信任儲存庫。

如要將新憑證新增至雙向傳輸層安全標準:TLS 使用的信任儲存庫,請按照下列步驟操作:

  1. 確認您在虛擬主機中使用了信任儲存區的參照。
  2. 如上述「建立信任儲存庫」一節所述,將新憑證上傳至信任儲存庫。
  3. 更新信任儲存區參照,將其設為相同值。 更新後,Edge 會重新載入信任儲存區和新憑證。

    詳情請參閱「修改參照」。

刪除金鑰儲存庫/信任儲存庫或別名

刪除金鑰儲存區/信任儲存區或別名時,請務必謹慎。如果刪除虛擬主機、目標端點或目標伺服器使用的金鑰儲存區、信任儲存區或別名,透過虛擬主機或目標端點/目標伺服器發出的所有 API 呼叫都會失敗。

通常,刪除金鑰存放區/信任存放區或別名的程序如下:

  1. 按照上述方式建立新的 KeyStore/TrustStore 或別名。
  2. 如果是連入連線 (也就是傳送至 Edge 的 API 要求),請更新虛擬主機設定,以參照新的金鑰儲存區和金鑰別名。
  3. 如果是輸出連線,也就是從 Apigee 連線至後端伺服器:
    1. 更新參照舊金鑰儲存區和金鑰別名的所有 API Proxy 的 TargetEndpoint 設定,以參照新的金鑰儲存區和金鑰別名。如果 TargetEndpoint 參照 TargetServer,請更新 TargetServer 定義,參照新的金鑰儲存區和金鑰別名。
    2. 如果直接從 TargetEndpoint 定義參照金鑰儲存區和信任儲存區,則必須重新部署 Proxy。如果 TargetEndpoint 參照 TargetServer 定義,且 TargetServer 定義參照金鑰儲存區和信任儲存區,則不必重新部署 Proxy。
    3. 確認 API Proxy 運作正常。
    4. 刪除金鑰儲存區/信任儲存區或別名。

詳情請參閱「 更新別名中的憑證」。

刪除金鑰儲存庫或信任儲存庫

您可以使用「 Delete a Keystore or Truststore」API 刪除金鑰儲存區或信任儲存區:

curl -u orgAdminEmail:password -X DELETE \
https://api.enterprise.apigee.com/v1/o/{org_name}/e/{env_name}/keystores/myKeystoreName

如果刪除並重新建立虛擬主機使用的金鑰儲存區或信任儲存區,就必須重新部署 API Proxy。

刪除別名

您可以使用「 刪除別名」API,刪除 KeyStore 或信任儲存庫中的別名:

curl -u orgAdminEmail:password -X DELETE \
https://api.enterprise.apigee.com/v1/o/{org_name}/e/{env_name}/keystores/myKeystoreName/aliases/{alias_name}