自己署名証明書を作成し、それをクライアントの信頼できるルートにインストールし、.pfx [サーバー側]を使用して証明書が正常に認証されていることを確認しました。誰でも偽の証明書を作成することは可能ですか?
しかし、ハッカーがクライアントと認証を偽造する方法はありますか?彼の偽の証明書とサーバーで?
例:認定を検証する
私のコード
private static bool OnCertificateValidation(
object sender,
X509Certificate certificate,
X509Chain chain,
SslPolicyErrors sslPolicyErrors)
{
if (sslPolicyErrors == SslPolicyErrors.None)
{
if (CaVerify(chain) && ServerVerify(certificate)) return true;
}
return false;
}
public static bool CaVerify(X509Chain chain)
{
if (chain.ChainElements.Count > 0)
{
var certHash = chain.ChainElements[chain.ChainElements.Count - 1].Certificate.GetCertHash();
if (certHash.Length == ApiCertHash.Length)
{
for (var idx = 0; idx < certHash.Length; idx++)
{
if (certHash[idx] == ApiCertHash[idx])
{
return true;
}
}
}
}
return false;
}
public static bool ServerVerify(X509Certificate certificate)
{
var certHash = certificate.GetCertHash();
if (certHash.Length == ApiCertHash.Length)
{
for (var idx = 0; idx < certHash.Length; idx++)
{
if (certHash[idx] == ApiCertHash[idx])
{
return true;
}
}
}
return false;
}
だからいくつかのいずれかが偽certification.pfxを作成し、彼の偽のサーバーに関連付け、彼の偽のサーバに私のクライアントを接続することができますか?
はい彼ができる、*を使用するのに十分です。それは "中の主人公"ではないでしょう、攻撃者はエンドポイントを制御します、それについてあなたができることはあまりありません。あなたは証明書の指紋を入れることができますが、よりスマートな考え方は、CAの指紋を入れて、新しい証明書を発行することができます(接続するDNS名を変更する必要があるとします。新しい証明書が必要となり、そのために新しい証明書指紋が必要になります)。方法を示すための簡単なコードを追加します。 –
Sslは私のクライアント/サーバをMITM攻撃から保護するだけで、クライアントのエンドポイントを制御することはできません。 –
エンドポイントを保護することは不可能です。エンドユーザーが任意のコードを実行できる場合、あなたは失われてしまいます。攻撃者は自分のデバッガを添付して実行するだけで、実行中のプログラムで何でもできます。あなたはそれらを難しくすることができますが、あなたはそれを止めることはできません。 「停止する」唯一の方法は、エンドユーザーが必要なものを実行することを許可されていないことです。その例として、** unjailbroken ** iPhoneがあります。ユーザーはアプリストアからしかアプリを実行できません。そのストアにはデバッグツールがないため、エンドユーザーはそのプログラムを攻撃することはできません。しかし、もしジェイルブレイクしていれば、あなたはあなたが始まった場所です、それを止めることはできません。 –