通过别名获取阿里KMS管理的密钥遇到的问题

北战南征 提交于 2020-02-26 12:06:37

公司需要使用阿里提供的kms密钥管理服务,为验证服务能够正常使用。使用公司申请的测试秘钥资源进行测试。
1、使用阿里提供的demo代码,验证能够正常读取、加密、解密功能。
(ps:主要是注意配置的权限问题,基本正常)

2、本地服务验证。
由于规则要求是使用秘钥别名获取信息。所以测试时候也一直用别名带入逻辑运行。

代码操作简略如下:

public static byte[] encrypt(String keyId,String msgBuf) {
        try {
        	EncryptResponse kmsEncryptResp = encryptByKms(keyId,msgBuf);//通过KMS加密
        	String encryptedStr = kmsEncryptResp.getCiphertextBlob();//得到密文
            byte[] encrypted = encryptedStr.getBytes(CharsetUtil.UTF8);
            return encrypted;
        } catch (ClientException eResponse) {
        	logger.error("加密失败,处理失败:{},错误码:{},错误描述:{}",eResponse.getMessage(),eResponse.getErrCode(),eResponse.getErrMsg());
        }catch (Exception e) {
            logger.error("加密失败,未知异常:{}", e.getMessage());
       }
    }

private static EncryptResponse encryptByKms(String keyId, String plainText) throws ClientException {
		String regionId = "cn-hongkong";
        String accessKeyId = "LTAI4FiHpR4VzCRrdYN5E8nK";
        String accessKeySecret = "TEcSKvYlGR8iHSbB5wiJmvTPRHmx22";
    	DefaultAcsClient kmsClient  = kmsClient(regionId, accessKeyId, accessKeySecret);
    	EncryptRequest encReq = new EncryptRequest();
        encReq.setProtocol(ProtocolType.HTTPS);
        encReq.setAcceptFormat(FormatType.JSON);
        encReq.setMethod(MethodType.POST);
        encReq.setKeyId(keyId);
        encReq.setPlaintext(plainText);
        final EncryptResponse encResponse = kmsClient.getAcsResponse(encReq);
        return encResponse;
    }

    private static DefaultAcsClient kmsClient(String regionId, String accessKeyId, String accessKeySecret) {
        IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
        DefaultAcsClient client = new DefaultAcsClient(profile);
        return client;
    }

结果一直报catch住的异常:加密失败,处理失败
1、首先以为那配置异常,导致获取不到阿里kms信息,使用debug一步步跟踪发现没问题,阿里kms返回的是
在这里插入图片描述

2、回到阿里的demo代码检查,不对呀。正常的呀!于是在代码里增加逻辑:

            keyId = "别名";
            final DescribeKeyResponse decKeyRes = DescribeKey(keyId);

            /**
             * Parse response and do more further
             */
            DescribeKeyResponse.KeyMetadata meta = decKeyRes.getKeyMetadata();

发现读出来的keyId与我预期不一致。查找清单,发现有两个keyId的别名是一样的,其中一个状态正常,一个是被挂起删除。

3、和公司系统组申请资源的同事沟通,原来是他们提供资源时,第一次维护时一些配置填错,于是删掉后重建。两个keyId又维护成了同一个别名!!!

总结

使用阿里KMS服务时,尽量不要不同keyId维护同一个别名,用别名取时,真不知道取出的是哪个!!!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!