私はSSLを学習中です。このプロセスでは、.NETサーバーとJavaクライアントの間にSSL接続を作成しようとしています。私はこの目的のために自己署名証明書を使用します。Javaで標準のキーストアを使用したくないので、カスタムキーストアを作成してロードします。
次の手順を使用して、.NETサーバー側で使用する証明書とpfxファイルを生成します。
Windowsで次のコマンドを使用して証明書を生成しました。
makecert -r -pe -sr"localhost"-$個人-n"CN= localhost" -sv .pvk -r localhost.cer
これを.pfxに変換して、この証明書を.NETサーバーアプリにロードできるようにしました。
.cerファイルを.pem(Base64形式)としてエクスポートしました。
.cerファイル(上記の証明書のパブリックコンポーネント)を取得し、次のコマンドを使用してJavaクライアントとして使用する.jksファイル(JavaKeyStore)を作成しました。
keytool \ -import \ -v \ -trustcacerts \ -alias 0 \ -file <(openssl x509 -in localhost.pem)\ -keystore mystore.jks \ -storetype JKS \ -storepass ez24get
この.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);
これの理由は何であり、どうすれば修正できますか?
どんな助けでも大歓迎です。