6

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

次の手順を使用して、.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)を作成しました。

    keytool \ -import \ -v \ -trustcacerts \ -alias 0 \ -file <(openssl x509 -in localhost.pem)\ -keystore mystore.jks \ -storetype JKS \ -storepass ez24get

  5. この.jksをJavaクライアントアプリにロードし、次のコードで接続を開始しました

    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リスナー=新しいTcpListener(IPAddress.Loopback、443); listener.Start();

while(true){

{TcpClient tcpClient = listener.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);     

} catch(Exception ex)
{
}}

例外は次の行で発生します

sslStream.AuthenticateAsServer(cert、false、SslProtocols.Default、false);

これの理由は何であり、どうすれば修正できますか?

どんな助けでも大歓迎です。

4

1 に答える 1

-1

SSLEngine (SSLContext から取得) をクライアント モード (setUseClientMode) に設定する必要があります。

于 2012-11-10T05:13:44.683 に答える