您正在查看 Apigee Edge 文档。
转到
Apigee X 文档。 信息
本文档介绍了如何创建、修改和删除 Edge 的密钥库和信任库 (适用于 Private Cloud 4.17.09 及更低版本)。
密钥库和信任库简介
密钥库和信任库定义了用于 TLS 的安全证书的存储库 加密。这两者之间的主要区别在于它们在 TLS 握手过程中的使用位置:
- 密钥库包含 TLS 证书和私钥,用于在 TLS 握手过程中标识实体。
在单向 TLS 中,当客户端连接到服务器上的 TLS 端点时,服务器的密钥库 向客户端提供服务器的证书(公共证书)。然后,客户端会向证书颁发机构 (CA)(例如 Symantec 或 VeriSign)验证该证书。
在双向 TLS 中,客户端和服务器都维护一个密钥库,其中包含用于进行相互身份验证的自己的证书和私钥。 - 信任库包含用于验证在 TLS 握手过程中收到的证书的证书。
在单向 TLS 中,如果证书是由有效 CA 签名的,则不需要信任库。如果 TLS 客户端收到的证书由有效的 CA 签名,然后该客户端发出请求 对证书进行身份验证TLS 客户端通常使用信任库来验证 从 TLS 服务器接收的自签名证书,或未由 受信任的 CA。在这种情况下,客户端会使用其信任的证书填充其信任库。然后,当客户端收到服务器证书时,传入证书将 根据其信任库中的证书进行验证。
例如,TLS 客户端会连接到 TLS 服务器,其中服务器使用自签名 证书。由于它是自签名证书,因此客户端无法使用 CA 对其进行验证。 而是将服务器的自签名证书预加载到其信任库中。然后,当客户端尝试连接到服务器时,客户端会使用其信任库来验证从服务器收到的证书。
对于双向 TLS,TLS 客户端和 TLS 服务器都可以使用信任库。信任库 当 Edge 充当 TLS 服务器时,在执行双向 TLS 时是必需的。
证书可以由证书授权机构 (CA) 颁发,也可以由 密钥。如果您有权访问某个 CA,请按照您的 用于生成密钥和颁发证书的 CA。如果您无权访问 CA,则可以 使用众多公开提供的免费工具之一生成自签名证书,例如 openssl.
实现 Edge 上的密钥库和信任存储区
在 Edge 上,密钥库包含一个或多个 JAR 文件,其中 JAR 文件包含:
- PEM 格式的 TLS 证书 - 由证书授权机构签名的证书 证书链、证书链(其中最后一个证书由 CA 签名)或自签名证书 证书。
- 以 PEM 文件形式提供的私钥。Edge 支持的密钥大小上限为 2048 位。口令是可选的。
信任库与密钥库类似,只不过它仅包含 PEM 文件形式的证书,但没有 私钥。
如果证书是链的一部分,则密钥库/信任库必须包含链中的所有证书,可以是单独的 PEM 文件,也可以是单个文件。如果您使用单个文件,则证书必须按顺序排列,其中文件中的第一个证书是用于 TLS 的证书,后跟证书链,依次到 CA 证书。您必须在文件中的每个证书之间插入一个空行。
Edge 提供了一个 API,供您创建密钥库和信任库。实际 API 是相同的。不同之处在于,创建密钥库时,您需要传递一个包含 证书和私钥。创建信任库时,您只需将证书作为 PEM 文件传递即可。
证书和密钥文件格式简介
本文档中的示例显示了定义为 PEM 文件的 TLS 证书和密钥,这些文件符合 X.509 格式。如果您的证书或私钥未在 PEM 文件中定义,则可以转换 转换为 PEM 文件。
不过,许多 .crt 文件和 .key 文件已采用 PEM 格式。如果这些文件是文本格式 文件,并包含在以下文件中:
-----BEGIN CERTIFICATE----- -----END CERTIFICATE-----
或者:
-----BEGIN ENCRYPTED PRIVATE KEY----- -----END ENCRYPTED PRIVATE KEY-----
然后,这些文件就与 PEM 格式兼容,您可以在密钥库或 信任库,而不将其转换为 PEM 文件。
如果您有证书链,并且希望在密钥库或信任库中使用该证书链,则 您可以将所有证书合并到一个 PEM 文件中,并在每个证书之间另起一行。证书必须按顺序排列,并且最后一个证书必须是根证书或由根证书签名的中间证书:
-----BEGIN CERTIFICATE----- (Your Primary TLS certificate) -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- (Intermediate certificate) -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- (Root certificate or intermediate certificate signed by a root certificate) -----END CERTIFICATE-----
获取现有密钥库的详细信息
使用列出密钥库,检查您的环境中是否存在任何现有的密钥库 和 Truststores API:
curl -X GET \ https://api.enterprise.apigee.com/v1/o/{org_name}/environments/{env_name}/keystores \ -u email:password
对于云客户,无论是在 测试和生产环境。您应该会看到这两个环境中此调用的以下结果:
[ "freetrial" ]
您可以使用此默认密钥库测试 API,并将 API 推送到生产环境, 在部署到生产环境之前,使用您自己的证书和密钥创建自己的密钥库。
对于私有云客户,在您创建第一个密钥库之前,返回的数组为空。
使用 检查密钥库的内容 获取密钥库或信任库 API。对于云客户,您应该会看到一个服务器 TLS 证书,即 Apigee Edge 为免费试用账号提供的默认证书。
curl https://api.enterprise.apigee.com/v1/o/{org_name}/environments/{env_name}/keystores/freetrial \ -u email:password
响应应如下所示:
{ "certs" : [ "wildcard.apigee.net.crt" ], "keys" : [ "freetrial" ], "name" : "freetrial" }
您还可以在 Edge 管理界面中查看此类信息:
- 访问 https://enterprise.apigee.com(云)或
http://<ms-ip>:9000
(本地)登录 Edge 管理界面,其中<ms-ip>
是管理服务器节点的 IP 地址。 - 在边缘管理界面菜单中,依次选择管理 >TLS 证书中所述。
获取 TLS 证书详情
您可以使用 从密钥库或信任存储区 API 获取证书详情,以 (如失效日期和颁发者)。首先,获取您感兴趣的证书的名称。本示例提取名为 “freetrial”。
curl https://api.enterprise.apigee.com/v1/o/{org_name}/environments/{env_name}/keystores/freetrial \ -u email:password
示例响应:
{ "certs" : [ "wildcard.apigee.net.crt" ], "keys" : [ "freetrial" ], "name" : "freetrial" }
然后,使用 certs 属性的值来获取证书的详细信息:
curl https://api.enterprise.apigee.com/v1/o/{org_name}/environments/{env_name}/keystores/freetrial/certs/wildcard.apigee.net.crt \ -u email:password
示例响应:
{ "certInfo" : [ { "expiryDate" : "Wed, 23 Apr 2014 20:50:02 UTC", "isValid" : "Yes", "issuer" : "CN=Go Daddy Secure Certificate Authority - G2, OU=http://certs.godaddy.com/repository/, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US", "subject" : CN=*.example.apigee.net, OU=Domain Control Validated", "subjectAlternativeNames" : ["*.example.apigee.net","*.example.apigee.net" ], "validFrom" : "Tue, 15 Apr 2014 09:17:03 UTC", "version" : 3 } ], "name" : "example.apigee.net.crt" }
您还可以在 Edge 管理界面中查看此类信息:
- 登录 Edge 管理界面:https://enterprise.apigee.com(云端)或
http://<ms-ip>:9000
(本地),其中<ms-ip>
是管理服务器节点的 IP 地址。 - 在 Edge 管理界面菜单中,依次选择管理 > TLS 证书。
在 Edge 界面中,您可以指定 Edge 提前多久指明证书即将到期。默认情况下,界面会突出显示计划在接下来 10 天内过期的所有证书。
创建密钥库
密钥库是特定于贵组织中的某个环境(例如测试环境或生产环境)的。因此,如果您想先在测试环境中测试密钥库,然后再将其部署到生产环境,则必须在这两个环境中都创建该密钥库。
创建密钥库的过程分为两个步骤:
- 创建一个包含证书和私钥的 JAR 文件。
- 创建密钥库并上传 JAR 文件。
创建 JAR 文件 包含您的证书和私钥
使用私钥、证书和清单创建 JAR 文件。JAR 文件必须包含以下文件和目录:
/META-INF/descriptor.properties myCert.pem myKey.pem
在包含密钥对和证书的目录中,创建一个名为
/META-INF
。然后,创建一个文件
名为“descriptor.properties
”的地区:
/META-INF
替换为以下内容
内容:
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 文件
如需在环境中创建密钥库,您只需向创建密钥库或信任库 API 指定密钥库名称即可。名称只能包含字母数字字符:
curl -X POST -H "Content-Type: text/xml" \ https://api.enterprise.apigee.com/v1/o/{org_name}/environments/{env_name}/keystores \ -d '<KeyStore name="myKeystore"/>' -u email:password
示例响应:
{ "certs" : [ ], "keys" : [ ], "name" : "myKeystore" }
在环境中创建命名密钥库后,您可以使用将 JAR 文件上传到密钥库 API 上传包含证书和私钥的 JAR 文件:
curl -X POST -H "Content-Type: multipart/form-data" \ -F file="@myKeystore.jar" -F password={key_pass} \ "https://api.enterprise.apigee.com/v1/o/{org_name}/environments/{env_name}/keystores/{myKeystore}/keys?alias={key_alias}" \ -u email:password
其中,-F
选项指定 JAR 文件的路径。
在此调用中,您指定两个查询参数:
alias
- 标识 密钥存储区中的证书和密钥创建虚拟主机时,您需要引用 证书和密钥的别名。password
- 私钥的密码。如果私钥没有密码,则省略此参数。
验证您的密钥库是否正确上传:
curl https://api.enterprise.apigee.com/v1/o/{org_name}/environments/{env_name}/keystores/myKeystore \ -u email:password
示例响应:
{ "certs" : [ "myCertificate" ], "keys" : [ "myKey" ], "name" : "myKeystore" }
创建信任库
用于创建信任库的 API 与用于创建密钥库的 API 相同。通过 唯一的区别是将证书文件作为 PEM 文件而不是 JAR 文件进行传递。
如果证书是链的一部分,则您必须将链中的所有证书单独上传到信任库,或者创建一个包含所有证书的文件,并在文件中的每个证书之间添加换行符。最终证书通常由证书颁发者签名。例如,在信任库中,您可以上传客户端证书 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
时,请求会成功。这是因为在 client_cert_2
但该证书是由信任库中存在的证书签名的。如果移除 CA
证书ca_cert
则 TLS 验证会失败。
使用创建 Keystore 或 Truststore,即用于创建密钥库的同一 API:
curl -X POST -H "Content-Type: text/xml" -d \ '<KeyStore name="myTruststore"/>' \ https://api.enterprise.apigee.com/v1/o/{org_name}/environments/{env_name}/keystores \ -u email:password
使用将证书上传到信任库 API,将证书作为 PEM 文件上传到信任库:
curl -X POST -H "Content-Type: multipart/form-data" -F file="@trust.pem" \ https://api.enterprise.apigee.com/v1/o/{org_name}/environments/{env_name}/keystores/myTruststore/certs?alias=myTruststore \ -u email:password
其中,-F
选项指定 PEM 文件的路径。
删除密钥库或信任库
您可以使用删除密钥库或信任库 API 删除密钥库或信任库:
curl -X DELETE \ https://api.enterprise.apigee.com/v1/o/{org_name}/environments/{env_name}/keystores/myKeystoreName \ -u email:password
示例响应:
{ "certs" : [ ], "keys" : [ ], "name" : "myKeystoreName" }
如果您删除虚拟主机或目标端点/目标/服务器正在使用的密钥库或信任库,则通过虚拟主机或目标端点/目标服务器进行的所有 API 调用都将失败。