当然,安全性至关重要——尤其是在使用 AWS 等按量付费服务时,因此在与 AWS 服务集成时遵循最佳实践至关重要。为此,AWS 身份验证连接器具有不同的身份验证方式——其中最安全的是使用会话凭证。这实际上允许您的应用程序在定义的时间段内(通常大约一小时)采用 IAM 用户角色。利用 最近发布了 IAM Roles Anywhere 功能.

认证
这种身份验证方法利用证书向 AWS 验证您的应用程序。要使用这种方法,您需要获取客户端证书。如果您无法访问自己的证书颁发机构 (CA),这绝非易事。
要创建自签名证书,我们将使用 openSSL,这是一个用于加密的开源命令行工具。您可以 在这里安装 openssl,或者你可以 使用 Git 安装附带的 openssl.
还有其他生成证书的方法。您可以使用 AWS 私有证书颁发机构服务 或公共证书服务。我们使用 openssl 有两个原因:
- 成本——这是一个免费的命令行工具,没有成本影响,非常适合开发和测试。
- 安全性——使用公共 CA 作为信任锚意味着该 CA 生成的所有证书都将受到信任,同时你可以通过策略约束进行限制, 不建议这样做。

这些命令已在 Windows 和 Linux 上进行了测试(对不起 Mac 用户,尽管我相信它们是相同的)。如果你正在使用 Windows 并希望在 Mendix 云,请确保您已经安装了 openSSL 版本 3.X。
免责声明:创建您自己的自签名证书需要仔细注意细节,可能不适合您的用例。 确保你了解所涉及的风险 并且您的 CA 和密钥始终保持安全和保密。
自签名证书
创建根
首先要做的是创建一个根证书,它将充当您的 CA 和信任锚。这将用于签署您的所有其他证书,并具有以下要求:
- 必须为 PEM 格式
- 必须是版本 3
- 基本约束必须包括 CA: TRUE
为此,您需要更新 openssl.cnf 文件。这是 openssl 的配置文件,位于 bin 文件夹中安装 openssl 的位置。找到 v3_ca 部分并将其更新为以下内容:
[ v3_ca ]
basicConstraints =critical, CA:TRUE
subjectKeyIdentifier =hash
authorityKeyIdentifier =keyid:always, issuer:always
keyUsage =critical, cRLSign, digitalSignature, keyCertSign
之后,我们需要生成私钥并创建 CA PEM 文件。我们需要使用 RSA 或 EC 算法来生成密钥.
openssl genrsa -out PrivateCA.key 4096
openssl req -new -x509 -days 3650 -key PrivateCA.key -out PrivateCA.pem -extensions v3_ca
您可以在此处提供证书的一些识别信息:
openssl x509 -in PrivateCA.pem -text -noout
验证我们是否确实创建了 v3 证书也是一个好主意。

客户证书
现在我们有了 CA,我们可以生成客户端证书,我们将使用该证书在 AWS 中获取我们的凭证。AWS 对您使用的客户端证书有以下要求:
- 必须是版本 3 (X.509v3)
- 基本约束必须包括 CA: FALSE
- 密钥使用必须包括数字签名
- 签名算法必须包含 SHA256 或更强的算法。
为了满足这些要求,我们必须首先创建一个扩展文件,我们将在生成证书时调用它。将名为 v3.ext 的文件放在与根证书相同的目录中,内容如下:
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
现在对于我们的证书,首先我们创建一个密钥:
openssl genrsa -out client.key 4096
然后我们创建一个新的证书:
openssl req -new -key client.key -out client.csr
最后我们使用根 CA 对其进行签名:
openssl x509 -req -in client.csr -CA PrivateCA.pem -CAkey PrivateCA.key -set_serial 01 -out client.pem -days 3650 -sha256 -extfile v3.ext
完成后,您的证书文件夹中应该有以下文件:

还有一个步骤可以让我们在我们的 Mendix 应用程序:我们需要将客户端证书导出到 pfx 格式,可以上传到我们的应用程序.
openssl pkcs12 -export -in client.pem -inkey client.key -certpbe PBE-SHA1-3DES -keypbe PBE-SHA1-3DES -macalg sha1 -out client.pfx
您需要指定一个稍后需要使用的密码。
您现在可以使用这些证书来连接您的 Mendix 应用于 AWS 服务。
AWS
下一步是将您的根证书传递到 IAM Roles Anywhere 并将其连接到您想要使用的 IAM 角色。
打开您的 AWS 控制台并搜索 IAM Roles Anywhere。

我们将首先创建一个连接到我们根 CA 的信任锚。给信任锚命名,然后在外部证书包中选择外部证书包,然后粘贴 PrivateCA.pem 中的内容:

确保信任锚与您要使用的服务位于同一区域。
获得信任锚后,您将需要一个 IAM 角色来承担。创建一个新的 IAM 角色并添加自定义信任策略:
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Principal":{
"Service":"rolesanywhere.amazonaws.com"
},
"Action":[
"sts:AssumeRole",
"sts:SetSourceIdentity",
"sts:TagSession"
]
}
]
}
然后,您需要添加 IAM 策略。请注意,建议授予角色所需的最低权限。这里我们授予与 mendixdemo.com S3 存储桶交互的权限。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject"
],
"Resource": "arn:aws:s3:::mendixdemo.com/*"
}
]
}
接下来,你需要一个配置文件来承担这个角色,因此再次搜索 IAM Roles Anywhere 并创建一个配置文件,分配我们刚刚创建的角色

Mendix 本地
此时,我们可以使用我们的证书和 AWS 角色来集成到我们的 Mendix 应用程序。我们将从本地开发开始。为了演示,我设置了一个简单的演示项目,并从市场下载了 AWS 身份验证连接器和 S3 连接器。
让我们从配置 AWS 连接器开始。它只需要我们创建的项目的 ARN。

接下来,我们将添加 S3 连接器,以允许我们上传到我们在策略中定义的 S3 存储桶。

等等……我们是不是忘了什么?如果我们不打算使用证书,生成证书有什么意义?我们需要告诉我们的应用程序在哪里可以找到我们的证书!我们首先将客户端证书 ID 设置为“1”。现在我们需要更新我们的运行时设置 App->Settings->Configurations 并添加 两个自定义运行时配置:
- ClientCertificatePasswords – 您在生成 pfx 时添加的密码。
- ClientCertificates – 您的证书在本地机器上的位置。

如果我们现在测试一下,我们可以看到我们可以上传到我们的 S3 存储桶!
Mendix 云
我们可以在本地执行此操作,这很好,但现在我们需要能够部署到云中,这需要许可环境。对于这些说明,我们使用“Mendix 云”的原理与“Mendix 对于私有云”。
我们的第一个更改实际上是配置更新,将应用程序常量 AWSAuthentication.ClientCertificateID 设置为证书 ID 的值,该 ID 可以在环境中配置。当证书数量较多时,必须使用唯一值,因此请考虑一个有意义的值。例如“AWS_Auth”:

然后我们需要在我们的 Mendix 环境。打开您的环境并导航到网络并添加客户端证书。上传您的客户端.pfx 文件并提供您用于创建它的密码。
然后选择证书并单击“操作”下的三个点中的“编辑”:

在编辑屏幕中,使用您为常量 AWSAuthentication.ClientCertificateID 配置的值创建一个新的“Pin”id,因此在我们的示例中为“AWS_Auth”。

然后重新启动应用程序即可使其工作。
结语
我们已经了解了如何使用 AWS 身份验证来利用 AWS 最先进的 IAM 解决方案,使我们能够连接 Mendix 以最安全的方式将应用程序连接到 AWS 资源。
为了简化此过程,我们创建了两个批处理文件来创建自签名证书 - 下载 Windows 和 Linux/Mac.
要了解有关身份验证连接器的更多信息,请查看文档: https://docs.mendix.com/appstore/connectors/aws/aws-authentication/
查看更多关于 Mendix 和 AWS: