自分のプロジェクトのサーバー証明書のみを正としてサーバー証明書の検証を行う方法が知りたいです。
■やりたい事
購入したサーバー証明書がサーバーとの通信時に自分のプロジェクトのサーバーから
送られてきたものである事をチェックたいのですが、
どのようにすれば良いかがわかりません。
■やってみた事
手順は下記になり、下記のURLの方のページを参考にしました。
http://qiita.com/harmegiddo/items/b72ca4f430292251c8a6
1.APIのURLを送信した時に、証明書のハッシュを取得しておきます。
2.このハッシュ値をプログラム内に定数として持ちます。
3.リクエストを投げた時に、サーバーから送られてきた証明書のハッシュと
定数のハッシュを比較して一致すればTrueとなります。
4.証明書が更新された場合は、ハッシュ値が異なるの定数も更新する必要があります。
SSL Policy Error:のログにはRemoteCertificateChainErrorsと表示されていました。
■定数
private string FingerPrint = "ハッシュ値";
■呼び出し元
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(ValidateServerCertificate);
■デリゲート
public bool ValidateServerCertificate
(
object sender,
System.Security.Cryptography.X509Certificates.X509Certificate certificate,
X509Chain chain,
System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
UnityEngine.Debug.Log("SSL Policy Error: " + sslPolicyErrors.ToString());
UnityEngine.Debug.Log("Cert. Hash: " + certificate.GetCertHashString());
if (certificate.GetCertHashString() == FingerPrint)
{
UnityEngine.Debug.Log("Correct!");
return true;
}
return false;
}
■質問1
プログラム上で自分たちのプロジェクトのサーバーから送られてきたものであることを
どのようにチェックすれば良いでしょうか?
■質問2
下記URLから購入したサーバー証明書と通信に使用している証明書のハッシュ値は
一致したのですが、このページは誰でもみれるので誰でもなりすませるのではないかと
思っています。
ユニークである事はどのように判断しているのでしょうか?
https://www.geotrust.co.jp/resources/repository/intermediate.html
■質問3
RemoteCertificateChainErrorsはサーバーとの認証に失敗しているという事だと
思うのですが、X509Chain .ChainPolicy.ExtraStoreに
サーバー証明書もしくは付随する中間証明書を追加すれば良いでしょうか?