Java segurança - provedor MSCAPI: Como usar sem pop-up senha?
-
20-08-2019 - |
Pergunta
Eu consegui usar Sun MSCAPI provedor em meu aplicativo. O problema que estou tendo agora é que ele sempre aparece uma janela, pedindo uma senha, mesmo que eu forneci-lo no código. Este é um problema, porque eu preciso a funcionalidade de criptografia em um webservice.
Aqui está o código que eu tenho agora:
String alias = "Alias to my PK";
char[] pass = "MyPassword".toCharArray();
KeyStore ks = KeyStore.getInstance("Windows-MY");
ks.load(null, pass);
Provider p = ks.getProvider();
Signature sig = Signature.getInstance("SHA1withRSA",p);
PrivateKey key = (PrivateKey) ks.getKey(alias, pass)
sig.initSign(key);
sig.update("Testing".getBytes());
sig.sign();
Esse é um trabalho grande, mas eu recebo um pop-up pedindo a senha quando a última linha é executado. Como posso evitar isso?
Solução
O provedor MSCAPI não suporta fornecer a senha para CAPI:
Um modo de compatibilidade é suportada para aplicações que assumem uma senha deve ser fornecido. Ele permite (mas ignora) uma senha non-null. O modo é ativado por padrão. (1)
Para definir a senha através do CAPI, você deve chamar CryptSetKeyParam com o KP_KEYEXCHANGE_PIN indocumentados ou KP_SIGNATURE_PIN e espero provedor de token de seu hardware subjacente suporta. (Eles não são completamente indocumentados - a documentação para Windows CE e Windows Mobile mencioná-los ( 2) e eles estão incluídos nos arquivos de cabeçalho).
Outras dicas
Meu palpite é que o Windows está aparecendo a aparecer.
Import sua chave novamente usando o Assistente de importação de certificados, mas certifique-se de que você não verificar a seguinte opção na tela "Senha".
[_] Ativar forte proteção de chave privada. Você será solicitado cada vez que a chave privada é usada por um aplicativo se você ativar esta opção.
resolvi essa configuração o provedor como follow problema:
signeData = gen.generate(content, ks.getProvider());
Onde
ks
é um KeyStore
e
gen
is um CMSSignedDataGenerator