我正在學習SSL,在此過程中,我嘗試在.NET客戶端與.NET服務器之間創建SSL連接。我爲此使用自簽名證書。我不想在Java中使用標準密鑰庫,所以我創建了一個自定義密鑰庫並加載它。從Java客戶端到.NET服務器進行SSL連接時出錯
我使用以下步驟來生成證書和在.NET服務器端使用的pfx文件。
在windows上使用以下命令生成一個cerficiate。
makecert -r -pe -SR 「localhost」 的 - $個人-n 「CN = localhost」 的-sv .pvk -r localhost.cer
轉換這到.pfx如此我可以在.NET服務器應用程序中加載此證書。
將.cer文件導出爲.pem(Base64格式)。
使用以下命令獲取.cer文件(上述證書的公共組件)並創建一個.jks文件(JavaKeyStore)以用作java客戶端。
密鑰工具\ -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 listener = new TcpListener(IPAddress.Loopback,443); listener.Start();
而(真){
嘗試{的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);
}趕上(異常前)
{
} }
發生在線路
sslStream.AuthenticateAsServer(CERT,假,SslProtocols.Default的異常,假);
這可能是什麼原因,我該如何解決它?
任何幫助將高度讚賞。 (從獲得的SSLContext)
嘗試使用OpenSSL的連接到服務器並檢查avaliable密碼套件。 'openssl s_client -connect localhost:443 -CAfile'後請輸出此命令。 –
user1516873
您是否已成功使用此代碼的某種變體使用標準密鑰存儲庫進行連接,或者這是您在SSL連接上的第一個鏡頭? – TheBlastOne
沒有..我沒有進一步追求這一點,因爲由於性能相關的原因,我不得不放棄SSL Streams。我剛剛實現了RSA握手以共享會話密鑰,然後使用AES加密來處理傳輸。與SSL相似。 –