質問編集履歴

1

誤字訂正

2018/02/27 12:50

投稿

aiueoao
aiueoao

スコア146

test CHANGED
@@ -1 +1 @@
1
- 証明書チェーンの検証に失敗します
1
+ [Unity]Android実機でStackFrameが使えない
test CHANGED
@@ -1,199 +1,149 @@
1
- ###前提・実現したいこと
1
+ ### 前提・実現したいこと
2
-
3
- [こちらのサイトを参考](http://developers.mobage.jp/blog/safetynet)にさせて頂き、Googleのサーバーから取得したJWT(JSON Web Token)の署名検証をしています。
4
-
5
- 署名検証にrubyを使っていますが、ruby初心者なので表題の件について詳細なエラーの調査が出来ません。検証の失敗する原因と調査方法が知りたいです。
6
-
7
- SSLについても未熟ですがよろしくお願いします。
8
2
 
9
3
 
10
4
 
11
- 検証までの流れは
5
+ Android実機、実行中メソッド名や行番号を取得したいです。
12
6
 
13
- 0. アプリがSafetyNetイブラリ利用てGoogleサーバに端末情報送信
7
+ そこでStackFrame使って取得を試みまたが 実機では出来ませんでした.
14
8
 
15
- 0. Googleサーバが署名したJWTをアプリに返信
16
9
 
17
- 0. アプリが受け取ったJWTを自前サーバ(Apache)に送信
18
10
 
19
- 0. 自前サーバでJWTの署名検証(下記 rubyコード)
11
+ 下記コードを手持ちの端末で実行してみると、
20
12
 
21
- となりす。
13
+ - UnityEditor(PC):期待した動作をしした(0~12までいってNullRefエラー表示).
22
14
 
23
- 3.は,JWTの送信にPOST使っています。また自前サーバ上のphpでJWTを受け取り,Logとして保存しています。
15
+ - スマホ :ボタン押下一発目NullRefエラー表示(ErrorCatch).
16
+
17
+ - タブレット :ボタン押下一発目で強制終了.
18
+
19
+ となりました.
24
20
 
25
21
 
26
22
 
27
23
 
28
24
 
29
- ###発生している問題・エラーメッセージ
30
25
 
26
+
27
+ 以上の試したことから、
28
+
31
- 上記過程を踏んだ場合でも、保存したログを直接rubyコードに埋め込ん検証した場合でも false(証明書チェーンの検証に失敗)ってしまます。
29
+ 0. AndroidはStackFrameクラスそのもの(?)が使えない?
30
+
31
+ 0. 同じAndroid端末でもエラーがcatch出来るものと出来ないものがある? 
32
+
33
+ という2つの問題についてご教示ください!
32
34
 
33
35
 
34
36
 
35
- ```
37
+ ### 該当のソースコード
36
38
 
39
+
40
+
41
+ ```c#
42
+
43
+ using System.Collections.Generic;
44
+
45
+ using UnityEngine;
46
+
47
+ using UnityEngine.UI;
48
+
49
+ using System;
50
+
51
+ using System.Diagnostics;
52
+
53
+ using System.Linq;
54
+
55
+
56
+
57
+ public class Test : MonoBehaviour
58
+
59
+ {
60
+
61
+ //確認用.
62
+
63
+ public Text text;
64
+
65
+ public Text errorText;
66
+
67
+
68
+
69
+ private int skipFrames = 0;
70
+
71
+
72
+
37
- Certificate chain verification is failed
73
+ private string ShowMessage(int skipFrames)
74
+
75
+ {
76
+
77
+ StackFrame sf = new StackFrame(skipFrames, true);
78
+
79
+ List<string> filePathElementList = new List<string>();
80
+
81
+ filePathElementList.AddRange(sf.GetFileName().Split('\'));
82
+
83
+ String fileName = filePathElementList.Last();
84
+
85
+ int lineNumber = sf.GetFileLineNumber();
86
+
87
+ return skipFrames.ToString() + " : " + fileName + "(" + lineNumber + ") ";
88
+
89
+ }
90
+
91
+
92
+
93
+ //ボタンイベント.
94
+
95
+ public void OnButton()
96
+
97
+ {
98
+
99
+ try
100
+
101
+ {
102
+
103
+ text.text = ShowMessage(skipFrames);
104
+
105
+ ++skipFrames;
106
+
107
+ }
108
+
109
+ catch (Exception e)
110
+
111
+ {
112
+
113
+ errorText.text = e.ToString();
114
+
115
+
116
+
117
+ }
118
+
119
+ }
120
+
121
+
122
+
123
+ }
38
124
 
39
125
  ```
40
126
 
41
127
 
42
128
 
43
- ###該当のソースコード
129
+ ### 試したこと
44
-
45
- ```ruby
46
130
 
47
131
 
48
132
 
133
+ 上記ソースコードは
49
134
 
135
+ Canvas上においたButtonを押すと,そのメソッドを呼び出した位置と行番号がtextに表示されます.
50
136
 
51
- # jwt_validation_sample.rb
52
-
53
-
54
-
55
- require 'jwt'
56
-
57
- class InvalidLeafCertificate < StandardError; end
58
-
59
- class InvalidCertificateChain < StandardError; end
60
-
61
-
62
-
63
- X509_STORE = OpenSSL::X509::Store.new
64
-
65
- X509_STORE.set_default_paths #X509_STOREにて、システムの証明書が格納されているパスを代入するメソッド
66
-
67
-
68
-
69
- # 正しい署名の検証に成功すればtrue
70
-
71
- # 不正なものがあればfalse
72
-
73
- def improved_valid_jwt_signature?(jwt)
74
-
75
-
76
-
77
- jwt = jwt.gsub(/(\r\n|\r|\n|\f)/,"")
137
+ ボタン押下でStackFrame()に入れる数を大きくして、次の押下でさらに上のスタックフレームを取得します.
78
-
79
- ::JWT.decode(jwt, nil, true) do |header|
80
-
81
-
82
-
83
-
84
-
85
- # 証明書チェインのすべての証明書をインスタンス化
86
-
87
- certs = header['x5c'].map{|c| OpenSSL::X509::Certificate.new(Base64.decode64(c))}
88
-
89
-
90
-
91
- # リーフ証明書の取り出し
92
-
93
- leaf_cert = certs.first
94
-
95
-
96
-
97
- # 証明書チェインの取り出し
98
-
99
- cert_chain = certs.drop(1)
100
-
101
-
102
-
103
- # リーフ証明書と今検証しようとしているホスト名の整合性の確認
104
-
105
- unless OpenSSL::SSL.verify_certificate_identity(leaf_cert, 'attest.android.com')
106
-
107
- raise InvalidLeafCertificate, "Certificate isn't issued for the hostname attest.android.com"
108
-
109
- end
110
-
111
-
112
-
113
- # 証明書チェインを用いて、証明書の正当性を確認
114
-
115
- unless X509_STORE.verify(leaf_cert, cert_chain)
116
-
117
- raise InvalidCertificateChain, "Certificate chain verification is failed"
118
-
119
- end
120
-
121
-
122
-
123
- # 検証に使った証明書たち
124
-
125
- pp X509_STORE.chain
126
-
127
-
128
-
129
- # JWT検証用の公開鍵を取り出す
130
-
131
- leaf_cert.public_key
132
-
133
- end
134
-
135
-
136
-
137
- true
138
-
139
- rescue JWT::DecodeError =>e
140
-
141
- puts e
142
-
143
- rescue InvalidLeafCertificate => e
144
-
145
- puts e
146
-
147
- rescue InvalidCertificateChain =>e
148
-
149
- puts e
150
-
151
- false
152
-
153
- end
154
-
155
-
156
-
157
- ################
158
-
159
- # 実行サンプル用出力 #
160
-
161
- ################
162
-
163
-
164
-
165
- SAFETYNET_JWT="#{SafetyNetAPIで取得した正規のはずのJWT(省略)}"
166
-
167
-
168
-
169
- puts "safetynet JWT"
170
-
171
- puts "improved_result == #{improved_valid_jwt_signature?(SAFETYNET_JWT)}"
172
138
 
173
139
 
174
140
 
175
- ```
141
+ ### 補足情報(FW/ツールのバージョンなど)
176
142
 
143
+ PC:Windows8.1
177
144
 
145
+ スマホ:FREETEL(Android Ver7.0)
178
146
 
179
- ###試したこと
147
+ タブレット:ASUS MeMO Pad 7 ME572CL (Android Ver5.0.1)
180
148
 
181
- [rubyリファレンスマニュアル](https://docs.ruby-lang.org/ja/latest/class/OpenSSL=3a=3aX509=3a=3aStore.html)のX509_STORE.verifyの項目で、コールバックによる詳細なエラー情報を得ることが出来ると書かれていますが、色々試してもうまくいきません。
182
-
183
-
184
-
185
-
186
-
187
- ###補足情報(言語/FW/ツール等のバージョンなど)
188
-
189
- Windows8.1(64bit)
190
-
191
- ruby2.3.3
149
+ Unity:2017.3.0f3
192
-
193
-
194
-
195
- Xampp 7.0.8
196
-
197
- Apache1.2.4.18
198
-
199
- php7.0.8