Клиент C #, подключающийся к Java-серверу по протоколу SSL

StackOverflow https://stackoverflow.com/questions/719556

Вопрос

В качестве командного проекта мне нужно подключиться с клиента C # к серверу Java 6.5 SSL, однако, когда я добираюсь до потока.Строка AuthenticateAsClient зависает.

Код подключения на C #

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

Если я подключусь к чему-то вроде https://mail.google.com и установить MyCNfield Для mail.google.com, это работает нормально, так что я думаю, что это Java-сторона.

Раздел инициализации Java является:

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

это называется:

sslsocket = (SSLSocket) sslserversocket.accept();

и продолжается дальше, даже несмотря на то, что соединение не было полностью аутентифицировано.

Что нужно изменить, чтобы исправить это:у JKS есть сертификат MyCNfield это подписано центром сертификации, который я создал.Как мне либо импортировать цепочку сертификатов в мой частный центр сертификации на моем C #, либо как мне заменить самозаверяющие сертификаты Java и C # и просто выбросить мои текущие JKS?

Это было полезно?

Решение

Вам необходимо использовать механизм обратного вызова RemoteCertificateValidationCallback для обеспечения аутентификации по сертификату.Вам не следовало закрывать вопрос, это правильный вопрос, который может возникнуть у многих людей.Этот ответ был одним из первых попаданий в поисковую систему Google, благодаря великолепному SEO stackoverflow, поэтому он может увести людей по ложному пути.

Используйте Обратный вызов remotecertificatevalidation обратный звонок.

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

И вот как вы могли бы использовать его с TcpClient ( Клиент 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
    );
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top