2017-04-26 4 views
2

SwiftでiOSアプリケーションを構築していますが、RS256またはRS512を使用して公開鍵証明書でJWTトークン署名を検証する必要があります。Swift iOSでRS256またはRS512でJWTトークンを検証する

私はこのような機能をサポートするライブラリを見つけようとしてきましたが、見つけたものを実装する際に問題がありました。

私の質問は、Swift iOSアプリケーションのためのこのような機能を実装するための推奨される方法は何ですか?

理想的なシナリオは、JWT.ioで認識されたフレームワークの1つを使用できることです。 RS256をサポートしているか、RS512は次のライブラリですJWT.ioにのみスウィフトライブラリ: https://github.com/vapor/jwt

機能は、このライブラリのサポートが理想的ですが、それはしかしスウィフトパッケージマネージャを使用して実装を必要とし、蒸気を使用して構築されています。 Swift Package Managerは現在iOSではサポートされていませんが、迅速なパッケージマネージャにiOSアプリケーションを使用させる回避策があることを読んだことがあります。これらは、ライブラリがiOSアプリケーション上で機能することができた場合に対処するための回避策です。しかし、ライブラリがVaporのために構築されているので、私が作っているiOSアプリケーションでライブラリを機能させることさえできるのかどうかということです。

このライブラリを使用できない場合は、他のライブラリを使用することをお勧めしますか?そうでない場合、この要求された機能を実装するために推奨される方法は何ですか?アプリケーションで機能することができる推奨Objective-Cライブラリはありますか?

ありがとうございました!

編集: 検証すると、トークンの署名が正しいことを確認します。つまり、アプリケーションの公開鍵証明書がサーバー上の秘密鍵で署名されていることを確認します。対応する。 Base64Checkペイロードをデコードするだけではありません。

編集2: 私は何を達成しようとしていることは秘密がサーバーとクライアントアプリケーションの両方に保存されていないなければならないことを意味し、非対称キーをサポートした機能です。私は、アプリケーションには秘密でない情報しか含まれておらず、したがって公開鍵証明書を含んでいることを達成しようとしています。

+0

JWTトークンの検証の意味は?このトークンを読むだけですか? –

+0

あなたはこのlib https://github.com/kylef/JSONWebToken.swiftについてお読みですか? –

答えて

3

あなたがまだこの問題に取り組んでいるかどうかはわかりませんが、私はまったく同じ状況にあり、理解するまでに時間がかかりました。私はJWT podを使用して終了し、thisの記事で正しい方向にプッシュされました。私は私の所見を要約します。

AppleがOpenSSLを自分自身のセキュリティライブラリに置き換えるため、入力は公開鍵を含む自己署名証明書でなければなりません。 OpenSSLのでは入力として、あなたの秘密鍵を使用して、このような何かを:次に

openssl req -key private_key.pem -new -x509 -days 3650 -out selfsigned_cert.pem 

PEM形式は、基本的にはB64の外装を取り除いているDERに変換します。

openssl x509 -outform der -in selfsigned_cert.pem -out selfsigned_cert.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ファイルを持っているのは、これが私たちが必要であればSecurityライブラリで直接使うことができるからです。

+1

この回答は非常に役に立ち、受け入れられるべきです。 – whitney13625

+0

これは、プライベートRS256で署名されたiOS(スウィフト)上のJWTを検証している自分の目標をアーカイブするのに非常に近いものでした。しかし、答えは時代遅れで、JWTポッドは数回更新されたようです。誰かがこれを行う方法の迅速な例を提供することができますか?私たちは依然として自己署名入りの証明書が必要ですか、または十分に公開鍵ですか? – iCediCe

関連する問題