###実現したいこと
Android向けのアプリを作成中で、セキュリティの為にGoogleのSafetyNetを利用したいと思っています。
こちらのサイトを参考にさせて頂き途中までは進められたのですが、rubyを使った署名検証のところでつまづいています。訳あってサーバー側はrubyではなくPHPで実装したい為、参考サイトの署名検証の処理をPHPに書き換えたいのですが上手く出来ません。
サイトを参考にして
- SafetyNetのライブラリを使って端末の情報をGoogleサーバーに送り
- GoogleサーバーからのJWT(JSON Web Token)を端末が受け取り
- 端末が自前サーバー(Apache)にJWTを送る
まで出来ました。
自前サーバーにて受け取ったJWTをLogに保存して、以下の事を試してみました。
- JWTは"ヘッダ.ペイロード.署名" の順番にピリオド('.')で連結されているらしいので、ピリオドで分割
- 分割したうちのペイロード部分をbase64_decodeした場合、正しいパラメータが表示されることを確認
- ヘッダ部分をbase64_decode後にjsonDecodeすると
stdClass Object
(
[alg] => RS256
[x5c] => Array
(
[0] => 文字列
[1] => 文字列
)
}
となることを確認
- 上記 x5cの各配列についてopenssl_x509_read ()など試してみましたがエラーが表示される [Warning: openssl_x509_read(): supplied parameter cannot be coerced into an X509 certificate!]
- 署名部分をbase64_decodeした場合printでなにも表示されない
rubyのOpenSSL::X509::StoreのようなX509の証明書ストア(?)を作成して使う などといったことはPHPでは出来ないのでしょうか?
rubyは初めてなので調べながら進めていて、サンプルコードで理解出来ない個所も多々ありますがよろしくお願いします。
##該当のソースコード
ruby
1//参考にしたrubyコード 2require 'jwt' 3class InvalidLeafCertificate < StandardError; end 4class InvalidCertificateChain < StandardError; end 5 6X509_STORE = OpenSSL::X509::Store.new 7X509_STORE.set_default_paths #X509_STOREにて、システムの証明書が格納されているパスを代入するメソッド 8 9# 正しい署名の検証に成功すればtrue 10# 不正なものがあればfalse 11def improved_valid_jwt_signature?(jwt) 12 13 jwt = jwt.gsub(/(\r\n|\r|\n|\f)/,"") 14 ::JWT.decode(jwt, nil, true) do |header| 15 16 17 # 証明書チェインのすべての証明書をインスタンス化 18 certs = header['x5c'].map{|c| OpenSSL::X509::Certificate.new(Base64.decode64(c))} 19 20 # リーフ証明書の取り出し 21 leaf_cert = certs.first 22 23 # 証明書チェインの取り出し 24 cert_chain = certs.drop(1) 25 26 # リーフ証明書と今検証しようとしているホスト名の整合性の確認 27 unless OpenSSL::SSL.verify_certificate_identity(leaf_cert, 'attest.android.com') 28 raise InvalidLeafCertificate, "Certificate isn't issued for the hostname attest.android.com" 29 end 30 31 # 証明書チェインを用いて、証明書の正当性を確認 32 unless X509_STORE.verify(leaf_cert, cert_chain) 33 raise InvalidCertificateChain, "Certificate chain verification is failed" 34 end 35 36 # 検証に使った証明書たち 37 pp X509_STORE.chain 38 39 # JWT検証用の公開鍵を取り出す 40 leaf_cert.public_key 41 end 42 43 true 44rescue JWT::VerificationError, JWT::DecodeError, InvalidLeafCertificate, InvalidCertificateChain 45 false 46end 47 48################ 49# 実行サンプル用出力 # 50################ 51 52 53MAL_JWT = "#{不正なJWT(省略)}" 54SAFETYNET_JWT="#{SafetyNetAPIで取得した正規のJWT(省略)}" 55 56puts "malformed JWT" 57puts "result == #{improved_valid_jwt_signature?(MAL_JWT)}" 58puts "safetynet JWT" 59puts "improved_result == #{improved_valid_jwt_signature?(SAFETYNET_JWT)}"
###補足情報(言語/FW/ツール等のバージョンなど)
XAMPP ver7.0.8
Apache1.2.4.18(win32)
PHP7.0.8
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/10 11:21