我正在构建一个 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