Problemas conhecidos do SDK do JCE em relação ao AWS CloudHSM
Os problemas a seguir afetam o SDK do JCE em relação ao AWS CloudHSM.
Tópicos
Problema: ao trabalhar com pares de chaves assimétricas, você vê a capacidade de chaves ocupada mesmo quando não está explicitamente criando ou importando chaves
-
Impacto: esse problema pode fazer com que o espaço de chaves dos HSMs se esgote inesperadamente e ocorra quando o aplicativo usa um objeto de chave JCE padrão para operações de criptografia em vez de um objeto
CaviumKey. Quando você usa um objeto de chave JCE padrão, oCaviumProviderimporta implicitamente essa chave para o HSM como uma chave de sessão e não exclui essa chave até que o aplicativo seja encerrado. Como resultado, as chaves aumentam enquanto o aplicativo está em execução e podem fazer com que o espaço livre de chaves dos HSMs se esgote, congelando seu aplicativo. -
Solução alternativa: ao usar a classe
CaviumSignature, a classeCaviumCipher, a classeCaviumMacou a classeCaviumKeyAgreement, você deverá fornecer a chave umCaviumKeyem vez de um objeto de chave JCE padrão.É possível converter manualmente uma chave normal em um
CaviumKeyusando a classeImportKeye depois excluir manualmente a chave após a conclusão da operação. -
Status da resolução: estamos atualizando o
CaviumProviderpara gerenciar corretamente as importações implícitas. A correção será anunciada na página de histórico de versões quando estiver disponível.
Problema: o repositório de chaves do JCE é somente leitura.
-
Impacto: não é possível armazenar um tipo de objeto que não seja compatível com o HSM no repositório de chaves do JCE. Sobretudo, você não pode armazenar certificados no repositório de chaves. Isso impede a interoperabilidade com ferramentas como jarsigner, que espera encontrar o certificado no repositório de chaves.
-
Solução alternativa: você pode reprocessar seu código para carregar certificados de arquivos locais ou de um local do bucket do S3 em vez de carregá-los do repositório de chaves.
-
Status da resolução: você pode usar o keystore do AWS CloudHSM para armazenar certificados.
Problema: os buffers para criptografia AES-GCM não podem exceder 16.000 bytes.
Além disso, não há suporte para a criptografia AES-GCM em várias partes.
-
Impacto: não é possível usar o AES-GCM para criptografar dados maiores que 16.000 bytes.
-
Solução alternativa: use um mecanismo alternativo como o AES-CBC ou divida os dados em partes e criptografe cada parte individualmente. Se você dividir os dados, gerencie o texto cifrado dividido e sua descriptografia. Como o FIPS requer que o vetor de inicialização (IV) para AES-GCM seja gerado no HSM, o IV de cada parte dos dados criptografados por AES-GCM será diferente.
-
Status da resolução: vamos corrigir o SDK para falhar explicitamente se o buffer de dados for muito grande. Estamos avaliando alternativas para oferecer suporte a buffers maiores sem depender da criptografia em várias partes. As atualizações serão anunciadas no fórum do AWS CloudHSM e na página de histórico de versões.
Problema: a derivação da chave Diffie-Hellman de curva elíptica (ECDH) é executada parcialmente dentro do HSM.
Sua chave privada EC permanece no HSM em todos os momentos, mas o processo de derivação de chaves é realizado em várias etapas. Consequentemente, os resultados intermediários de cada etapa estão disponíveis no cliente. Um exemplo de derivação de chave ECDH está disponível nos exemplos de código Java.
-
Impacto: o Client SDK 3 adiciona a funcionalidade ECDH ao JCE. Quando você usa a classe
KeyAgreementpara derivar uma SecretKey, ela fica disponível primeiro no cliente e, em seguida, é importada para o HSM. Um identificador de chave é retornado à aplicação. -
Solução alternativa: se você estiver implementando o descarregamento SSL/TLS no AWS CloudHSM, essa limitação pode não ser um problema. Se a aplicação precisar da sua chave para permanecer continuamente em um limite FIPS, é recomendável o uso de um protocolo alternativo que não dependa da derivação de chaves ECDH.
-
Status da resolução: o SDK 5.16 agora suporta ECDH com derivação de chave, que é executada inteiramente dentro do HSM.
Problema: KeyGenerator e KeyAttribute interpretam incorretamente o parâmetro de tamanho da chave como número de bytes em vez de bits
Ao gerar uma chave usando a função init da classe KeyGeneratorSIZE da enumeração KeyAttribute do AWS CloudHSM, a API espera incorretamente que o argumento seja o número de bytes da chave, quando deveria ser o número de bits da chave.
-
Impacto: as versões Client SDK 5.4.0 a 5.4.2 esperam incorretamente que o tamanho da chave seja fornecido às APIs especificadas como bytes.
-
Solução alternativa: converta o tamanho da chave de bits para bytes antes de usar a classe KeyGenerator ou a enumeração KeyAttribute para gerar chaves usando o provedor JCE do AWS CloudHSM se estiver usando as versões Client SDK 5.4.0 a 5.4.2.
-
Status da resolução: atualize a versão do Client SDK para 5.5.0 ou posterior, o que inclui uma correção para esperar corretamente os tamanhos das chaves em bits ao usar a classe KeyGenerator ou a enumeração KeyAttribute para gerar chaves.
Problema: o Client SDK 5 emite o aviso “Ocorreu uma operação ilegal de acesso reflexivo”
Ao usar o Client SDK 5 com Java 11, o CloudHSM emite o seguinte aviso de Java:
WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by com.amazonaws.cloudhsm.jce.provider.CloudHsmKeyStore (file:/opt/cloudhsm/java/cloudhsm-jce-5.6.0.jar) to field java.security .KeyStore.keyStoreSpi WARNING: Please consider reporting this to the maintainers of com.amazonaws.cloudhsm.jce.provider.CloudHsmKeyStore WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release
Esse problema foi corrigido no Client SDK versão 5.8 e posterior.
Problema: o pool de sessões do JCE está esgotado
Impacto: talvez você não consiga realizar operações no JCE depois de ver a seguinte mensagem:
com.amazonaws.cloudhsm.jce.jni.exception.InternalException: There are too many operations happening at the same time: Reached max number of sessions in session pool: 1000
Soluções alternativas:
Reinicie seu aplicativo JCE se você estiver enfrentando um impacto.
Ao realizar uma operação, talvez seja necessário concluir a operação JCE antes de perder a referência à operação.
nota
Dependendo da operação, pode ser necessário um método de preenchimento.
Operação Método(s) de preenchimento Cifra doFinal()no modo criptografar ou descriptografarwrap()no modo encapsularunwrap()no modo desencapsularKeyAgreement generateSecret()ougenerateSecret(String)KeyPairGenerator generateKeyPair(),genKeyPair(), oureset()KeyStore Nenhum método é necessário Mac doFinal()oureset()MessageDigest digest()oureset()SecretKeyFactory Nenhum método é necessário SecureRandom Nenhum método é necessário Assinatura sign()no modo de sinalverify()no modo de verificação
Status da resolução: resolvemos esse problema no Client SDK 5.9.0 e versões posteriores. Para corrigir esse problema, atualize seu Client SDK para uma dessas versões.
Problema: vazamento de memória do Client SDK 5 com operações getKey
-
Impacto: a operação da API
getKeytem um vazamento de memória no JCE nas versões 5.10.0 e anteriores do Client SDK. Se você estiver usando a APIgetKeyvárias vezes em sua aplicação, isso aumentará o crescimento da memória e, consequentemente, aumentará o espaço ocupado pela memória em sua aplicação. Com o tempo, isso pode causar erros de controle de utilização ou exigir que a aplicação seja reiniciada. -
Solução alternativa: recomendamos a atualização para o Client SDK 5.11.0. Se isso não puder ser feito, recomendamos não chamar a API
getKeyvárias vezes em sua aplicação. Em vez disso, reutilize a chave retornada anteriormente da operaçãogetKeyanterior, tanto quanto possível. -
Status da resolução: atualize a versão do Client SDK para 5.11.0 ou posterior, o que inclui uma correção para esse problema.