Domanda

Come un progetto di squadra ho bisogno di connettersi da un client C # a un server SSL Java 6.5, però quando arrivo alla linea stream.AuthenticateAsClient si blocca.

C # collegare codice

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

Se mi collego a qualcosa come https://mail.google.com e impostare MyCNfield a mail.google.com, funziona benissimo, quindi penso che è il lato Java.

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

che viene chiamato:

sslsocket = (SSLSocket) sslserversocket.accept();

e continua, anche se la connessione non è stato completamente autenticato.

Ciò che deve essere cambiato per risolvere questo problema: il JKS ha un MyCNfield cert che è firmato da una CA che ho creato. Come faccio a importare o la catena del CERT al mio CA privata nel mio C #, o come faccio excange certs autofirmati con Java e C #, e basta buttare fuori le mie JKS attuali?

È stato utile?

Soluzione

È necessario utilizzare il meccanismo RemoteCertificateValidationCallback di callback per fornire l'autenticazione dei certificati. Non si dovrebbe aver chiuso la questione, questa è una domanda valida che molte persone possono avere. Questa risposta è stata una delle prime visite per una ricerca su Google, grazie alla grande SEO di StackOverflow, quindi potrebbe portare le persone sulla strada sbagliata.

Utilizzare la RemoteCertificateValidationCallback di callback.

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

E qui è come si usa con 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
    );
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top