私はSSLを学習中です。このプロセスでは、Javaクライアントと.NETサーバーの間にSSL接続を作成しようとしています。私はこの目的のために自己署名証明書を使用します。私はJavaで標準のキーストアを使いたくないので、代わりにカスタムキーストアを作成してロードします。Javaクライアントから.NETサーバーへのSSL接続時にエラーが発生しました
次の手順を使用して、.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)を作成しました。
キーツール\ -import \ -v \ -trustcacerts \ < -file -alias 0 \ (OpenSSLのX509 -in localhost.pem)\ -keystore mystore.jks \ -storetype JKS \ -storepass ez24get
がロードされ、これは、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);
どういう理由があり、どうすれば修正できますか?
ご協力いただければ幸いです。
に設定する必要がありますは、OpenSSLを使ってサーバーに接続してavaliable暗号スイートをチェックしてみてください。 'openssl s_client -connect localhost:443 -CAfile'このコマンドを出力してください。 –
user1516873
標準のキーストアを使用してこのコードのいくつかのバリエーションで正常に接続しましたか、これはSSL接続の最初のショットですか? – TheBlastOne
いいえ..私はこれ以上追求しませんでした。なぜなら、パフォーマンスに関連する理由から、SSLストリームを放棄しなければならなかったからです。セッションキーを共有するためのRSAハンドシェイクを実装した後、AES暗号化を使ってトランスポートを処理しました。 SSLと同様です。 –