我正在尝试对我使用oracle 的本教程的文件进行数字签名。
这一切在我的本地机器上运行得很好,但是当我尝试在没有鼠标、键盘等的 Web 服务器上运行它时。我设法只签署一个文件,并且每一次尝试都会导致以下异常发生:
java.security.ProviderException: nextBytes() failed
这恰好在执行 sign 函数时发生:
byte[] realSig = dsa.sign();
从我目前所了解到的情况来看,这可能是由于耗尽了生成随机序列所需的熵池造成的。在没有输入设备的服务器上,它的填充速度不够快。如果情况确实如此,一种解决方案可能是将随机种子的来源从 dev/random 更改为 dev/urandom,但据说出于安全原因这并不好。
所以问题是:这真的是我的问题的原因吗?如果是这样,强制Java使用dev/urandom的方法是什么?或者有没有更好的方法来处理这个?
编辑:正如这里有人提到的,但在我回复之前已经删除了他的答案,添加以下代码解决了这个问题:
if (System.getProperty("java.security.egd") == null) {
System.setProperty("java.security.egd", "file:///dev/urandom");
}
它可能不是最好的解决方案,但足以签署和验证文件。