2012-09-25 10 views
6

私はSSLを学習中です。このプロセスでは、Javaクライアントと.NETサーバーの間にSSL接続を作成しようとしています。私はこの目的のために自己署名証明書を使用します。私はJavaで標準のキーストアを使いたくないので、代わりにカスタムキーストアを作成してロードします。Javaクライアントから.NETサーバーへのSSL接続時にエラーが発生しました

次の手順を使用して、.NETサーバー側で使用する証明書とpfxファイルを生成します。

  1. Windowsで次のコマンドを使用して擬似コードを生成しました。

    makecert -r -pe -SR "localhost" を - $個々-n "CN = localhostが" -sv .pvkファイル-r localhost.cer

  2. .PFXにこれを変換さそうこの証明書を.NETサーバーアプリケーションに読み込むことができます。

  3. .cerファイルを.pem(Base64形式)としてエクスポートしました。

  4. .cerファイル(前述の証明書のパブリックコンポーネント)を取り出し、次のコマンドを使用してjavaクライアントとして使用する.jksファイル(JavaKeyStore)を作成しました。

    キーツール\ -import \ -v \ -trustcacerts \ < -file -alias 0 \ (OpenSSLのX509 -in localhost.pem)\ -keystore mystore.jks \ -storetype JKS \ -storepass ez24get

  5. がロードされ、これは、Javaクライアント・アプリで.jksし、次のコードとの接続を開始し

    FileInputStream fis = new FileInputStream("res/myjksstore.jks"); 
    KeyStore trusted = KeyStore.getInstance("JKS"); 
    trusted.load(fis, "ez24get".toCharArray());   
    
    TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
    trustManagerFactory.init(trusted); 
    
    SSLContext context = SSLContext.getInstance("SSL"); 
    context.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom()); 
    
    Socket socket = context.getSocketFactory().createSocket("localhost", 443); 
    
    String str = "abc123"; 
    
    socket.getOutputStream().write(GeneralUtil.toByta(str.length())); 
    socket.getOutputStream().write(str.getBytes()); 
    
    socket.setKeepAlive(true); 
    

しかし、私はソケットにデータを書き込もうとするとき、私は

System.ComponentModel.Win32Exceptionサーバ側で次のエラーが発生します。クライアントとサーバーが通信できませんなぜなら、彼らは共通のアルゴリズムを持っていないからです。

私のサーバーコードは以下のようになります。

X509Certificate cert = new X509Certificate( "localhost.pfx"、 "abc123");

TcpListener listener = new TcpListener(IPAddress.Loopback、443); listener.Start();

一方(TRUE){

試み{れるtcpClientれるtcpClient =リスナー。AcceptTcpClient();

NetworkStream networkStream = tcpClient.GetStream(); 

    SslStream sslStream = new SslStream(networkStream); 

    sslStream.AuthenticateAsServer(cert, false, SslProtocols.Default, 

false);

byte[] data1 = new byte[4]; 

    sslStream.Read(data1, 0, data1.Length); 

    int len = BitConverter.ToInt32(data1, 0); 

    String message = "Length of incoming data " + 

BitConverter.ToInt32(data1、0);

byte[] data2 = new byte[len]; 

    sslStream.Read(data2, 0, data2.Length); 

    message += " Message: " + ASCIIEncoding.ASCII.GetString(data2); 

    Thread.Sleep(1000);  

}キャッチ(例外EX)
{
}}

例外がライン

sslStream.AuthenticateAsServer(CERT、偽、SslProtocols.Defaultで起こります、false);

どういう理由があり、どうすれば修正できますか?

ご協力いただければ幸いです。

+3

に設定する必要がありますは、OpenSSLを使ってサーバーに接続してavaliable暗号スイートをチェックしてみてください。 'openssl s_client -connect localhost:443 -CAfile 'このコマンドを出力してください。 – user1516873

+0

標準のキーストアを使用してこのコードのいくつかのバリエーションで正常に接続しましたか、これはSSL接続の最初のショットですか? – TheBlastOne

+0

いいえ..私はこれ以上追求しませんでした。なぜなら、パフォーマンスに関連する理由から、SSLストリームを放棄しなければならなかったからです。セッションキーを共有するためのRSAハンドシェイクを実装した後、AES暗号化を使ってトランスポートを処理しました。 SSLと同様です。 –

答えて

-1

(SSLContextのから入手)SSLEngineのはクライアントモード(setUseClientMode)

+0

これはデフォルトです。彼は 'SSLEngine'を全く使用していません。 -1 – EJP

関連する問題