我正在Swift中构建一个iOS应用程序,它需要能够使用RS256或RS512验证带有公钥证书的JWT令牌签名。
我一直在努力寻找支持这些功能的图书馆,但在实施我找到的图书时遇到了问题。
因此,我的问题是为Swift iOS应用程序实现此类功能的推荐方法是什么?
理想的情况是能够在JWT.io上使用一个公认的框架。 JWT.io上唯一支持RS256或RS512的Swift库是以下库: https://github.com/vapor/jwt
这个库支持的功能是理想的,但它需要通过Swift Package Manager实现,并使用Vapor构建。 iOS目前不支持Swift包管理器,但我已经知道有一些解决方法可以让swift包管理器与iOS应用程序一起使用。如果库可以在iOS应用程序上运行,这些是可以采取的解决方法。然而,由于该库是为Vapor构建的,我的问题是,是否有可能让我的iOS应用程序上的库能够运行?
如果无法使用此库,是否还有其他建议使用的库?如果没有,实施此请求功能的推荐方法是什么?是否推荐可以在应用程序上运行的Objective-C库?
提前致谢!
编辑: 通过验证我的意思是我想验证令牌中的签名是否正确,这意味着JWT令牌已经使用服务器上的私钥进行签名,该私钥是应用程序上的公钥证书所对应的。不只是解码Base64Check有效载荷。
编辑2: 我试图实现的是支持非对称密钥的功能,这意味着必须不的秘密存储在服务器和客户端应用程序上。我试图实现该应用程序仅包含非秘密信息,因此是公钥证书。
答案 0 :(得分:4)
不确定你是否仍然坚持这一点,但我处于完全相同的状况,需要一段时间才能搞清楚。我最终使用了JWT pod,并被this文章推向了正确的方向。我将总结一下我的发现。
由于Apple放弃OpenSSL而转而使用自己的安全库,输入必须是包含公钥的自签名证书。使用OpenSSL使用您的私钥作为输入执行此类操作:
openssl req -key private_key.pem -new -x509 -days 3650 -out selfsigned_cert.pem
然后将PEM格式转换为DER,这基本上是删除b64装甲:
openssl x509 -outform der -in selfsigned_cert.pem -out selfsigned_cert.der
将.der文件添加到Xcode项目中的Supporting Files
,然后从磁盘读取证书数据,base64对其进行编码:
NSURL *fileURL = [NSURL fileURLWithPath:[bundle pathForResource: @"selfsigned_cert" ofType:@"der"]];
NSData *certificateData = [NSData dataWithContentsOfURL:fileURL];
// Probably want to do a nil-check on certificateData here
NSString *certificateStr = [JWTBase64Coder base64UrlEncodedStringWithData:certificateData];
然后将其插入JWT解码器:
JWTBuilder *decodeBuilder = [JWTBuilder decodeMessage:token] // your JWT
.secret(certificateStr)
.algorithmName(algorithmName); // From your token or a predefined string
NSDictionary *payload = decodeBuilder.decode;
您可以通过检查构建器中的错误来检查解码/验证是否成功:
if(decodeBuilder.jwtError != nil) { /* do stuff */ }
修改:作为旁注。转换为DER然后b64编码它似乎是多余的,它基本上只是从PEM格式中删除锚线。我在磁盘上有.der文件的原因是因为我们可以根据需要直接使用安全库。