À l'aide de X509Certificate avec fichier et la clé en c#

J'ai donné un certificat et un mot de passe pour un serveur qui accepte la connexion ssl. J'ai essayé de faire une connexion à ce serveur, mais l'authentification échoue, bien principalement parce que je ne sais pas comment utiliser le fichier et le mot de passe que j'ai reçu.

Voici mon code:

    X509Certificate certificate = new X509Certificate(
        @"c:\mySrvKeystore", KEY_PASSWORD);

    public static bool ValidateCertificate(
        object sender,
        X509Certificate certificate,
        X509Chain chain,
        SslPolicyErrors errors)
    {
        if (errors == SslPolicyErrors.None)
            return true;

        Console.WriteLine("Certificate error: {0}", errors);
        return false;
    }

    public void RunClient(string address, int port)
    {
        Console.WriteLine("Starting client...");
        var client = new TcpClient(address, port);


        Console.WriteLine("Client connected.");


        var stream = new SslStream(client.GetStream(),false,
            ValidateCertificate, null);

        try
        {
            stream.AuthenticateAsClient(address);

            Console.WriteLine(stream.IsAuthenticated ? "Client authenticated." : "Client is not authenticated.");

            //TODO constantly read from server!
        }
        catch (AuthenticationException ae)
        {
            Console.WriteLine("Exception occured: {0}", ae.Message);

            if (ae.InnerException != null)
            {
                Console.WriteLine("Inner exception: {0}", ae.InnerException.Message);
            }

            Console.WriteLine("Failed to authenticate! closing the client...");

            client.Close();

            return;
        }
        catch (Exception ex)
        {
            Console.WriteLine("General exception occured {0}", ex.Message);
            client.Close();
            return;
        }
    }

Donc, comme vous pouvez le voir, il n'y a pas de code dans mon code que quelque part, dit le serveur (soit TcpClient ou SSLStream) que j'ai ce fichier et la clé!

J'ai un javacode qui se connecte à un serveur sans problème, mais je n'ai pas réussi à le convertir en c# encore. Toute aide serait super!

    String keyPassword = "123456";
//String keyPassword = "importkey";
try {
KeyManagerFactory keyManagerFactory;
keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
KeyStore keyStore = KeyStore.getInstance("JKS");
InputStream keyInput = new FileInputStream("c:\\mySrvKeystore");
keyStore.load(keyInput, keyPassword.toCharArray());
keyInput.close();
keyManagerFactory.init(keyStore, keyPassword.toCharArray());
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(keyManagerFactory.getKeyManagers(), trustAllCerts, new java.security.SecureRandom());
SSLSocketFactory sslsocketfactory = sc.getSocketFactory();
this.sslsocket = (SSLSocket) sslsocketfactory.createSocket(host, port);
} catch (java.security.NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (java.security.KeyManagementException e) {
e.printStackTrace();
} catch (java.security.KeyStoreException e) {
e.printStackTrace();
} catch (java.security.cert.CertificateException e) {
e.printStackTrace();
} catch (java.security.UnrecoverableKeyException e) {
e.printStackTrace();
} finally {}
}
public void run() {
try {
InputStream inputstream = sslsocket.getInputStream();
InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
OutputStream outputstream = System.out;
OutputStreamWriter outputstreamwriter = new OutputStreamWriter(outputstream);
BufferedWriter bufferedwriter = new BufferedWriter(outputstreamwriter);
//get text from server and stuff...no deal!

Mise à JOUR

Après la conversion de la clé à p12 selon gtrig le problème maintenant est IOException dans AutheneticateAsClient méthode ici:

        try
{
var certificate = new X509Certificate2(@"d:\mySrvKeystore.p12", "123456");
X509Certificate2[] X509Certificates = {certificate};
var certsCollection = new X509CertificateCollection(X509Certificates);
//IO EXCEPTION HERE-->
stream.AuthenticateAsClient(address, certsCollection, SslProtocols.Ssl2, false);
Console.WriteLine(stream.IsAuthenticated ? "Client authenticated." : "Client is not authenticated.");
//TODO constantly read from server!
}

Aussi lorsque j'utilise le SSlProtocols.Default l'erreur est: RemoteCertificateNameMismatch, RemoteCertificateChainErrors

À partir de votre code Java, le fichier que vous avez est un JKS de magasin de clés. Savez-vous si il contient des certificats, ou contient-il une clé privée aussi? Est-ce une voie ou deux voies SSL (authentification du client)?
Je ne suis pas vraiment sûr, mais je pense qu'il a seulement le certificat et la clé privée est juste le mot de passe dans mon code. Aussi je crois qu'il est un lien, parce que je sais que le serveur de flux de données et je ne devrais pas envoyer quoi que ce soit sur le serveur. Mais à en juger par le code java, il pourrait également inclure la clé depuis le fichier de clés a été utilisé dans du code Java.
S'il vous plaît exécuter cette commande sur le JKS fichier de magasin de clés: keytool -list -v -keystore mySrvKeystore. Regardez pour voir si le résultat indique un "PrivateKeyEntry" ou si il y a seulement un certificat d'entrées. Le mot de passe dans votre code est le mot de passe pour ouvrir le JKS fichier de magasin de clés.
Les erreurs sont de certificat que vous recevez à partir du serveur. L'adresse que vous indiquez ne correspond pas au nom dans le certificat de serveur. Vous obtenez ce message, parfois dans IE. Vous pouvez toujours accepter en lui permettant d'entrer dans votre ValidateCert fonction ( donc toujours retourner vrai). Beter peut-être est-à-assurez-vous que les certificats ne sont pas mal. Ou journal de la certs vous permettre quant à l'erreur. Lorsque vous placez un point d'arrêt dans de validatecert, vous pouvez consulter le certificat du serveur est de retour.
Dans le code java vous avez juste confiance, chaque certificat: trustAllCerts. Avez-vous essayé de changer la valeur false à True dans le validatecert()?

OriginalL'auteur Saeid Yazdani | 2013-11-07