3

我正在尝试对我使用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");
}

它可能不是最好的解决方案,但足以签署和验证文件。

4

0 回答 0