Pregunta

Como un proyecto de equipo que necesito para conectarse desde un cliente de C # para un servidor SSL de Java 6.5, sin embargo, cuando llegue a la línea stream.AuthenticateAsClient se cuelga.

C # conectar código

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

Si conecto a algo así como https://mail.google.com y establecer MyCNfield a mail.google.com, que funciona bien, así que creo que es el lado de Java.

La sección de Java Init es:

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

que se llama:

sslsocket = (SSLSocket) sslserversocket.accept();

y continúa, a pesar de que la conexión no fue autenticado por completo.

Lo que necesita ser cambiado para solucionar este problema: la JKS tiene una MyCNfield certificado firmado por una CA que creé. ¿Cómo puedo importar o bien la cadena de certificados a mi CA privada en mi C #, o ¿cómo puedo canjear los CERT auto-firmados con Java y C #, y simplemente tirar mis JKS actuales?

¿Fue útil?

Solución

Es necesario utilizar el mecanismo de devolución de llamada RemoteCertificateValidationCallback para proporcionar la autenticación de certificados. No deberías haber cerrado la pregunta, esta es una pregunta válida que muchas personas pueden tener. Esta respuesta fue uno de los primeros éxitos en una búsqueda en Google, gracias a la gran SEO de stackoverflow, por lo que puede llevar a la gente por el camino equivocado.

Utilice la RemoteCertificateValidationCallback de devolución de llamada.

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

Y aquí es como se puede utilizar 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
    );
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top