Dart.Ftp 名前空間 > TcpBase クラス > AuthenticateAsClient メソッド : AuthenticateAsClient(TcpSession) メソッド |
<SecuritySafeCriticalAttribute()> Public Overloads Sub AuthenticateAsClient( _ ByVal session As TcpSession _ )
[SecuritySafeCritical()] public void AuthenticateAsClient( TcpSession session )
Security.ValidationCallback、SelectionCallback、ClientSecurity.TargetHost、 Certificates、Security.Protocols と Security.CheckCertificateRevocation を指定するには Session.RemoteEndPoint、TcpSession.Proxy と TcpSession.Securityを使用します。
session.Security.TargetHostが指定されない場合は、代わりに session.RemoteEndPoint.HostNameOrAddressが使用されます。 session.Security.TargetHostはサーバー証明書名に一致する必要があります。認証が失敗した場合は、AuthenticationExceptionが発生します。
証明書を受け入れるか拒否するかを"オンザフライで"決定するには、Security.ValidationCallback関数を実装します。
クライアント証明書を"オンザフライで"選択するには、ClientSecurity.SelectionCallback関数を実装します。
using System.Net.Security; using System.Security.Authentication; using System.Security.Cryptography.X509Certificates; /// <summary> /// 提供されたTcpオブジェクトでSSL接続を確立します。通常はImplicitモードの場合はサーバーに接続した直後、 /// Explicitモードの場合は STARTTLSコマンドがサーバーに送られた後に呼ばれます。 /// </summary> /// <param name="myComponent">SSL接続を確立するオブジェクト</param> /// <param name="serverHostName">サーバーの名前</param> /// <param name="protocols">クライアントが受け入れるプロトコル</param> /// <param name="checkRevocation">認証中に証明書失効リストをチェックする</param> private void authenticateTcp(Tcp myComponent, string serverHostName, SslProtocols protocols, bool checkRevocation) { //証明書コールバック関数と接続設定を指定し、サーバーを認証します。 ClientSecurity security = new ClientSecurity(); security.TargetHost = serverHostName; security.Protocols = protocols; security.CheckCertificateRevocation = checkRevocation; security.ValidationCallback = certificateReceived; security.SelectionCallback = selectLocalCertificate; myComponent.AuthenticateAsClient(security); } /// <summary> /// SSL認証用の証明書を選択します /// </summary> /// <param name="targetHost">クライアントに指定されたサーバー</param> /// <param name="localCertificates">ClientSecurity.Certificatesへの参照</param> /// <param name="remoteCertificate">リモートで認証するために使用される証明書</param> /// <param name="acceptableIssuers">リモートで許容される証明書発行者の文字列型の配列</param> /// <returns>SSL接続を確立するのに使用する X509Certificate</returns> private X509Certificate selectLocalCertificate(Object sender, string targetHost, X509CertificateCollection localCertificates, X509Certificate remoteCertificate, string[] acceptableIssuers) { //証明書の取得を試みます X509Store certificateStore = new X509Store(StoreName.My); certificateStore.Open(OpenFlags.ReadOnly); foreach (X509Certificate2 cert in certificateStore.Certificates) if (cert.GetNameInfo(X509NameType.SimpleName, true) == "DartdomCA") { certificateStore.Close(); return cert; } //証明書が見つからない場合は nullを返します。 return null; } /// <summary> /// 検証のためのサーバー証明書を提示します。 /// </summary> /// <param name="certificate">サーバーから提示された証明書</param> /// <param name="chain">リモート証明書に関連付けられた証明機関のチェーン。</param> /// <param name="sslPolicyErrors">サーバー証明書に関連付けられている1つ以上のエラー。</param> /// <returns>提示された証明書が認証のために受け入れられるかどうかを指定するブール値。</returns> private bool certificateReceived(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { //サーバー証明書に問題がない場合、trueを返します。 if (sslPolicyErrors == SslPolicyErrors.None) return true; string msg = "The server could not be validated for the following reason(s):"; if ((sslPolicyErrors & SslPolicyErrors.RemoteCertificateNotAvailable) == SslPolicyErrors.RemoteCertificateNotAvailable) msg += Environment.NewLine + " -The server did not present a certificate."; else { if ((sslPolicyErrors & SslPolicyErrors.RemoteCertificateNameMismatch) == SslPolicyErrors.RemoteCertificateNameMismatch) msg += Environment.NewLine + " -Certificate name mismatch."; if ((sslPolicyErrors & SslPolicyErrors.RemoteCertificateChainErrors) == SslPolicyErrors.RemoteCertificateChainErrors) { msg += Environment.NewLine + " -Certificate chain errors:" + Environment.NewLine; foreach (X509ChainStatus item in chain.ChainStatus) msg += " --" + item.StatusInformation; } } //検証が失敗した場合、メッセージボックスを表示します。 msg += Environment.NewLine + "Override security check?"; if (MessageBox.Show(msg, "Security Alert: Server could not be validated", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) return true; else return false; }
Imports System.Net.Security Imports System.Security.Authentication Imports System.Security.Cryptography.X509Certificates ''' <summary> ''' 提供されたTcpオブジェクトでSSL接続を確立します。通常はImplicitモードの場合はサーバーに接続した直後、 ''' Explicitモードの場合は STARTTLSコマンドがサーバーに送られた後に呼ばれます。 ''' </summary> ''' <param name="myComponent">SSL接続を確立するオブジェクト</param> ''' <param name="serverHostName">サーバーの名前</param> ''' <param name="protocols">クライアントが受け入れるプロトコル</param> ''' <param name="checkRevocation">認証中に証明書失効リストをチェックする</param> Private Sub authenticateTcp(ByVal myComponent As Tcp, ByVal serverHostName As String, ByVal protocols As SslProtocols, ByVal checkRevocation As Boolean) 'サーバーを認証し、証明書コールバック関数を指定します。 Dim security As New ClientSecurity() security.TargetHost = serverHostName security.Protocols = protocols security.CheckCertificateRevocation = checkRevocation security.ValidationCallback = AddressOf certificateReceived security.SelectionCallback = AddressOf selectLocalCertificate myComponent.AuthenticateAsClient(security) End Sub ''' <summary> ''' SSL認証用の証明書を選択します ''' </summary> ''' <param name="targetHost">クライアントに指定されたサーバー</param> ''' <param name="localCertificates">ClientSecurity.Certificatesへの参照</param> ''' <param name="remoteCertificate">リモートで認証するために使用される証明書</param> ''' <param name="acceptableIssuers">リモートで許容される証明書発行者の文字列型の配列</param> ''' <returns>SSL接続を確立するのに使用する X509Certificate</returns> Private Function selectLocalCertificate(ByVal sender As Object, ByVal targetHost As String, ByVal localCertificates As X509CertificateCollection, ByVal remoteCertificate As X509Certificate, ByVal acceptableIssuers() As String) As X509Certificate '証明書の取得を試みます Dim certificateStore As New X509Store(StoreName.My) certificateStore.Open(OpenFlags.ReadOnly) For Each cert As X509Certificate2 In certificateStore.Certificates If cert.GetNameInfo(X509NameType.SimpleName, True) = "DartdomCA" Then certificateStore.Close() Return cert End If Next cert '証明書が見つからない場合は nullを返します。 Return Nothing End Function ''' <summary> ''' 検証のためのサーバー証明書を提示します。 ''' </summary> ''' <param name="certificate">サーバーから提示された証明書</param> ''' <param name="chain">リモート証明書に関連付けられた証明機関のチェーン。</param> ''' <param name="sslPolicyErrors">サーバー証明書に関連付けられている1つ以上のエラー。</param> ''' <returns>提示された証明書が認証のために受け入れられるかどうかを指定するブール値。</returns> Private Function certificateReceived(ByVal sender As Object, ByVal certificate As X509Certificate, ByVal chain As X509Chain, ByVal sslPolicyErrors As SslPolicyErrors) As Boolean 'サーバー証明書に問題がない場合、trueを返します。 If sslPolicyErrors = System.Net.Security.SslPolicyErrors.None Then Return True End If Dim msg As String = "The server could not be validated for the following reason(s):" If (sslPolicyErrors And System.Net.Security.SslPolicyErrors.RemoteCertificateNotAvailable) = System.Net.Security.SslPolicyErrors.RemoteCertificateNotAvailable Then msg &= Environment.NewLine & " -The server did not present a certificate." Else If (sslPolicyErrors And System.Net.Security.SslPolicyErrors.RemoteCertificateNameMismatch) = System.Net.Security.SslPolicyErrors.RemoteCertificateNameMismatch Then msg &= Environment.NewLine & " -Certificate name mismatch." End If If (sslPolicyErrors And System.Net.Security.SslPolicyErrors.RemoteCertificateChainErrors) = System.Net.Security.SslPolicyErrors.RemoteCertificateChainErrors Then msg &= Environment.NewLine & " -Certificate chain errors:" & Environment.NewLine For Each item As X509ChainStatus In chain.ChainStatus msg &= " --" & item.StatusInformation Next item End If End If '検証が失敗した場合、メッセージボックスを表示します。 msg &= Environment.NewLine & "Override security check?" If MessageBox.Show(msg, "Security Alert: Server could not be validated", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) = System.Windows.Forms.DialogResult.Yes Then Return True Else Return False End If End Function