我正在遵循Apple关于编写CloudKit Web服务请求的指南。我遇到的麻烦是“身份验证Web服务请求”下的步骤2:
- 用您的私钥计算此消息的ECDSA签名。
在此之前,我生成了一个.pem文件证书,在文本编辑器中打开该文件时会显示我的私钥,因此我也使用字符串格式。
我还遵循了生成消息所指内容的步骤,现在将其作为字符串。
因此,假设我有一个私钥(或.pem文件(如果需要))和一条消息作为字符串,那么从我的私钥中计算出消息的ECDSA签名在理论上应该相当简单。但是,这就是我努力的地方。我在网上发现的图书馆似乎采用了更为复杂的方法,其中的移动部件不同,没有引用.pem文件,也没有谈论生成新的公共/私有密钥。
此步骤的任何帮助将不胜感激。
看起来目前缺少用于Ruby的OpenSSL EC支持的文档和实际API。特别是,在Ruby <= 2.3.1中,OpenSSL::PKey::EC
用于签名和验证的API与RSA和DSA密钥使用的API不同。您想要做的,但是目前还不能使用EC键,是这个(这里的所有代码都假设您已经在require 'openssl'
某个地方调用了):
# Get the key, here I'm reading the file
priv_key = OpenSSL::PKey.read(File.read('eckey.pem'))
# This should be the appropriately formatted string
data = "some data to sign"
# The hash algorithm, I assume SHA256 is being used
digest = OpenSSL::Digest::SHA256.new
# This doesn't work in 2.3.1, but does in 2.4.0-preview1
signature = priv_key.sign(digest, data)
正如我在评论中所指出的那样,这在Ruby 2.4.0-preview1中确实有效,但这对您来说可能用处不大。
要使其与当前的Ruby一起使用,您需要执行以下操作:
# As before:
priv_key = OpenSSL::PKey.read(File.read('eckey.pem'))
data = "some data to sign"
signature = priv_key.dsa_sign_asn1(OpenSSL::Digest::SHA256.digest(data))
这两种技术都为您提供了二进制字符串。我认为您需要对base64进行编码,然后再将其添加为请求标头。
提取公共密钥以检查签名是否经过验证也有些棘手(尽管您可以只使用openssl
命令行来读取文件)。这些public_key
方法返回一个OpenSSL::PKey::EC::Point
对象而不是实际密钥,因此我们需要从私钥中重新创建一个。该verify
方法确实适用于Ruby 2.3.1:
pub = OpenSSL::PKey::EC.new(priv_key.group)
pub.public_key = priv_key.public_key
data = "some data to sign"
digest = OpenSSL::Digest::SHA256.new
puts pub.verify(digest, sig, data)
Apple页面似乎没有指定要使用的哈希算法,但是从我所看到的来看,它看起来像SHA-256是正确的。(另外,我可能完全错了,Apple使用的是完全不同的格式。我很想知道此代码是否对您有用)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句