全部产品
Search
文档中心

密钥管理服务:应用接入常见问题

更新时间:Jan 23, 2024

本文介绍应用程序通过SDK接入时可能遇到的问题。

问题列表

访问KMS实例时出现no such host或not known报错

问题描述

  • 应用程序通过KMS实例SDK for Go访问KMS实例时:返回kst-xxx.cryptoservice.kms.aliyuncs.com: no such host

  • 应用程序通过KMS实例SDK for Java访问KMS实例时:返回kst-xxx.cryptoservice.kms.aliyuncs.com: nodename nor servname provided, or not known

问题原因

购买KMS实例后,该实例是您独享的密钥管理和凭据管理服务,仅可从您已配置关联的VPC中访问。

解决方案

  • 如果应用程序所在VPC和KMS实例在同一个地域,请将该VPC和KMS实例关联。具体操作,请参见同地域多VPC访问KMS实例

    关于KMS实例关联了哪些VPC,请参见查看KMS实例详情

  • 如果应用程序所在VPC和KMS实例在不同地域,请将该VPC和KMS实例所在VPC之间的网络打通。

通过应用接入点访问KMS实例时,出现Forbidden.NoPermission报错

问题描述

访问KMS实例时,返回的错误描述或SDK异常消息中包含:Forbidden.NoPermission : This operation is forbidden by permission system.

解决方案

应用接入点的权限策略中,RBAC权限允许访问资源中未配置要使用的密钥或凭据的权限。具体操作,请参见创建应用接入点

获取凭据值时出现This operation for key-xxxxxx is forbidden by permission system报错

问题描述

获取凭据值时,KMS返回的错误描述或SDK异常消息中包含:This operation for key-xxxxxx is forbidden by permission system

以下是KMS实例SDK(Java)异常信息示例:

获取凭据值时报错

问题原因

应用程序缺少使用该密钥进行解密的权限。

创建凭据时需要选择同一个KMS实例下的密钥加密凭据值。应用程序向KMS请求获取凭据时,需要使用对应的密钥解密凭据值,因此应用程序不仅要具有使用凭据的权限,还需要具有使用对应密钥进行解密的权限。

解决方案

  • 场景一:通过应用接入点AAP(ClientKey) 访问KMS

    编辑应用接入点的权限策略,为应用程序增加使用密钥解密的权限。

    1. 登录密钥管理服务控制台,在顶部菜单栏选择地域后,在左侧导航栏单击应用接入 > 接入点

    2. 单击目标应用接入点名称,进入应用接入点详情页面。

    3. 单击权限策略操作列的编辑,完成如下配置项的设置后,单击更新

      • RBAC权限:增加勾选CryptoServiceKeyUser。

      • 允许访问的资源:在可选资源区域选择密钥,单击image.png图标。或单击已选资源后的加号图标添加密钥,格式为key/key id(例如key/key-hzz6xxxxxx)。

  • 场景二:通过RAM用户的AccessKey或RAM角色访问KMS

    编辑RAM权限策略,为应用程序增加使用密钥解密的权限。

    1. 登录RAM控制台

    2. 在左侧导航栏,选择权限管理 > 权限策略

    3. 找到您的RAM用户或RAM角色绑定的权限策略,单击权限策略名称。

    4. 策略内容页签,单击修改策略内容,在Statement中增加如下脚本后单击继续编辑基本信息,然后单击确定

              {
                  "Effect": "Allow",
                  "Action": "kms:Decrypt",
                  "Resource": "acs:kms:${region}:${account}:key/keyId-example"
              }

      关于权限策略的更多信息,请参见使用RAM实现对资源的访问控制

访问或使用密钥时出现Forbidden.KeyNotFound报错

出现上述错误提示,通常是因为您访问了错误的地域、密钥ID或别名。

请您确保解密时访问的地域、密钥ID、别名与加密时一致。

调用KMS接口时出现UnsupportedOperation报错

可能原因

解决方案

应用程序调用KMS实例中创建的密钥进行密码运算时,使用了阿里云SDK。

请使用KMS实例SDK,调用您在KMS实例中创建的密钥进行密码运算。更多信息,请参见KMS实例SDK

应用程序通过SDK调用密码运算接口(EncryptDecryptGenerateDataKey)时,使用了服务密钥。

服务密钥由云产品代您创建和管理,请您使用用户主密钥(CMK)。

调用生成数据密钥GenerateDataKey接口时,用户主密钥(CMK)的密钥算法为RSA、ECC非对称算法。

请确保用户主密钥(CMK)的密钥算法是AES对称算法,且密钥用途为ENCRYPT/DECRYPT

调用计算签名Sign或验证签名Verify接口时,用户主密钥(CMK)的密钥算法为AES对称密码算法。

请确保用户主密钥(CMK)的密钥算法是RSA、ECC非对称算法,且密钥用途为SIGN/VERIFY

访问KMS实例时出现unable to find valid certification path to requested target报错

可能原因一:下载CA证书时,未选择正确的KMS实例

  1. 登录密钥管理服务控制台,在顶部菜单栏选择地域后,在左侧导航栏单击资源 > 实例管理

  2. 实例管理页面,单击获取实例CA证书下的下载

  3. 获取实例CA证书对话框中选择实例ID,单击下载并妥善保管。

    CA证书下载后文件名默认为PrivateKmsCA_kst-******.pem,后续会集成到SDK中用于验证KMS实例服务的SSL证书是否真实有效。

可能原因二:SDK安装包的版本不正确

建议您安装最新版本的SDK,各SDK的开源代码仓库地址:

KMS实例的域名无法解析

问题描述

在KMS实例所属的VPC或已关联的VPC中,应用无法访问KMS实例的域名。例如ping kst-hzz62****.cryptoservice.kms.aliyuncs.com,无法解析域名,提示消息中包含 "cannot resolve"。

解决方案

请您检查服务器的DNS配置是否为默认的100.100.2.136/100.100.2.138。详细信息,请参见使用PrivateZone需要修改服务器的DNS配置么

应用访问KMS实例时提示ClientKey口令不正确

问题描述

  • 通过KMS实例SDK for Java访问KMS实例时:返回java.io.IOException: keystore password was incorrect

  • 通过KMS实例SDK for PHP访问KMS实例时:返回Could not decrypt the privateKey of clientKey, the password is incorrect,or it is not a valid pkcs12

  • 通过KMS实例SDK for Go访问KMS实例时:返回panic: pkcs12: decryption password incorrect

  • 通过KMS实例SDK for Python访问KMS实例时:返回OpenSSL.crypto.Error: [('PKCS12 routines', '', 'mac verify failure')]

问题原因

ClientKey口令(password)不正确。

解决方案

  • ClientKey口令格式是否满足要求,不满足时您需要重新创建ClientKey。具体操作,请参见创建ClientKey

    ClientKey口令格式:8~64位,[0-9] [a-z] [A-Z] [~!@#$%^&*?_-] ,需要满足两种类型。

  • 如果通过文件读取ClientKey口令,口令文件应该只是文本文件,只包含一行密码内容。文件内容不要包括换行符,制表符等不满足密码格式的特殊符号。

应用访问KMS实例时返回HTTP 413状态码

所有请求参数使用Protocol Buffers编码后(即Request Body),内容长度不能超过3 MB,超过后服务端会拒绝处理并返回HTTP 413状态码。

  • 加解密操作:建议单次使用对称密钥加解密的数据不超过6 KB,单次使用非对称密钥加解密的数据不超过1 KB,超过后请使用信封加密。

  • 签名验签操作:签名消息较大时,建议您的应用在本地对消息生成摘要后,再调用Sign/Verify接口进行签名或验签。

安卓端是否支持使用KMS的凭据管理功能

目前不支持安卓端使用凭据管理功能。

KMS的端点(Endpoint)无法访问

通常是因为在使用SDK访问KMS时,未启用HTTPS协议。

为了确保您的数据安全,KMS的端点(Endpoint)仅支持HTTPS协议。因此在使用SDK访问KMS的端点(Endpoint)时,请执行如下代码确保KMS已启用HTTPS协议。

req.setProtocol(ProtocolType.HTTPS);