-1

我正在构建一个 Web 服务来充当 Web 应用程序之间的接口——它将使用带有时间戳证书的 rsa-sha256 签署一个 xml 文档——和一个 pkcs#11 令牌。
令牌制造商是“SafeSign (Giesecke+Devrient)”。它使用 Linux 上的 libaetpkss.so 库或 Windows 上的 aetpkss1.dll 库。

按照https://docs.oracle.com/javase/8/docs/technotes/guides/security/p11guide.html#Login中描述的“令牌登录”说明进行操作。

使用来自 java-1.8.0-openjdk 的 JRE。
jar 是在 Centos 7 中编译的。

更新标题和源代码,这也回答了 Martin Zeitler 的评论,并重新提出了我的问题,因为我可以取得一些进展,现在该应用程序可以正常工作。

但是,当用户在 Firefox 上调用 Web 服务时,我需要让它在浏览器上询问用户的 PIN。它会在控制台上提示输入 PIN,即使它是通过浏览器调用的。

令牌库已按照制造商的说明在 Firefox 上配置。

到目前为止,我无法尝试 Tiago 的答案。

代码中涉及的部分是:

    private static CallbackHandler callbackHandler = new CallbackHandler() {
        @Override
        public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
            for (Callback callback : callbacks) {
                if (callback instanceof PasswordCallback) {
                    passwordCallback = (PasswordCallback)callback;
                    System.err.print(passwordCallback.getPrompt());
                    System.err.flush();
                    passwordCallback.setPassword(System.console().readPassword());
                    PIN = passwordCallback.getPassword();
                }
            }
        }
    };
    
    private void loadKeyStore(String pkcs11Config) throws KeyStoreException, FileNotFoundException {
        SunPKCS11 pkcs11Provider = new SunPKCS11(new FileInputStream(pkcs11Config));
        Security.addProvider(pkcs11Provider);
        KeyStore.CallbackHandlerProtection chp = new KeyStore.CallbackHandlerProtection(callbackHandler);
        builder = KeyStore.Builder.newInstance("PKCS11", pkcs11Provider, chp);
        keyStore = builder.getKeyStore();
    }

    public KeyStore openKeyStore() throws IOException {
        try {
            keyStore.load(null, PIN);
            privateKey = (PrivateKey)keyStore.getKey(keyStore.aliases().nextElement(), PIN);
            certificate = (X509Certificate)keyStore.getCertificate(keyStore.aliases().nextElement());

pkcs11Config变量指向pkcs11.cfg文件路径,内容为:
name=SafeSign
library=/usr/lib64/libaetpkss.so
slotListIndex=0

4

1 回答 1

0

阿尔米尔,蟒蛇。Aqui é Tiago, da Montreal, amigo do Expedito。Certa vez precisamos implementar a assinatura de documentos para o e-Financeira (Receita Federal), e para tal, como a assinatura poderia utilizar certificados A1 e A3, baseamos nossa solução utilizando o framework Demoiselle, que contém bastante coisa relativa a este assunto em Java ,包括 Windows e Linux 的示例。Acredito que este link possa te ajudar: https://www.frameworkdemoiselle.gov.br/v3/signer/docs/funcionalidades-keystore.html

Neste exemplo de uso, o callbackhandler usado é o padrão sun.security.pkcs11.SunPKCS11。Olhe o código:https ://raw.githubusercontent.com/demoiselle/certificate/master/impl/core/src/main/java/br/gov/frameworkdemoiselle/certificate/keystore/loader/implementation/DriverKeyStoreLoader.java

于 2022-02-16T03:21:53.503 回答