質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

8543閲覧

Unityで作ったAndroidアプリをhttpsサーバーに接続したいのですが、繋がらなくて困っています。

XENO_SuperGamer

総合スコア8

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2020/01/15 09:25

編集2020/01/24 03:08

Androidアプリをサーバに接続できない

現在、Unityでスマホゲーを制作しているのですが、
Httpsサーバーを接続したいのですが、ios,windors,macは接続できるのに、Androidでは接続できないのです。

環境

Unity2019.3.0f5

Android 9.0
(一応、6.0の物も試しました)

該当のソースコード

C#

1 IEnumerator Upload() 2 { 3 // オブジェクトからTextコンポーネントを取得 4 Text score_text = score_object.GetComponent<Text>(); 5 6 if (onConnectServer) 7 { 8 while (onConnectServer) 9 { 10 yield return null; 11 } 12 } 13 onConnectServer = true; 14 connectResult = ""; 15 16 WWWForm form = new WWWForm(); 17 form.AddField("myField", "myData"); 18 19 20 //UnityWebRequestを生成 21     //URLはセキュリティ上の問題で、伏せさせていただきます。 22 UnityWebRequest request = UnityWebRequest.Post("https://www.×××.com/××××××/×××.php", form); 23 24 25 //タイムアウト 26 request.timeout = 5; 27 //送受信開始 28 yield return request.SendWebRequest(); 29 30 //通信が終わっていなかったら 31 if (!request.isDone) 32 { 33 connectResult = "timeout"; 34 onConnectServer = false; 35 yield break; 36 } 37 38 if (request.isNetworkError || request.isHttpError) 39 { 40 Debug.Log(request.error + ":繋がってません"); 41 // テキストの表示を入れ替える 42 score_text.text = request.error + ":繋がってません"; 43 } 44 else 45 { 46 Debug.Log("Form upload complete!繋がってます!!!"); 47 score_text.text = "Form upload complete!繋がってます!!!"; 48 }

発生している問題

AndroidのみHttpsサーバーに接続できないです。 ios,windors,macは接続できました。 プログラムのエラーはありません。 Android画面では、 「Unknown Error:繋がってません」 と表示されます。

試したこと

試しに、無料レンタルサーバーでhttpを接続したり、テストで使用した仮想サーバーに接続して、こちらは接続に成功できました。

なので、セキュリティの関係で繋がらないかと思い、Xmlや対象のサーバーの証明書をエクスポートをし、設定を試したのですが、接続できませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MMashiro

2020/01/23 11:25

使用しているAndroidのバージョンを教えてください
XENO_SuperGamer

2020/01/24 03:09

環境欄にAndroidのバージョンを追加しました。
guest

回答2

0

自己解決

解決できました。
まず、Httpsに接続する際は証明書の検証する必要があります。
Unityではその検証機能はあるのですが、デフォルトではAndroidのみ出来なく(不便ですよね)
検証する機能をつけないとダメです。

まず、証明書の検証するためのクラスを用意します。

class AcceptAllCertificatesSignedWithASpecificKeyPublicKey : CertificateHandler
{
// Encoded RSAPublicKey
private static string PUB_KEY = "証明証の公開鍵を入れる";
protected override bool ValidateCertificate(byte[] certificateData)
{
X509Certificate2 certificate = new X509Certificate2(certificateData);
string pk = certificate.GetPublicKeyString();
if (pk.Equals(PUB_KEY))//公開鍵があっているか検証
return true;
// Bad dog
return false;
}
}

そして、
UnityWebRequest が行われている次の処理で、上記の処理を呼び出します。

//UnityWebRequestを生成
//URLはセキュリティ上の問題で、伏せさせていただきます。
UnityWebRequest request = UnityWebRequest.Post("https://www.×××.com/××××××/×××.php", form);

request.certificateHandler = new AcceptAllCertificatesSignedWithASpecificKeyPublicKey();//追加

//タイムアウト
request.timeout = 5;

このような感じで接続できました。

投稿2020/01/24 03:09

編集2020/01/24 03:27
XENO_SuperGamer

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

対処法を入れるの忘れました。
ぜひ参考にしてください。

まず、証明書の検証するためのクラスを用意します。

class AcceptAllCertificatesSignedWithASpecificKeyPublicKey : CertificateHandler
{
// Encoded RSAPublicKey
private static string PUB_KEY = "証明証の公開鍵を入れる";
protected override bool ValidateCertificate(byte[] certificateData)
{
X509Certificate2 certificate = new X509Certificate2(certificateData);
string pk = certificate.GetPublicKeyString();
if (pk.Equals(PUB_KEY))//公開鍵があっているか検証
return true;
// Bad dog
return false;
}
}

そして、
UnityWebRequest が行われている次の処理で、上記の処理を呼び出します。

//UnityWebRequestを生成
//URLはセキュリティ上の問題で、伏せさせていただきます。
UnityWebRequest request = UnityWebRequest.Post("https://www.×××.com/××××××/×××.php", form);

request.certificateHandler = new AcceptAllCertificatesSignedWithASpecificKeyPublicKey();//追加

//タイムアウト
request.timeout = 5;

このような感じで接続できました。

投稿2020/01/24 03:24

XENO_SuperGamer

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問