Keycloak¶
Para utilizar ou Keycloak com o NetHSM, de forma a armazenar com segurança as chaves privadas no NetHSM e, ao mesmo tempo, permitir que o Keycloak assine tokens de acesso e descodifique JWE, é necessário instalar e configurar este fornecedor de chaves da seguinte forma:
Divulgação sobre IA¶
Este provedor foi desenvolvido e revisto com um apoio substancial da IA.
Prepare the NetHSM¶
Prepare o NetHSM da seguinte forma. Consulte a secção administration para obter instruções detalhadas.
Se o NetHSM utilizar um certificado autoassinado, registe a sua impressão digital:
echo | openssl s_client -connect $NETHSM_HOST 2>/dev/null \ | openssl x509 -fingerprint -sha256 -noout
Crie um utilizador com o papel de Operador dedicado ao Keycloak.
A extensão Keycloak deteta chaves, mas não as cria. Crie manualmente as chaves pretendidas:
O ID da chave deve começar com o prefixo que o reino irá reivindicar. Escolha um esquema de nomenclatura adequado, como
kc-<realm>-<purpose>-<year>(por exemplo,kc-staff-sig-rs256-2026,kc-partners-sig-es256-2026,kc-customers-enc-oaep-2026). O ID passa a ser okidque o Keycloak publica. A futura rotação de chaves é realizada através da adição de novos IDs, razão pela qual sugerimos utilizar o ano como parte do ID da chave.Os mecanismos determinam quais os algoritmos JOSE que a chave pode suportar:
NetHSM key type and mechanism
JOSE algorithms served
RSA+RSA_Signature_PKCS1RS256, RS384, RS512 — independente do algoritmo de hash, pelo que uma única chave abrange os três
RSA+RSA_Signature_PSS_SHA256/_SHA384/_SHA512PS256 / PS384 / PS512 — apenas o algoritmo a que os nomes dos mecanismos se referem
EC_P256/EC_P384/EC_P521+ECDSA_SignatureES256 / ES384 / ES512 — a curva determina o algoritmo
Curve25519+EdDSA_SignatureEdDSA
RSA+RSA_Decryption_OAEP_SHA1/_SHA256RSA-OAEP / RSA-OAEP-256, para descodificar JWE recebidos
Instalação¶
Descarregue o ficheiro JAR do provedor NetHSM do Keycloak ` <https://github.com/Nitrokey/nethsm-keycloak/releases>` __, guarde-o na pasta de provedores do Keycloak, por exemplo, /opt/keycloak/providers/
Recriar o registo de fornecedores: /opt/keycloak/bin/kc.sh build
Configuração¶
As configurações podem ser definidas no ficheiro ` `` conf/keycloak.conf` ou como variáveis de ambiente. Ambas as formas correspondem às mesmas configurações; as variáveis de ambiente têm prioridade, pelo que os valores não confidenciais podem constar no ficheiro, sendo apenas a frase-passe inserida em tempo de execução.
Utilizando conf/keycloak.conf¶
spi-keys--nethsm--url=https://nethsm.internal:8443/api/v1
spi-keys--nethsm--username=keycloak
spi-keys--nethsm--passphrase=<passphrase>
spi-keys--nethsm--tls-fingerprints=aabbcc...
Using environment variables¶
É a opção preferida em implementações em contentores, uma vez que a frase-passe pode ser fornecida a partir de um segredo do Docker ou do Kubernetes, em vez de ser gravada num ficheiro.
KC_SPI_KEYS__NETHSM__URL=https://nethsm.internal:8443/api/v1
KC_SPI_KEYS__NETHSM__USERNAME=keycloak
KC_SPI_KEYS__NETHSM__PASSPHRASE="<passphrase>"
KC_SPI_KEYS__NETHSM__TLS_FINGERPRINTS=aabbcc...
Nota
O nome da variável de ambiente é derivado automaticamente da chave de configuração: anteponha-lhe KC_, converta para maiúsculas e substitua cada - por _. Os sublinhados duplos decorrem da estrutura da chave, spi-<spi-name>--<provider-id>--<option>, que, para esta extensão, é SPI keys, provider nethsm e o nome da opção.
See also all available configuration options.
Restart Keycloak¶
O perfil de ligação só é lido quando a fábrica de fornecedores é inicializada. Reinicie o Keycloak.
Confirm the server configuration¶
Verifique o registo de arranque antes de configurar qualquer domínio. Isto permite distinguir um problema de ligação ou de credenciais de um problema de configuração do domínio.
Em caso de sucesso:
NetHSM key provider ready: 1 instance(s), user 'keycloak',
discovery cache PT5M, on-unavailable fail
Otherwise:
Log message |
Cause |
|---|---|
Não aparece nenhuma mensagem, ou aparece uma linha de depuração a indicar que o fornecedor está inativo |
|
|
Endereço incorreto, bloqueado por uma firewall, incompatibilidade do PIN do certificado ou o NetHSM está bloqueado ou não foi configurado |
|
Wrong username or passphrase |
Adicionar o fornecedor a um domínio¶
No console de administração, aceda a Definições do Realm → Chaves → Fornecedores, selecione Adicionar fornecedor e selecione nethsm.
Field |
Significado |
|---|---|
Key use |
|
Key ID prefix |
Todas as chaves NetHSM cujo ID comece por esta sequência de caracteres são publicadas por este domínio |
Algorithm |
O algoritmo ao abrigo do qual estas chaves são publicadas |
Priority |
|
Enabled / Active |
Ambos têm de estar ativados para que uma chave possa assinar |
Um componente publica um algoritmo, à semelhança dos fornecedores de chaves integrados no Keycloak. Um reino que necessite tanto de RS256 como de ES256 tem, portanto, dois componentes. As chaves com o prefixo que não suportem o algoritmo escolhido são ignoradas, pelo que um prefixo pode corresponder, com segurança, a um conjunto misto de chaves.
Cuidado
Não aponte dois componentes para a mesma chave com algoritmos diferentes. Ambos publicariam uma entrada JWKS sob o mesmo kid.
Defina a prioridade acima de 100¶
Importante
Um reino recém-criado contém quatro fornecedores de chaves gerados — rsa-generated, rsa-enc-generated, hmac-generated e aes-generated — todos com a prioridade 100. O componente NetHSM deve ter uma prioridade mais elevada; caso contrário, o Keycloak continua a assinar com uma chave de software gerada e a configuração parece funcionar.
Um valor de 200 para o NetHSM é um valor predefinido razoável.
Selecione o algoritmo para o reino¶
Defina Realm Settings → Tokens → Default Signature Algorithm para o algoritmo configurado no componente. Se o realm solicitar um algoritmo que o componente não publique, o Keycloak recorre a uma chave gerada sem reportar um erro.
Verificar¶
List the published keys:
curl -s https://<keycloak-host>/realms/<realm>/protocol/openid-connect/certs
Os valores « ` » kid` devem corresponder aos IDs das chaves NetHSM.
A verificação definitiva é um token emitido. Solicite um e descodifique o seu cabeçalho:
curl -s \
-d "client_id=<client>" \
-d "client_secret=<secret>" \
-d "grant_type=client_credentials" \
https://$NETHSM_HOST/realms/<realm>/protocol/openid-connect/token \
| python3 -c 'import sys, json, base64
header = json.load(sys.stdin)["access_token"].split(".")[0]
print(json.loads(base64.urlsafe_b64decode(header + "==")))'
Se kid for o ID da chave do NetHSM, a assinatura foi gerada no interior do HSM. Também pode consultar o registo do NetHSM em paralelo, que deverá apresentar uma chamada correspondente.
Further Details¶
You find further details here.