Bab*_*ica 6 javascript php digital-certificate capicom digital-signature
我有一个在浏览器中签署文本字符串的Javascript.它在Internet Explorer下使用CAPICOM,在Mozilla浏览器下使用window.crypto.签名过程后,我收到一个BASE64编码签名.
使用HTTPS我将签名和文本字符串上传到带有PHP应用程序的Web服务器.从SSL(HTTPS)我收到用户的证书.从这个证书我可以提取用户的公钥.
现在我想验证签名文本字符串的签名以及用户的证书和公钥.我试过openssl_verify PHP函数没有成功.
我总是收到一个错误:
错误:0408D077:rsa例程:FIPS_RSA_VERIFY:签名长度错误
不幸的是我无法验证签名?我无法提供演示或示例,因为它目前仅在本地网络中.
好吧,我终于找到了解决方法。
window.crypto. 欲了解更多信息,请阅读此内容window.crypto和 CAPICOM 都没有很好的用于 Web 使用的文档(CAPICOM 不仅适用于 Web!)现在的问题是:
openssl_verify()也没有很好的文档记录,并且总是返回零 - 签名无效。那么解决方法是什么:
signText()函数需要第三个参数,该参数必须是受信任的证书颁发机构名称。首先我预计这一定是客户端证书颁发者的 CN。但实际上并非如此。它必须是用逗号分隔的所有颁发者字符串,例如:"C=Country,ST=State,L=Location,O=Organization,CN=CommonName,STREET=Address"不幸的是,该字符串与 openssl 中的颁发者字符串略有不同,后者看起来像issuer=/streetAddress=Address/CN=CommonName/O=Organization/L=Location/ST=State/C=Country。如果有人在 Linux 下使用 Firefox,那么检查该字符串的格式是否相同将会非常有趣。我不知道如何在单个字符串中分隔更多 CA 名称。现在。我的源代码是什么样的:
window.crypto(我从网络浏览器收到一个附加参数,如何生成签名)如果使用 CAPICOM,我将像这样转换源数据:$_POST['source'] = iconv('UTF-8', 'UTF-16LE', $_POST['source'])"-----BEGIN PKCS7-----\n".$_POST['signature']."\n-----END PKSC7-----"请注意,页眉和页脚必须位于单独的行上。行分隔符只能是 \n (ASCII #10),不能是 \r\n (ASCII #13#10) 或 \r\n (ASCII #13)。smime- 使用CMD工具的SMIME功能-verify- 进行验证-in filepath- 步骤 4 中创建的签名文件的路径-inform PEM- 签名的格式是带有页眉和页脚的 BASE64 编码文件-binary- 阻止源代码从二进制转换为文本-content filepath- 步骤 3 中创建的源文件的路径-CAfile filepath- 步骤 5 中创建的受信任 CA 根证书文件的路径 因此最终命令如下所示:openssl smime -verify -in file.pem -inform PEM -binary -content source.txt -CAfile root.pemVerification successful- 开头,则签名正常Verification failure- 开头,则签名不正确以上对我有用。不幸的是,openssl、CAPICOM 都window.crypto非常棘手,总是有可能出现问题。希望这会对某人有所帮助。
此致
| 归档时间: |
|
| 查看次数: |
4353 次 |
| 最近记录: |