Frage

Als Team Projekt, das ich von einem C # Client mit einem Java 6.5 SSL-Server jedoch eine Verbindung herstellen müssen, wenn ich auf die stream.AuthenticateAsClient Linie bekommen es hängt.

C # verbinden Code

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

Wenn ich so etwas wie https://mail.google.com und setzen MyCNfield Verbindung mail.google.com, es funktioniert gut, so halte ich es für die Java-Seite ist.

Der Java Init Abschnitt ist:

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");
}

es wird aufgerufen:

sslsocket = (SSLSocket) sslserversocket.accept();

und weiter auf, auch wenn die Verbindung nicht vollständig authentifiziert.

Was dies geändert werden muss zu beheben: die JKS hat eine cert MyCNfield, die von einer Zertifizierungsstelle signiert wird, die ich erstellt. Wie kann ich entweder importiere die CERT-Kette auf meinen privaten CA in meiner C # oder wie Excange mich selbst signierten Zertifikate mit Java und C #, und nur meine aktuellen JKS werfen?

War es hilfreich?

Lösung

Sie müssen den RemoteCertificateValidationCallback Callback-Mechanismus verwenden Zertifikatsauthentifizierung zur Verfügung zu stellen. Sie sollen nicht die Frage geschlossen haben, das ist eine berechtigte Frage, die viele Menschen haben können. Diese Antwort war einer der ersten Hits auf einer Google-Suche, dank der großen SEO von Stackoverflow, so kann es die Menschen auf dem falschen Weg führen.

Mit dem RemoteCertificateValidationCallback Rückruf.

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;
    }
}

Und hier ist, wie Sie es mit verwenden würden 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
    );
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top