2009-04-05 15 views
2

チームプロジェクトとして、C#クライアントからJava 6.5 SSLサーバーに接続する必要がありますが、stream.AuthenticateAsClient行に到達するとハングします。SSLを使用してJavaサーバーに接続するC#クライアント

C#の私はhttps://mail.google.comのようなものに接続し、mail.google.comMyCNfieldを設定した場合、それは正常に動作しますので、私はそれがJava側だと思うコード

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

を接続します。

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には、作成したCAによって署名された証明書MyCNfieldがあります。私のC#でプライベートCAに証明書チェーンをインポートするにはどうしたらいいですか?また、JavaとC#で自己署名証明書を証明し、現在のJKSを取り除くにはどうしたらいいですか?

答えて

3

証明書認証を提供するには、RemoteCertificateValidationCallbackコールバックメカニズムを使用する必要があります。あなたは質問を閉じてはいけませんでした。これは多くの人々が持つ有効な質問です。この回答は、stackoverflowの偉大なSEOのおかげで、Google検索の最初のヒットの1つだったので、間違った方向に人々を導く可能性があります。

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 
    ); 
+0

が、あなたが話していることを知っているように私はあなたに受け入れられた答えを与えるでしょう。 –

+0

それは動作します、私はちょうどPOCをしました。唯一の注意点は、秘密鍵がローカルマシンストアにあることを確認する必要があることです。これはjavaとは異なり、キーストアとして任意の場所を指定できます。ローカルマシンストアに証明書をインストールしてください。 – SRM

関連する問題