Question

En tant que projet d'équipe dont j'ai besoin de se connecter à partir d'un client C # à un serveur SSL Java 6.5, mais quand je rentre à la ligne stream.AuthenticateAsClient il se bloque.

C # connecter code

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

Si je me connecte à quelque chose comme https://mail.google.com et mettre MyCNfield à mail.google.com, il fonctionne très bien, je pense qu'il est du côté Java.

La section Java Init est:

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

il est appelé:

sslsocket = (SSLSocket) sslserversocket.accept();

et se poursuit, même si la connexion n'a pas été entièrement authentifié.

Qu'est-ce qui doit être changé pour résoudre ce problème: le JKS a un MyCNfield cert qui est signé par une autorité de certification que j'ai créé. Comment puis-je importer soit la chaîne de cert à mon autorité de certification privée dans mon C #, ou comment puis-je excange certs auto-signé avec Java et C #, et il suffit de jeter mes JKS actuels?

Était-ce utile?

La solution

Vous devez utiliser le mécanisme de rappel de RemoteCertificateValidationCallback pour fournir une authentification de certificat. Vous ne devriez pas avoir fermé la question, c'est une question valable que beaucoup de gens peuvent avoir. Cette réponse a été l'un des premiers succès sur une recherche Google, grâce à la grande SEO de stackoverflow, il peut donc amener les gens sur le mauvais chemin.

Utilisez le RemoteCertificateValidationCallback rappel.

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

Et voici comment vous l'utiliser avec 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
    );
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top