GrapeCity Secure FTP for .NET 4.0J
AuthenticateAsClient(TcpSession) メソッド
使用例 

認証時に使用される Session パラメーター。
セキュアな接続を確立するときにサーバーを認証します。
シンタックス
<SecuritySafeCriticalAttribute()>
Public Overloads Sub AuthenticateAsClient( _
   ByVal session As TcpSession _
) 
[SecuritySafeCritical()]
public void AuthenticateAsClient( 
   TcpSession session
)

パラメータ

session
認証時に使用される Session パラメーター。
解説

Security.ValidationCallbackSelectionCallbackClientSecurity.TargetHostCertificatesSecurity.ProtocolsSecurity.CheckCertificateRevocation を指定するには Session.RemoteEndPointTcpSession.ProxyTcpSession.Securityを使用します。

session.Security.TargetHostが指定されない場合は、代わりに session.RemoteEndPoint.HostNameOrAddressが使用されます。 session.Security.TargetHostはサーバー証明書名に一致する必要があります。認証が失敗した場合は、AuthenticationExceptionが発生します。

証明書を受け入れるか拒否するかを"オンザフライで"決定するには、Security.ValidationCallback関数を実装します。

クライアント証明書を"オンザフライで"選択するには、ClientSecurity.SelectionCallback関数を実装します。

使用例
以下のサンプルコードは、AuthenticateAsClientの呼び出しと、証明書の受信時に実行されるコールバックを示します。
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
参照

関連項目

TcpBase クラス
TcpBase メンバ
オーバーロード一覧

 

 


© 2002, GrapeCity inc. All rights reserved.