如何使用openssl模拟Java签名方法?

如何使用openssl模拟Java签名方法?,java,cryptography,openssl,Java,Cryptography,Openssl,我正在使用一个服务器,该服务器要求登录URL的该部分包含身份验证。该方案的工作方式(如手册中所建议)是 使用JavaJDKKeyTool(它在Java密钥库中创建公钥/私钥对)生成公钥/私钥对 使用javajdkkeytool为密钥对生成证书 该证书已安装在服务器上 登录客户端时(我的代码) 生成纯文本令牌字符串 使用SHA1和DSA使用私钥对明文令牌字符串进行签名 在登录URL中包含已签名的令牌字符串 Java keytool不提供从密钥库导出私钥的机制,但我有单独的Java代码从密钥

我正在使用一个服务器,该服务器要求登录URL的该部分包含身份验证。该方案的工作方式(如手册中所建议)是

  • 使用JavaJDKKeyTool(它在Java密钥库中创建公钥/私钥对)生成公钥/私钥对
  • 使用javajdkkeytool为密钥对生成证书
  • 该证书已安装在服务器上
登录客户端时(我的代码)

  • 生成纯文本令牌字符串
  • 使用SHA1和DSA使用私钥对明文令牌字符串进行签名
  • 在登录URL中包含已签名的令牌字符串
Java keytool不提供从密钥库导出私钥的机制,但我有单独的Java代码从密钥库中提取私钥并将其保存在基于的文件中

当客户机使用Java进行签名时,这一切都会起作用,代码如下所示

String plaintext = "This is a sample plaintext token string";
Signature instance = Signature.getInstance("SHA1withDSA");
instance.initSign(privateKey);
instance.update((plaintext).getBytes());
byte[] signature = instance.sign();
当客户端使用PHP进行签名时,它也可以工作,代码如下所示。这里,私钥是从PHP中的Java密钥库文件中检索的。]

$privateKey = openssl_pkey_get_private("file://$keyfile", $keystorePassword);
openssl_sign($paramsEncoded, $signature, $privateKey, OPENSSL_ALGO_DSS1))
然而,我现在遇到了这样一种情况:客户希望使用Bash脚本和openssl构建登录URL,但这不起作用。我最新版本的代码如下所示,先执行SHA1消息摘要,然后执行DSA签名。但是服务器拒绝该令牌

echo $tokenString | openssl dgst -sha1 > tokendigest
openssl dgst -dss1 -passin pass:$storePassword -sign $privateKeyFile > tokensigned
我看到了这篇文章(),它表明Java签名签名方法不会对摘要进行签名,而是对摘要算法ID和摘要的连接进行签名。在文章中逐步浏览代码之后,似乎(对于SHA1)摘要需要以字节为前缀
48 33 48 9 6 5 43 14 3 2 26 5 0 4 20
。但即使添加了这一点,我仍然无法让opensll生成服务器可以接受的签名令牌


有人知道如何使用openssl来模拟Java签名方法吗?

另一篇文章是一条红鲱鱼。DSA的工作方式与RSA不同,不使用MessageDigest前缀

但是
openssl dgst-dss1
应该可以直接工作(它包括SHA1消化)

你试过这个吗

echo -n $tokenString |
  openssl dgst -dss1 -passin pass:$storePassword -sign $privateKeyFile > tokensigned

我只是用同样的“令牌登录错误”结果尝试了一下。我甚至添加了一个openssl验证(如下所示),其中openssl报告了Verified OK
echo$tokenString | openssl dgst-dss1-passin pass:$storePassword-sign$privateKeyFile>$signedtokenposslfile echo$tokenString | openssl dgst-dss1-verify$publicKeyFile-signature$signedtokenposslfile
@Torid:您的问题可能是
echo
添加到字符串中的额外新行。尝试
echo-n
。是。
echo-n
修复了它。我喜欢stackoverflow.com,即使它让我觉得有点愚蠢。谢谢