문제

팀 프로젝트로서 나는 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 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");
}

호출됩니다 :

sslsocket = (SSLSocket) sslserversocket.accept();

연결이 완전히 인증되지 않았음에도 불구하고 계속됩니다.

이 문제를 해결하기 위해 변경해야 할 사항 : JKS에는 인증서가 있습니다. MyCNfield 그것은 내가 만든 CA로 서명합니다. C#에서 CERT 체인을 개인 CA로 가져 오거나 Java 및 C#을 사용하여 자체 서명 된 CERT를 어떻게 진학하고 현재 JKS를 버리는 방법은 무엇입니까?

도움이 되었습니까?

해결책

인증서 인증을 제공하려면 RemotecertificateValidationCallback 메커니즘을 사용해야합니다. 질문을 닫지 말아야합니다. 이것은 많은 사람들이 가질 수있는 유효한 질문입니다. 이 답변은 StackoverFlow의 위대한 SEO 덕분에 Google 검색의 첫 번째 히트 중 하나 였으므로 사람들이 잘못된 길로 이어질 수 있습니다.

사용 remotecertificatevalidationCallback 콜백.

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