全部产品
Search
文档中心

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

更新时间:Oct 25, 2024

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

问题列表

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

问题描述

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

  • 应用程序通过KMS实例SDK(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"
              }

      关于权限策略的更多信息,请参见密钥管理服务自定义权限策略参考

访问或使用密钥时出现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(Java)访问KMS实例时:返回java.io.IOException: keystore password was incorrect

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

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

  • 通过KMS实例SDK(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实例时提示UnknownHostException

问题描述

应用程序通过KMS实例SDK(Java)访问KMS实例时:返回Caused by: java.net.UnknownHostException: kst-hzz664da459rvtjtd****.cryptoservice.kms.aliyuncs.com

解决方案

  1. 请确认您应用的环境是否和KMS实例VPC网络打通。

    如果应用程序的VPC和KMS实例在同一地域,请将该VPC绑定到KMS实例。具体操作,请参见同地域多VPC访问KMS实例。其他场景您可以参考如下方案。

    • 跨VPC互联的解决方案

      您可以通过使用云企业网CEN(Cloud Enterprise Network)、VPN网关、VPC对等连接或者私网连接(PrivateLink)这几种方案实现VPC之间的私网互通。关于这几种跨VPC互联解决方案的特点、介绍以及配置方法,请参见跨VPC互联概述

    • VPC如何连接公网

      您可以通过ECS实例固定公网IP、弹性公网IP、NAT网关或者负载均衡使专有网络VPC中的云资源可以访问公网或被公网访问。具体操作,请参见连接公网概述

    • VPC如何连接IDC

      您可以通过VPN网关、高速通道物理专线或智能接入网关将本地数据中心和云上专有网络打通,构建混合云。具体操作,请参见连接本地IDC

  2. 请确认是否正确配置了KMS VPC域名解析设置。域名解析设置,请参见内网DNS解析简介

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

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

KMS的端点(Endpoint)无法访问

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

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

req.setProtocol(ProtocolType.HTTPS);

本地IDC无法通过域名访问KMS实例

问题描述

本地IDC与阿里云VPC进行网络打通,在不做任何配置情况下,本地IDC无法通过PrivateZone配置的域名kms.aliyuncs.com访问KMS实例。

解决方案

  1. 专线路由器上,把100.100.2.136/100.100.2.138这两段路由放行,确保本地IDC可以ping通100.100.2.136/100.100.2.138。专线路由器配置问题可咨询您的网络PDSA,也可参考相关文档:使用云企业网实现同地域云上云下网络互通(企业版)通过物理专线实现本地IDC与云上VPC互通添加和管理路由条目本地IDC通过专线使用消息队列RocketMQ版处理消息

    重要

    如果您的IDC不是阿里云企业网或专线网络,路由器配置需要咨询您的供应商。

  2. 修改本地DNS主配置文件named.conf,将KMS域名(kms.aliyuncs.com)转发给云DNS来进行查询。配置文件可参考如下:

    zone "kms.aliyuncs.com" { 
            type forward; 
            forwarders { 100.100.2.136;100.100.2.138;}; 
    };
    说明

    不同的DNS软件在配置路由转发上略有差异,您可根据软件操作指南完成配置。

ACK通过ack-secret-manager同步KMS凭据时提示QPS Limit Exceeded

问题原因

同步KMS凭据的调用规模较大时 ,会触发KMS的限流策略,从而发生同步凭据失败问题。

解决方案

ack-secret-manager的0.5.2版本已修复该问题,请升级至0.5.2及以上版本,建议您升级到最新版本。