سؤال

كشروع فريق أحتاج إلى الاتصال من عميل C # إلى خادم Java 6.5 SSL، إلا أنني عندما أصل إلى Stream.AuthentIcateasClients خط توقفه.

C # ربط الكود

public static void connect(string server, Int32 port)
{
  try
  {
    client = new TcpClient(server, port);
    stream = new SslStream(client.GetStream(), false);
    stream.AuthenticateAsClient("MyCNfield");
...
...

إذا كنت أتصل بشيء مثل https://mail.google.com وحدد MyCNfield ل mail.google.com, ، إنه يعمل بشكل جيد، لذلك أعتقد أنه جانب جافا.

قسم Java Init هو:

public void initSSL() throws IOException, KeyStoreException, NoSuchAlgorithmException,
                             CertificateException, UnrecoverableKeyException, KeyManagementException {
    char[] passphrase = "scared".toCharArray();
    System.out.println(java.security.KeyStore.getDefaultType());
    boolean handshakedone=false;

    KeyStore keystore1 = KeyStore.getInstance("jks");
    FileInputStream fis = new FileInputStream("C:\\\\temp\\\\work.jks");
    keystore1.load(fis, passphrase);
    fis.close();
    KeyStore ksTrust = KeyStore.getInstance("jks");
    FileInputStream fis2 =  new FileInputStream("C:\\\\temp\\\\work.jks");
    ksTrust.load(fis2, passphrase);

    KeyManagerFactory kmf =    KeyManagerFactory.getInstance("SunX509");

    // KeyManager's decide which key material to use.
    kmf.init(keystore1, passphrase);

    // TrustManager's decide whether to allow connections.
    TrustManagerFactory tmf =   TrustManagerFactory.getInstance("SunX509");
    tmf.init(ksTrust);

    SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init( kmf.getKeyManagers(), tmf.getTrustManagers(), null);

    SSLServerSocketFactory sslserversocketfactory =(SSLServerSocketFactory) sslContext.getServerSocketFactory();
    sslserversocket =(SSLServerSocket) sslserversocketfactory.createServerSocket(2443);
    sslserversocket.setUseClientMode(false);

    //Context conte
    ServerSocketFactory serversocketfactory =(ServerSocketFactory) sslContext.getServerSocketFactory();

    //  serverSocket = new ServerSocket(2443);
    System.out.println("OK we are set up");
}

ودعا:

sslsocket = (SSLSocket) sslserversocket.accept();

وتستمر، على الرغم من أن الاتصال لم يتم مصادقة بالكامل.

ما يجب تغييره لإصلاح هذا: JKS لديه سيرت MyCNfield يتم توقيعه بواسطة CA الذي قمت بإنشائه. كيف يمكنني إما استيراد سلسلة cert إلى كاليفورنيا الخاصة في CA الخاص بي في C #، أو كيف يمكنني إثارة شهادات التوقيع الذاتي مع Java و C #، وأرم فقط JKS الحالي؟

هل كانت مفيدة؟

المحلول

تحتاج إلى استخدام آلية رد الاتصال RemotecertificateValideCallBack لتوفير مصادقة الشهادة. يجب ألا تكون قد أغلقت السؤال، فهذا سؤال صالح قد يكون له كثير من الناس. كانت هذه الإجابة واحدة من أول الزيارات على بحث Google، بفضل كبار المسئولين الاقتصاديين العظيمين من Stackoverflow، لذلك قد يؤدي الناس إلى أسفل المسار الخطأ.

استخدم ال RemotecertificateValidationCallback. أتصل مرة أخرى.

private readonly bool allowSsl;

// callback used to validate the certificate in an SSL conversation
private static bool ValidateRemoteCertificate(
object sender,
    X509Certificate certificate,
    X509Chain chain,
    SslPolicyErrors policyErrors
)
{
    if (allowSsl)
    {
        // allow any certificate...
        return true;
    }
    else
    {
        return policyErrors == SslPolicyErrors.None;
    }
}

وهنا كيف ستستخدمه tcpclient.:

TcpClient client = new TcpClient(machineName,443);
Console.WriteLine("Client connected.");

// Create an SSL stream, specifying the callback above.
SslStream sslStream = new SslStream(
    client.GetStream(), 
    false, 
    new RemoteCertificateValidationCallback (ValidateRemoteCertificate), 
    null
    );
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top